最近项目中需要将pdf转成图片,网上找了各种开源的工具,发觉icepdf用的人比较多。
但是在实际使用过程中,遇到几个问题。
1. 出现jpeg2000的错误:
ImageIO missing required plug-in to read JPEG 2000 images.
You can download the JAI ImageIO Tools from: http://www.oracle.com/technetwork/java/current-142188.html
解决方法:
需要下载jai-imageio-core-1.3.1.jar,jai-imageio-jpeg2000-1.3.0.jar这两个包。
把这两个jar包导入你的项目即可。
我是从Maven下载的:
<repositories>
<repository>
<id>bintray-jai-imageio</id>
<name>jai-imageio at bintray</name>
<url>https://dl.bintray.com/jai-imageio/maven/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-core</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-jpeg2000</artifactId>
<version>1.3.0</version>
</dependency>
</dependencies>
2. 可能是由于使用了BufferedImage,报了out of memory错误:
照着github上icepdf的例子,虽然转换少量pdf的时候没有问题,但是由于我这里转换的pdf比较多,所以out of memory了。
所以需要在BufferedImage使用完以后置null,告诉jvm可以回收资源,并在每次截图完成以后都调用System.gc(); 释放资源。
我的理解:设null是告诉jvm此资源可以回收,System.gc(); 是让系统回收资源,但不一定是回收你刚才设成null的资源,可能是回收其他没用的资源。
icepdf截图的代码如下:
package com.sun.pdfImage;
import java.awt.Graphics;
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.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.PDimension;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
/*
* pdf 转 图片
*/
public class Icepdf {
public static void pdf2Pic(String pdfPath){
File pdf = new File(pdfPath);
if (!pdf.exists()){
System.out.println("pdf截图失败:" + pdfPath + " 不是pdf文件");
return;
}
int dot = pdfPath.lastIndexOf('.');
String imgName = "";
if ((dot >-1) && (dot < (pdfPath.length()))) {
imgName = pdfPath.substring(0, dot) + ".jpg";
File file = new File(imgName);
if (file.exists()){
return;
}
}
else{
System.out.println("pdf截图失败:" + pdfPath + " 没有后缀名");
return;
}
Document document = new Document();
document.setFile(pdfPath);
float scale = 2.5f;//缩放比例
float rotation = 0f;//旋转
for (int i = 0; i < document.getNumberOfPages(); i++) {
if (i>0)
break;
System.out.println("pdf截图Start:" + pdfPath);
try {
Page page = document.getPageTree().getPage(i);
page.init();
PDimension sz = page.getSize(Page.BOUNDARY_CROPBOX, rotation, scale);
int pageWidth = (int) sz.getWidth();
int pageHeight = (int) sz.getHeight();
BufferedImage image = new BufferedImage(pageWidth,
pageHeight,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
page.paint(g, GraphicsRenderingHints.PRINT,
Page.BOUNDARY_CROPBOX, rotation, scale);
g.dispose();
// capture the page image to file
System.out.println("pdf截图:" + imgName);
File file = new File(imgName);
ImageIO.write(image, "jpg", file);
/*BufferedImage image = (BufferedImage)
document.getPageImage(i, GraphicsRenderingHints.SCREEN, org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);
RenderedImage rendImage = image;
int dot = pdfPath.lastIndexOf('.');
if ((dot >-1) && (dot < (pdfPath.length()))) {
String imgName = pdfPath.substring(0, dot) + ".jpg";
System.out.println("pdf截图:" + imgName);
File file = new File(imgName);
ImageIO.write(rendImage, "jpg", file);
}*/
image.flush();
image = null;
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println("icepdf截图Error");
}
}
document.dispose();
document = null;
pdf = null;
System.gc();
}
public static void main(String[] args) {
String filePath = "C:/Users/Administrator/Desktop/30.pdf";
pdf2Pic(filePath);
}
}
如果还是不行,就只能自己增加运行程序的内存了:
java -Xms128m -Xmx2048m -jar TEST.jar