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>
相关推荐
考虑考虑3 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯4 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路8 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还11 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev13 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序18 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏18 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev20 小时前
ButterKnife → ViewBinding
android·java·kotlin
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩1 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构