当前位置: 首页 > 工具软件 > PDFBox > 使用案例 >

【PdfBox】pdfbox解析PDF

西门靖琪
2023-12-01

前言

        有时候会有这样的需求,需要将pdf中的字解析出来,存入库中,查看了一下pdfbox的文档,大概有两种方案。

一、全文解析

        当一个pdf中全是文字并且排列规整的时候,直接全文解析出来就好,以下是全文解析代码:

public String getTextFromPdf() throws Exception {
    String pdfPath = “pdf文件路径”;
    // 开始提取页数
    int startPage = 1;
    // 结束提取页数
    int endPage = Integer.MAX_VALUE;
    String content = null;
    File pdfFile = new File(pdfPath);
    PDDocument document = null;
    try {
        // 加载 pdf文档
        document = PDDocument.load(pdfFile);
        // 获取内容信息
        PDFTextStripper pts = new PDFTextStripper();
        pts.setSortByPosition(true);
        endPage = document.getNumberOfPages();
        System.out.println("Total Page: " + endPage);
        pts.setStartPage(startPage);
        pts.setEndPage(endPage);
        try {
            content = pts.getText(document);
        } catch (Exception e) {
            throw e;
        }
        System.out.println("Get PDF Content ...");
    } catch (Exception e) {
        throw e;
    } finally {
        document.close();
    }
    return content;
}

二、区域解析

        但是当文字排列不规整或者是一些表格类型的pdf的时候,就需要分区域单独去解析pdf,以下是代码:

public String extractFromArea() {
    String pdfPath=”pdf文件路径”;
    //这个四边形所在区域在第四象限, y轴向下为正,x轴向右为正。
    int x = “横坐标”;
    int y = “纵坐标”;
    int width = “宽,也就是横坐标相减”;
    int height = “高,也就是纵坐标相减”;
    String data = "";
    try {
        PDDocument document = PDDocument.load(new File(pdfPath));
        PDFTextStripperByArea stripper = new PDFTextStripperByArea();
        stripper.setSortByPosition(true);
        // 划定区域
        Rectangle2D rect = new Rectangle(x, y, width, height);
        stripper.addRegion("area", rect);
        PDPage page = document.getPage(1);
        stripper.extractRegions(page);
        // 获取区域的text
        data = stripper.getTextForRegion("area");
        data = data.trim();
        document.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return data;
}

三、将扫描出来的PDF输入到txt中

public void toTextFile(String pdfContent, String filePath) {
    try {
    File f = new File(filePath);
        if (!f.exists()) {
            f.createNewFile();
        }
        System.out.println("Write PDF Content to txt file ...");
        BufferedWriter output = new BufferedWriter(new FileWriter(f));
        output.write(pdfContent);
        output.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

总结

        如上解析pdf的代码是pdfbox2.X版本的,之前pdfbox1.X版本区域解析的代码网上很多, 2.X之后版本的我没有搜到,而且1.X和2.X实现相同功能的方法名以及包名改动较大。所以写了这篇博客。和之前老版本也做了对比,旧版本解析的pdf文字位置改变较大,有重叠、错位等现象,新版本这些情况有了很大的改善,建议使用新版本。

 类似资料: