【问题标题】:Read PDF sequentially from left to right rather than co-ordinate based从左到右顺序阅读PDF,而不是基于坐标
【发布时间】:2019-01-31 12:04:07
【问题描述】:

我正在使用 iTextSharp 从 PDF 中提取文本。问题是,如果您在页面中有表格或表单结构,那么提取的文本将变得非结构化,这没有任何意义。示例 PDF 页面如下所示

从 iTextSharp 中提取的文本如下所示

700061
04-01-17
Prepared for: Prepared by:
Filing Instructions

    JACK & JILL  ANDERSON                 WATSON ASSOC
    1234 MAIN STREET                      BENNINGTON STREET
    NEWPORT BEACH, CA  92660              STANFORD, NJ  700049

    2017 U.S. INDIVIDUAL INCOME TAX RETURN

      YOU HAVE A BALANCE DUE OF..........................$         8141

      THIS RETURN HAS BEEN PREPARED FOR ELECTRONIC FILING AND THE PRACTITIONER 
      PIN PROGRAM HAS BEEN ELECTED.  PLEASE SIGN AND RETURN FORM 8879 TO OUR 
      OFFICE.  WE WILL THEN TRANSMIT YOUR RETURN ELECTRONICALLY TO THE IRS.  DO
      NOT MAIL THE PAPER COPY OF THE RETURN TO THE IRS.  RETURN FEDERAL FORM 
      8879 TO US BY APRIL 17, 2018.
    2018 U.S. ESTIMATED INDIVIDUAL INCOME TAX

      ESTIMATED TAX VOUCHERS ARE DUE AS FOLLOWS:
      $      3000  DUE BY  APRIL 17, 2018
      $      2926  DUE BY  JUNE 15, 2018
      $      2852  DUE BY  SEPTEMBER 17, 2018
      $      2426  DUE BY  JANUARY 15, 2019

      INCLUDE YOUR SSN AND THE WORDS "2018 FORM 1040-ES" ON YOUR CHECK.

      MAIL ON OR BEFORE THE DUE DATE TO: INTERNAL REVENUE SERVICE CENTER
                                         P.O. BOX 510000
                                         SAN FRANCISCO, CA  94151-5100







    FORM 1040-V

      PAYMENT SHOULD BE SUBMITTED WITH FORM 1040-V.  INCLUDE YOUR SSN, PHONE 
      NUMBER AND THE WORDS "2017 FORM 1040" ON YOUR CHECK.  MAKE CHECK FOR 
      $8141 PAYABLE TO UNITED STATES TREASURY.

      MAIL BY APRIL 17, 2018 TO:     INTERNAL REVENUE SERVICE CENTER
                                     P.O. BOX 7704
                                     SAN FRANCISCO, CA  94120-7704

这里要注意的是,第一行不是“归档说明”,在文本“准备:”之后的下一行,我们将阅读“JACK & JILL ANDERSON”,而不是“准备者:”。此外,当我们查看 PDF 时,我们会在“JACK & JILL ANDERSON”之后阅读“1234 MAIN STREET”,但在提取的文本中它是“WATSON ASSOC”。

有没有办法像阅读 PDF 文档那样提取文本。

提取文本的代码是

PdfReader pdfReader = new PdfReader(fileName);
PdfDocument doc = new PdfDocument(pdfReader);
for (int pageNo = 1; pageNo <= doc.GetNumberOfPages(); pageNo++)
{
    PdfPage page = doc.GetPage(pageNo);
    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
    string currentText = PdfTextExtractor.GetTextFromPage(page, strategy);
}

【问题讨论】:

  • 根据 PDF 的屏幕截图,第一行是“Foling Instruction”。我假设您没有创建 PDF。这意味着您假设 PDF 将始终保持不变。您最好的选择是提取 PDF 文本的特定部分并使用这些部分来构建文本文件......您将始终遇到当前方式的格式问题(除非您创建了 PDF)
  • 可能至少这个答案会向你解释为什么几乎不可能以一般的方式做你想做的事stackoverflow.com/a/54459279/6663375
  • “有没有办法像我们阅读 PDF 文档一样提取文本。” - 你确定我们都会以同样的方式阅读 PDF 文档吗?也许在看到表格是为“JACK & JILL ANDERSON”准备的之后,我对他们的地址不感兴趣(就像你在之后读到'1234 MAIN STREET'时看起来一样),而是表格准备的实体,即“WATSON ASSOC”,所以也许我会读到它被提取出来......
  • 您可以尝试不同的文本提取策略。您当前使用SimpleTextExtractionStrategy(按内容流中相应文本绘制指令的顺序返回文本)。你可以试试LocationTextExtractionStrategy,它从上到下、从左到右排序。或者来自this answerLayoutTextExtractionStrategy,它还尝试添加足够的空格以使输出类似于PDF 的水平布局。或者其他的。

标签: c# pdf itext


【解决方案1】:

简短回答:

是的(可能)是

长答案:

PDF 不像 word 文档或 HTML 页面。 PDF 文档可以包含结构信息(指示哪些字形组成一行文本,哪些行组成一个段落等)。但规范并没有强制他们这样做。

您在野外发现的大多数 PDF 文档实际上都不包含结构信息。

iText(以及许多其他库)使用简单的启发式方法。他们解析渲染指令,存储它们,并按“逻辑阅读顺序”对它们进行排序。也就是从上到下,从左到右。

当然在这样的文档中,效果比较差。

iText 允许您选择要使用的启发式方法。如果未指定任何内容,则您使用的是SimpleTextExtractionStrategy,它按照指令流中出现的顺序(可能与阅读顺序不同)吐出字形。

正如@mkl 所说,并非每个人都必须以相同的方式阅读文档。 如果您考虑科学论文(脚注、内嵌图形、内嵌表格等)或杂志文章(内嵌引号或 sn-ps),它会变得更加有趣(和复杂)。

我认为您最好尝试像pdf2Data 这样的工具,它是iText 系列的一部分。 它读取输入文档,将其与模板进行匹配,然后以 JSON 格式的可遍历数据结构或简单的 HTML 格式输出信息。

这样,您可以将此文档与模板进行匹配,并决定您首先要提取哪些信息。

【讨论】:

  • "iText(以及许多其他库)使用简单的启发式方法。它们解析渲染指令,存储它们,并按“逻辑阅读顺序”对其进行排序。也就是说,顶部到底部,从左到右。” - OP 似乎使用SimpleTextExtractionStrategy,所以没有排序,只是内容流中各个文本绘制指令的顺序。
  • 请注意,我会相应地更改我的答案。
猜你喜欢
  • 2021-02-09
  • 1970-01-01
  • 2014-08-23
  • 2015-06-20
  • 2016-05-02
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多