Apache PDFBox 与 spire.pdf for java 使用记录
功能内容:抓取指定文件夹内的 pdf 文件,然后提取文件内的内容,获取指定文字,进行处理,然后将该 pdf 转换成JPG 图片
1. 主流程控制
private static final Pattern BARCODE_PATTERN = Pattern.compile("(条形码|条\\s*码)[::]?\\s*(\\d{10,20})");
private static final String OUTPUT_PATH = "D:\\打印\\pdf\\";public static void main(String[] args) {try {//OUTPUT_PATH List<File> pdfFiles = findPDFFiles(OUTPUT_PATH);System.out.println("找到 " + pdfFiles.size() + " 个 PDF 文件:");for (File pdfFile : pdfFiles) {// 提取文本内容String content = extractTextFromPDF(pdfFile);if (!"".equals(content)){// 提取条形码String barcode = extractBarcode(content);// PDF转高质量图像pdfToHighQualityImage(pdfFile, barcode);}}} catch (Exception e) {// 异常处理}
}
2. PDF文件查找与验证
采用**广度优先搜索(BFS)**算法递归查找PDF文件:
PDF有效性验证包括:
- 文件存在性检查
- 非空验证
- 加密状态检测
- 内容可读性验证
public static List<File> findPDFFiles(String directoryPath) {List<File> pdfFiles = new ArrayList<>();LinkedList<File> queue = new LinkedList<>();queue.add(new File(directoryPath));while (!queue.isEmpty()) {File currentDir = queue.removeFirst();File[] files = currentDir.listFiles();if (files != null) {for (File file : files) {if (file.isDirectory()) {queue.add(file); // 子目录入队} else if (file.isFile() && isPDFFile(file)) {pdfFiles.add(file);}}}}return pdfFiles;
}
3. 文本内容提取与条码识别
使用Apache PDFBox进行精准文本提取:
public static String extractTextFromPDF(File pdfFile) {try (PDDocument document = PDDocument.load(pdfFile)) {PDFTextStripper stripper = new PDFTextStripper() {@Overrideprotected void processTextPosition(TextPosition text) {// 直接提取Unicode字符,避免字体问题String unicode = text.getUnicode();if (!unicode.isEmpty() && !unicode.matches("\\s")) {writeString(unicode);}}};stripper.setSortByPosition(true);return cleanExtractedText(stripper.getText(document));} catch (Exception e) {return "";}
}
4. PDF转高质量图像
使用Spire.PDF库实现高DPI图像转换:
public static void pdfToHighQualityImage(File pdfFile, String fileName) {PdfDocument pdf = new PdfDocument();pdf.loadFromFile(pdfFile.getPath());// 设置150 DPI分辨率//多页pdf 转 多页jpg// for (int i = 0; i < pdf.getPages().getCount(); i++) {// BufferedImage image = pdf.saveAsImage(i, PdfImageType.Bitmap,500,500);// }BufferedImage image = pdf.saveAsImage(0, PdfImageType.Bitmap, 150, 150);// 保存为PNG避免CMYK色域问题ImageIO.write(image, "PNG", new File(OUTPUT_PATH + fileName + ".png"));pdf.close();
}
PDF文本精确定位:
- 通过重写
processTextPosition
方法直接获取Unicode字符 - 设置
setSortByPosition(true)
保持原始布局
- 通过重写
图像质量保证:
- 使用PNG格式避免JPEG压缩失真
- 设置150DPI保证打印质量
- 处理CMYK色域问题
性能优化:
- BFS遍历提高文件搜索效率
- 流式操作(TRY-WITH-RESOURCES)自动释放资源
- 按需加载PDF页面
maven
// Apache PDFBox
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version>
</dependency> // Spire.PDF
<repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url></repository>
</repositories><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>4.4.1</version>
</dependency>