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>
相关推荐
程序员泠零澪回家种桔子14 分钟前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
CodeCaptain23 分钟前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
Anastasiozzzz1 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人1 小时前
通过脚本推送Docker镜像
java·docker·容器
铁蛋AI编程实战2 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘2 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays10112 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
摇滚侠2 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.2 小时前
java多态
java·开发语言·c++
李堇2 小时前
android滚动列表VerticalRollingTextView
android·java