Apache PDFBox 与 spire.pdf for java 使用记录

功能内容:抓取指定文件夹内的 pdf 文件,然后提取文件内的内容,获取指定文字,进行处理,然后将该 pdf 转换成JPG 图片

1. 主流程控制

java 复制代码
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有效性验证包括:

  • 文件存在性检查
  • 非空验证
  • 加密状态检测
  • 内容可读性验证
java 复制代码
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进行精准文本提取

java 复制代码
public static String extractTextFromPDF(File pdfFile) {
    try (PDDocument document = PDDocument.load(pdfFile)) {
        PDFTextStripper stripper = new PDFTextStripper() {
            @Override
            protected 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图像转换

java 复制代码
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

java 复制代码
// 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>
相关推荐
腻害兔23 分钟前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影1 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121312 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔2 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
蜡台3 小时前
uniapp pdf文件预览组件
pdf·uni-app·合同·pdfh5
CRMEB系统商城3 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience4 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
weixin_408099674 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
钱六两5 小时前
#3、SpringAI 接入deepSeek大模型(喂饭版)
java·spring boot·ai编程
null_176 小时前
IntelliJ IDEA 极致流畅配置方案:Ultra 9 285K + 64GB 内存实测
java·ide·intellij-idea