php和java混合编程 pdf_pdf转图片,php语言和Java语言的两种方法

因项目的需求,需要预览文件,如果直接使用各种渲染插件预览pdf,兼容性太差,不同浏览器,不同终端,以及版本,问题太多,转换思路,文档转图片,那么兼容性问题就不存在了,大致思路如下

1. 各种不同文档转换为pdf文档,java环境下使用JODConverter+openoffice,可以完成该操作,网上已经有很多教程讲解,不懂Java语言的也可以轻松使用,安装好这些环境之后,再php代码中使用exec命令调用即可,

类似的文章还有很多,遇到相关问题都可以找到解决方案,

2. 通过上一步已经把所有文档转换为pdf格式文件,接下来就是把pdf转成我们想要的图片,首先我通过参考相关案列,使用php的imagick扩展进行处理这个问题,imagick扩展安装参考:https://blog.csdn.net/young_phper/article/details/70614659

上代码:

/*** Notes:pdf转图片 正在使用方法* @param $PDF 破地方文件路径* @param $Path 图片储存路径* @return array|bool|string 成功返回一个数组 包含转换成功之后图片的完整路径* @throws \ImagickException*/

public static function pdf2png1($PDF,$Path){

set_time_limit(0);

if(!extension_loaded('imagick')){

return false;

}

$IM = new \imagick();

try{

$IM->setResolution(120,120);

$IM->setCompressionQuality(100);

$IM->readImage($PDF);

foreach ($IM as $Key => $Var){

//做了处理 页数超过25 只生成前25张图片 根据自己需要进行修改 if($Key>24){

break;

}

$Var->setImageFormat('png');

$Filename = $Path.'/'.md5($Key.time()).'.png';

if($Var->writeImage($Filename) == true){

$Return[] = $Filename;

}

}

return $Return;

} catch (\Exception $e){

return $e->getMessage();

}

}

经测试,通过上述代码可以成功转换大部分文件,但是有部分文件因其他原因有可能转换失败,而且如果文件较大,则转换过程会消耗大量内存,如果服务器配置较低的话,可能导致服务器服务暂时瘫痪,所以该方法只适合转换少量文件,

作为一个功能来使用是可以的,如果作为核心来转换大量文件是不可取的,那么我们只能另寻他法了

3.经过一段时间查找,找到了一种方法(类似方法还有很多,基本都是依赖于非php语言,对于一个php程序原来说可能是一件痛苦的事),java+IcePDF包,

下面稍加改动的代码:

import java.awt.image.BufferedImage;

import java.awt.image.RenderedImage;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

import org.icepdf.core.pobjects.Document;

import org.icepdf.core.util.GraphicsRenderingHints;

public class pdfImage {

public static void main(String[] args) {

String name = args[0];

String filePath = args[1];

Document document = new Document();

document.setFile(filePath);

float scale = 1.0f;

float rotation = 0f;

File dirFile = new File(args[2]);

//自动创建目录 存在目录结束运行 根据自己需要进行修改if (!dirFile.exists()) {

dirFile.mkdir();

} else {

return;

}

//做了处理 大于25页的只转换25页int pdfpages=document.getNumberOfPages();

int pdfpagenum;

if (pdfpages>25) {

pdfpagenum=25;

} else {

pdfpagenum=pdfpages;

}

for (int i = 0; i < pdfpagenum; i++) {

BufferedImage image = (BufferedImage) document.getPageImage(i,

GraphicsRenderingHints.SCREEN,

org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation,

scale);

RenderedImage rendImage = image;

try {

File file = new File(args[2] + "/" + name + "_" + (i + 1)

+ ".png");

ImageIO.write(rendImage, "png", file);

} catch (IOException e) {

e.printStackTrace();

}

image.flush();

}

document.dispose();

System.out.println("finish");

}

}

4.因为对java语言一点都不了解,所以再编译以及运行的时候踩了很多坑,这里详细说明一下,主要还是记录给非java程序员一个参考;

1复制以上代码 新建名为pdfImage.java的文件

1.1编译,进入存放pdfImage.java的目录,运行javac -classpath "/var/java/lib/*" pdfImage.java

(/var/java/lib/*) lib目录下存放的是IcePDF的包文件 可以通过上文链接下载,改成你存放的目录地址即可,一般放在pdfImage.java同级目录,方便使用 通过该命令就可以成功编译Java文件 会在同级目录生成一个pdfImage.class的类文件

1.2运行,java -classpath ".:/var/java/lib/*" pdfImage 参数一 参数二 参数三

如果运行是在当前类文件的地址 可直接运行,不在当前文件,可以使用&&连接命令 先进入类文件所在 在执行(肯定有更好办法,但是作为一个php程序员来说已经够了)

如 cd /var/java/lib/ && java -classpath ".:/var/java/lib/*" pdfImage 参数一 参数二 参数三

参数解释://执行shell 命令 后面三个参数分别是带生成图片前缀名称,pdf绝对路径,带生成图片储存路劲 父级目录自动创建, 图片存储的父级文件是自动创建,如果已经存在,会导致转换失败,这个可以修改java代码取消,代码其实很多都是可以看懂的,都可以根据自己的需要修改,到此,基本上整个转换就结束了 ,

最后上传一张转换截图 该截图是在win系统下操作的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值