Java 类 PDF2Image
在包 com.oncloudsoft.zbznhc.common.util.pdf
中是用来将 PDF 文件转换为图像的。它使用了 Apache PDFBox 库来处理 PDF 文档并生成图像。下面是类中每个部分的详细解释:
类和方法说明
- 类
PDF2Image
:
- 使用了 Lombok 库的
@Slf4j
注解,这会为类自动生成一个日志记录器(logger),可以用来记录信息、错误等。 - 提供了两个重载的
pdf2Image
方法,用于处理 PDF 到图像的转换。
- 方法
pdf2Image(String file, String targetFolder)
:
- 接受 PDF 文件的路径和目标文件夹路径作为参数。
- 打印日志信息。
- 调用另一个重载的
pdf2Image
方法来执行转换。
- 方法
pdf2Image(File file, String targetFolder)
:
- 接受
File
对象和目标文件夹路径作为参数。 - 使用
PDDocument.load
加载 PDF 文件,并设置内存使用设置为仅使用临时文件。 - 获取 PDF 文档的总页数。
- 使用
PDFRenderer
类来渲染 PDF 页面为图像。 - 逐页渲染 PDF,并将渲染后的图像保存为 JPG 格式的文件。
- 图像的文件名基于原始 PDF 文件名,并附加页码和
.jpg
后缀。 - 处理完所有页面后,返回包含生成的图像文件路径的列表。
- 异常处理:
- 捕获并记录
InvalidPasswordException
和IOException
异常。
- 主方法
main(String[] args)
:
- 用于测试
pdf2Image
方法。 - 记录并打印转换过程所需的时间。
功能
该类主要用于将 PDF 文件转换为一系列的 JPG 图像,每页一个图像。这在需要将 PDF 文档的内容以图像形式展示或处理时非常有用,如在网页上显示 PDF 页面的预览图。
使用 Apache PDFBox
Apache PDFBox 是一个开源的 Java 工具,用于处理 PDF 文档。这个类利用 PDFBox 提供的功能来渲染和保存 PDF 页面作为图像。
注意事项
- 需要确保 Apache PDFBox 库已被添加到项目依赖中。
- 方法中使用了硬编码的 DPI(每英寸点数)和 JPG 图像质量设置,这可能需要根据实际需求进行调整。
- 生成的 JPG 文件将保存在指定的目标文件夹中。
package com.oncloudsoft.zbznhc.common.util.pdf;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class PDF2Image {
private static final int PAGE_SIZE = 50;
/**
* 提取
* @param file PDF文件
* @param targetFolder 图片存放目录
* @return
*/
public static ArrayList<String> pdf2Image(String file, String targetFolder) {
log.info("PDF2Image中,file为:"+file);
return pdf2Image(new File(file), targetFolder);
}
/**
* 由于apache-pdfbox版本升级到2.0.18, 部分api不兼容,覆盖旧版本pdf2Image方法
* @param file pdf文件
* @param targetFolder 图片保存文件夹路径
*/
public static ArrayList<String> pdf2Image(File file, String targetFolder) {
ArrayList<String> list = new ArrayList<>();
String prex = file.getName().split("\\.")[0];
try (
PDDocument document = PDDocument.load(file, MemoryUsageSetting.setupTempFileOnly());
) {
int pages = document.getNumberOfPages();
PDFRenderer renderer = new PDFRenderer(document);
int k = 0;
int count = 1;
List<BufferedImage> imageList = new ArrayList<>(PAGE_SIZE);
for (;;) {
int startPage = k * PAGE_SIZE;
int endPage = startPage + PAGE_SIZE > pages ? pages : startPage + PAGE_SIZE;
k++;
imageList.clear();
for (int i = startPage; i < endPage; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, 150);
// imageList.add(image);
String imgPath = targetFolder + File.separator + prex + "_" + (count++) + ".jpg";
ImageIOUtil.writeImage(image, imgPath, 200);
list.add(imgPath);
}
if (endPage == pages) break;
}
return list;
} catch (InvalidPasswordException e) {
log.error("", e);
} catch (IOException e) {
log.error("", e);
}
return list;
}
public static void main(String[] args) throws IOException {
long s = System.currentTimeMillis();
String file = "/home/sunyuhua/test/1+2.pdf";
String folder = "/home/sunyuhua/test/jpg";
pdf2Image(file, folder);
System.out.println("耗时: " + (System.currentTimeMillis() - s));
}
}