c# - 从左到右顺序阅读PDF,而不是基于坐标
问题描述
我正在使用 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 不像 Word 文档或 HTML 页面。PDF 文档可以包含结构信息(指示哪些字形组成一行文本,哪些行组成一个段落等)。但规范并没有强制他们这样做。
您在野外发现的大多数 PDF 文档实际上都不包含结构信息。
iText(以及许多其他库)使用简单的启发式方法。他们解析渲染指令,存储它们,并按“逻辑阅读顺序”对它们进行排序。也就是说,从上到下,从左到右。
当然,在这样的文件中,效果是相当差的。
iText 确实允许您选择要使用的启发式方法。如果未指定任何内容,则您使用SimpleTextExtractionStrategy
which 按照指令流中出现的顺序(可能与阅读顺序不同)吐出字形。
然而,正如@mkl 所说,并非每个人都必须以相同的方式阅读文档。如果您考虑科学论文(脚注、内嵌图形、内嵌表格等)或杂志文章(内嵌引号或片段),它会变得更加有趣(和复杂)。
我认为您最好尝试使用pdf2Data
iText 系列中的 . 它读取输入文档,将其与模板进行匹配,然后以 JSON (如可遍历的数据结构)或简单的 HTML 形式输出信息。
这样,您可以将此文档与模板进行匹配,并决定首先要提取哪些信息。
推荐阅读
- excel - 过滤无格式的电子邮件信息
- reactjs - 页面上的对话框导致在 chrome 扩展中禁用文本框/选择
- python-3.x - 从 Makefile 错误 python3 不是目录运行 python 脚本
- excel - 使用具有属性的 XML 元素将 Excelsheet 转换为 XML 文件
- flutter - Dart 错误:错误:使用 Flutter 2.0.2 的当前 Dart 运行时不支持导入 dart:mirrors
- c# - 从通用项中选择一个属性参数(函数)
- javascript - 如何通过 ga readycallback 使用 Google 的 recaptcha 服务
- java - 没有找到合适的云连接器 IntelliJ 与在 Eclipse 中工作时出错
- python - 对列进行标记后,获取特定单词前后的 2 个单词
- python - 如何在 Python 的不同机器上找到相同的文件夹?