当前位置: 首页 > web >正文

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();
}
  1. PDF文本精确定位

    • 通过重写processTextPosition方法直接获取Unicode字符
    • 设置setSortByPosition(true)保持原始布局
  2. 图像质量保证

    • 使用PNG格式避免JPEG压缩失真
    • 设置150DPI保证打印质量
    • 处理CMYK色域问题
  3. 性能优化

    • 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>

    http://www.xdnf.cn/news/20171.html

    相关文章:

  • 软件架构师全方位工具图谱
  • Java全栈开发面试实战:从基础到高并发的深度解析
  • 【数学建模学习笔记】机器学习回归:决策树回归
  • 无人机信号防干扰技术难点分析
  • 企业白名单实现【使用拦截器】
  • 梯度爆炸问题:深度学习中的「链式核弹」与拆弹指南
  • 嵌入式学习 51单片机(3)
  • (自用)cmd常用命令自查文档
  • 大语言模型基础-Transformer之上下文
  • (计算机网络)TCP 粘包与拆包
  • STM32传感器模块编程实践(十五)DIY语音对话控制+满溢检测智能垃圾桶模型
  • Selenium 超时完全指南:pageLoadTimeout、implicitlyWait 和 scriptTimeout 的深度解析
  • NineData发布 Oracle 到 MySQL 双向实时复制,助力去 O 战略与数据回流
  • 小迪安全v2023学习笔记(七十七讲)—— 业务设计篇隐私合规检测重定向漏洞资源拒绝服务
  • ⸢ 肆 ⸥ ⤳ 默认安全建设方案:b.安全资产建设
  • 【C++】16. set和map
  • 苍穹外卖优化过程遇到的问题
  • APM32芯得 EP.33 | 基于APM32E030解读APM库的高速时钟配置
  • 【LeetCode热题100道笔记】轮转数组
  • 解锁桐果云零代码数据平台能力矩阵——赋能零售行业数字化转型新动能
  • AHP层次分析法在水利中的实践技术应用
  • Stylar AI: 基于AI的平面设计工具
  • 【软件测试】第1章 认识测试
  • Docker Compose 与 Kubernetes 全面对比
  • 远场代码学习_FDTD_farfield
  • HDFS机架感知、副本存放机制详解(附源码地址)
  • 智慧油站新机遇:一款加油小程序如何让生意“加油”提速?
  • Redis、Zookeeper 与关系型数据库分布式锁方案对比及性能优化实战指南
  • NV 工具metrics分析(ncu, nsys/torch profiler)
  • 秒出PPT vs 豆包AI PPT:实测哪款更好用?