最近项目中需要将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
PDF转图片实战
本文介绍使用icepdf将PDF文件转换为图片的过程,包括解决jpeg2000错误的方法及如何避免outofmemory错误,提供了具体的代码示例。
1971

被折叠的 条评论
为什么被折叠?



