当前位置: 首页 > 知识库问答 >
问题:

按列提取PDF文本

袁博
2023-03-14

我的问题是:

如何从按列划分的PDF文件中提取文本,以获得由该列分隔的结果?

背景:我从事一个关于文本分析(尤其是科学文本)的项目。这些文本有时以多列布局发布,每列都有单独的页码。要按布局页码对提取的文本进行排序,按列提取文本会很有用。

我使用pdfBox并尝试/搜索了以下内容:

  • 我尝试了类的getThreadBeads()方法-

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

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

所以问题又来了:

  • PDFTextStripper如何计算列分隔符
  • pdfBox API中是否有方法捕获此内容/按列提取文本
  • 这在其他pdf api中是否可行

提前谢谢

共有2个答案

程修雅
2023-03-14

结合@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);


    }
傅朗
2023-03-14

如果我将PDFTextStripper的setSortByPosition()设置为true,则页面的所有符号都设置在一行中,而不识别单独的列。但如果我将setSortByPosition()设置为false,则剥离器将执行此除法。

[...] PDFTextStripper如何计算列分隔符?

它不是。

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

在您的文档中,文本片段似乎是按照阅读顺序绘制的,即逐列绘制。并非所有文档都是如此,为了应对其他文档,PDFBox提供了从左到右、从上到下对文本片段进行排序的选项。

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

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

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

 类似资料:
  • 问题内容: 我需要使用iText从pdf文件中提取文本。 问题是:一些pdf文件包含2列,当我提取文本时,我得到一个文本文件,其中的列作为结果合并(即同一行中两列的文本) 这是代码: 你能帮我完成这个任务吗? 问题答案: 我是iText文本提取子系统的作者。您需要做的是开发自己的文本提取策略(如果您看一下如何实现的话,就会发现您可以提供可插拔的策略)。 您将如何确定列的开始和停止位置完全取决于您-

  • 以下是从PDF中提取内容和元数据的程序。 import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import o

  • 问题内容: 我想知道是否可以仅使用Javascript将文本包含在PDF文件中?如果是,谁能告诉我如何? 我知道有一些服务器端的Java,C#等库,但我宁愿不使用服务器。谢谢 问题答案: 这是一个古老的问题,但是由于pdf.js多年来一直在发展,所以我想给出一个新的答案。也就是说,它可以在本地完成,而无需涉及任何服务器或外部服务。新的pdf.js具有一个函数:page.getTextContent

  • 假设我的用户去了他们办公室的扫描仪。扫描仪能够生成扫描文档的PDF。这基本上就是我拥有的文件类型。 我想做的是从这个PDF中提取文本。这不是“第一代”pdf,因为文本没有嵌入到pdf中。文本嵌入在PDF中的图像中。 PDFBox的iText中是否有允许检索此数据的功能?如果可能的话,我正在尝试避免对图像进行OCR。我希望IText或PDFBox中有一些内置的东西可以做到这一点。 请注意,我不是在谈

  • 问题内容: 我正在尝试使用提取此 PDF文件中包含的文本。 我正在使用PyPDF2模块,并具有以下脚本: 运行代码时,得到以下输出,该输出与PDF文档中包含的输出不同: 如何提取PDF文档中的文本? 问题答案: 要从PDF提取文本,请使用以下代码

  • 问题内容: 如何 使用PHP 从PDF文档中提取文本? (我不能使用其他工具,我没有root用户访问权限) 我发现一些函数可用于纯文本,但是它们不能很好地处理Unicode字符: http://www.hashbangcode.com/blog/zend-lucene-and-pdf-documents-part-2-pdf- data-extraction-437.html 问题答案: 下载 c