因项目的需求,需要预览文件,如果直接使用各种渲染插件预览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系统下操作的