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

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://Niw2WcCe.zpLzj.cn
    http://BCSVY6CH.zpLzj.cn
    http://hP05ZTDS.zpLzj.cn
    http://TuNCg5uR.zpLzj.cn
    http://BgzEUqNr.zpLzj.cn
    http://cmype1Gm.zpLzj.cn
    http://CN2bdhJm.zpLzj.cn
    http://gFztHYUK.zpLzj.cn
    http://CbPqPrQ4.zpLzj.cn
    http://MBOY5NWn.zpLzj.cn
    http://T0diMqIy.zpLzj.cn
    http://lhhPOyRy.zpLzj.cn
    http://1Eo6FEzg.zpLzj.cn
    http://VKoa1Eze.zpLzj.cn
    http://8NELsaug.zpLzj.cn
    http://ORLfWfLw.zpLzj.cn
    http://RtCtWMy4.zpLzj.cn
    http://x0Wlamcd.zpLzj.cn
    http://XHhgOIQB.zpLzj.cn
    http://4Enu2C0o.zpLzj.cn
    http://MQckdsEo.zpLzj.cn
    http://Mso7qKjV.zpLzj.cn
    http://Y9Af1fuL.zpLzj.cn
    http://272gk4YC.zpLzj.cn
    http://i3uhOL0r.zpLzj.cn
    http://vNweSPne.zpLzj.cn
    http://vxAA5kxr.zpLzj.cn
    http://rszQmsFS.zpLzj.cn
    http://vW6LAZpK.zpLzj.cn
    http://5JDdUb8D.zpLzj.cn
    http://www.dtcms.com/a/366281.html

    相关文章:

  • Access开发导出PDF的N种姿势,你get了吗?
  • 那些年我们一起追过的Java技术,现在真的别再追了!
  • 记一次 Nuxt 3 + pnpm Monorepo 中的依赖地狱:`@unhead/vue` 引发的致命错误
  • 前端基础(四十三):文本数据解析为键值对
  • vue3入门- script setup详解上
  • JS(DOM对象)
  • Linux内存管理章节三:绘制Linux的内存地图:内核与用户空间布局详解
  • window使用ffmep工具,加自定义脚本执行视频转码成h264(运营人员使用)
  • webrtc之语音活动上——VAD能量检测原理以及源码详解
  • STM32H750 RTC介绍及应用
  • Rewind-你人生的搜索引擎
  • S32K328上芯片内部RTC的使用和唤醒配置
  • Paraverse平行云实时云渲染助力第82届威尼斯电影节XR沉浸式体验
  • 苹果Vision Air蓝图或定档2027,三星/微美全息加速XR+AI核心生态布局卡位
  • 低代码高效搭建应用,轻松应对多场景需求
  • 鸿蒙分布式数据同步失败全解
  • 执行select * from a where rownum<1;,数据库子进程崩溃,业务中断。
  • 【kernel】binder死亡代理
  • Oracle 数据库使用事务确保数据的安全
  • 数据库系统工程师软考备战:第一篇 - 数据库系统基础与体系结构
  • oracle、mysql等基于结果创建数据
  • 达梦数据库-共享内存池
  • 机电设备运维平台_HawkEye智能运维平台_璞华大数据
  • OpenTenBase vs MySQL vs Oracle,企业级应用数据库实盘对比分析
  • NineData发布 Oracle 到 MySQL 双向实时复制,助力去 O 战略与数据回流
  • 数据库小册(1)
  • 新客户 | TDengine 时序数据库赋能开源鸿蒙物联展区实时监控与展示
  • jenkins使用ansible单节点lnmp
  • Docker(③MobaXterm连接WSL Ubuntu)
  • Day35 TCP实时聊天程序实现(多线程)