前言:最近开发需要将pdf转图片,我用到两种方法进行转换
方法一: 通过BufferedImage进行pdf转换,
实现:Windows下正常转换,Linux下出现异常报错
展示效果:图片较模糊
Levigo JBIG2 image library was not found on classpath
2022-02-23 13:34:30.357 ERROR 1 --- [io-10000-exec-5] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/xiolift/service/wechat/ce] threw exception [Handler dispatch failed; nested exception is java.lang.ExceptionInInitializerError] with root cause
Windows环境下pdf转图片效果图如下:
代码如下:
@SneakyThrows
public String pdfToPic(HttpServletResponse httpServletResponse, String filePath,String picPath) {
log.info("pdf转图片前的地址filePath:" + filePath);
log.info("pdf转图片后应该存放的地址picPath:" + picPath);
Document document = new Document();
document.setFile(filePath);
float scale = 1.5f;//缩放比例
float rotation = 0f;//旋转角度
for (int i = 0; i < document.getNumberOfPages(); i++) {
log.info("pdf转图片的页数:" + document.getNumberOfPages());
// 如果还有问题将初始化改成数字,不要用下述的描述
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("D:\\土测文件\\土建转图片" + i + ".png");
// 单张图片转换
File file = new File(picPath);
ImageIO.write(rendImage, "png", file);
} catch (IOException e) {
e.printStackTrace();
}
image.flush();
}
document.dispose();
return picPath;
}
方法二:通过PDFRenderer进行转换
实现:Windows下正常转换,Linux下正常转换
展示效果:图片清晰
Windows和Linux环境下pdf转图片效果图如下:
代码如下:
@SneakyThrows
@Override
public String changePdfToPic(HttpServletResponse httpServletResponse, String filePath,String picPath) {
log.info("pdf转图片前的地址filePath:" + filePath);
log.info("pdf转图片后应该存放的地址picPath:" + picPath);
// 输入流
InputStream in = null;
PDDocument doc = null;
try {
in = new FileInputStream(filePath);//可以从本地文件中读取流 也可以从网络中读取
doc = PDDocument.load(in);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
BufferedImage image = renderer.renderImageWithDPI(i,200f); // Windows native
// DPI,PdfExchangeDpi是float类型的,越大文件越大,清晰度越高,
File file = new File(picPath);
if (!file .exists()) {
file .mkdirs();
}
ImageIO.write(image, "PNG", file);
}
} finally {
if (in != null) {
in.close();
}
if (doc != null) {
doc.close();
}
}
return picPath;
}