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>
相关推荐
没有bug.的程序员5 小时前
Redis 数据结构全面解析:从底层编码到实战应用
java·数据结构·redis·wpf
小蒜学长5 小时前
大学园区二手书交易平台(代码+数据库+LW)
java·数据库·spring boot·后端
邂逅星河浪漫6 小时前
【机器学习】HanLP+Weka+Java=Random Forest算法模型
java·spring boot·机器学习·weka·random forest
yinke小琪6 小时前
分库分表后,主键 ID 如何优雅生成?
java·后端·面试
焯7596 小时前
若依微服务遇到的配置问题
java·mybatis·ruoyi
wuxuanok6 小时前
Spring Boot 全局异常处理问题分析与解决方案
java·spring boot·后端
SunnyDays10116 小时前
Java 攻克 PDF 表格数据提取:从棘手挑战到自动化实践
java·提取pdf表格·读取pdf表格数据·pdf表格转csv·导出pdf表格为csv
初学小白...6 小时前
泛型-泛型方法
java·开发语言
LQ深蹲不写BUG7 小时前
深挖三色标记算法的底层原理
java·算法