按列提取PDF文本

时间:2014-10-07 09:59:55

标签: pdf pdfbox

我的问题是:

如何从PDF文件中提取文本,该文件按列分割,以此方式将结果分隔为此列?

背景: 我正在开展一个关于文本分析(特别是科学文本)的项目。 这些文本有时以多个列布局发布,每列给出一个单独的页码。 要通过有层次的页面编号来对提取的文本进行排序,按列提取文本会很有用。


我使用 pdfBox 并尝试/搜索了几件事:

  • 我尝试了getThreadBeads()类的PDPage方法 - >结果:0大小的列表
  • 我尝试使用getCharactersByArticle()方法抓取文字 - >文字未分列于 (我尝试使用已发布文本的pdf文件以及基于自创的.doc文件,每个文件都有多列布局)

问题是pdfBox似乎自动按列分割文本: 如果我将setSortByPosition()设置为PDFTextStripper,则页面中的所有符号都会在一行中设置,而不会识别单独的列。 但是,如果我将setSortByPosition()设置为false,则剥离器正在进行此分割。

为此我查看了pdfBox源代码: 关键方法是PDFTextStripper的writePage()方法。 这里显然计算了空间(在大多数pdf中没有给出)和换行符。 但我无法找到Stripper如何计算柱断裂。

再次提出问题:

  • PDFTextStripper如何计算列?
  • pdfBox API中是否有方法来捕获/按列提取文本?
  • 这可以与其他pdf-api一起使用吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

  

如果我将PDFTextStripper的setSortByPosition()设置为true,则页面的所有符号都会在一行中设置,而不会识别单独的列。但是如果我在false上设置setSortByPosition(),那么剥离器正在进行这种划分。

     

[...] PDFTextStripper如何计算列中断?

不是。

通过将SortByPosition设置为false,您告诉PDFBox 尝试对页面内容流中的文本片段进行排序,而是按照它们出现的顺序接受它们。

在您的文档中,文本片段似乎是按阅读顺序绘制的,即逐列。对于所有文档都不是这样,并且为了处理其他文档,PDFBox提供了从左到右,从上到下排序文本片段的选项。

在文档中激活该选项(将SortByPosition设置为true)会返回不考虑列的文本。

  

pdfBox API中是否有方法来捕获/按列提取文本?

PDFBox不会分析页面内容以识别列。但是,如果进行分析,如果将列矩形作​​为规则提供,则可以逐列提取文本。

答案 1 :(得分:0)

结合@mkl的答案,我使用PDFbox完成了按列的文本提取。

我发现两列边界的方法一直在不断尝试。 =:

    StringBuilder pdfText = new StringBuilder();
    PDFTextStripperByArea stripper = new PDFTextStripperByArea();

    stripper.setSortByPosition(true);

    Rectangle rectLeft = new Rectangle(10, 60, 320, 820);

    Rectangle rectRight = new Rectangle(330, 60, 320, 820);

    stripper.addRegion("leftColumn", rectLeft);

    stripper.addRegion("rightColumn", rectRight);

    PDPageTree allPages = document.getDocumentCatalog().getPages();
    int pageNumber = document.getNumberOfPages();


    String leftText = "";
    String rightText = "";

    for (int i = 0; i < pageNumber; i++) {

        PDPage page = (PDPage) allPages.get(i);

        stripper.extractRegions(page);
        leftText = stripper.getTextForRegion("leftColumn");
        rightText = stripper.getTextForRegion("rightColumn");

        pdfText.append(leftText);
        pdfText.append(rightText);


    }