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

发布于:2025-09-07 ⋅ 阅读:(16) ⋅ 点赞:(0)

功能内容:抓取指定文件夹内的 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() {
            @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图像转换

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>


    网站公告

    今日签到

    点亮在社区的每一天
    去签到