我正在使用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
这里要注意的是第一行不是“提交说明”,而在文本“准备为:”之后的下一行中,我们将读为“杰克和吉尔·安德森”,而不是“准备者:”。同样,当我们查看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);
}
答案 0 :(得分:2)
简短答案:
是的(可能)是
长答案:
PDF与Word文档或HTML页面不同。 PDF文档可以包含结构信息(指示哪些字形构成文本行,哪些线构成段落等)。但是规范并没有强迫他们这样做。
您在野外发现的大多数PDF文档实际上都不包含结构信息。
iText(以及许多其他库)使用简单的启发式方法。他们解析渲染指令,存储它们,然后按照“逻辑阅读顺序”对其进行排序。也就是说,从上到下,从左到右。
当然,在这样的文档中,效果相当差。
iText确实允许您选择要使用的启发式。如果未指定任何内容,则您正在使用SimpleTextExtractionStrategy
,它按照指令流中出现的顺序吐出字形(可能与读取顺序不同)。
但是,正如@mkl所说,并非每个人都必须以相同的方式阅读文档。 如果您考虑科学论文(脚注,内联图形,内联表等)或杂志文章(内联引号或摘录),它会变得更加有趣(且复杂)。
我认为您最好尝试使用pdf2Data
之类的工具,该工具属于iText系列。
它会读取输入文档,将其与模板进行匹配,然后以可遍历数据结构之类的JSON或简单地以HTML的形式吐出信息。
这样,您可以将该文档与模板进行匹配,并确定要首先提取的信息。