PdfReaderContentParser.ProcessContent返回空白以获取明文

时间:2015-11-30 08:58:22

标签: itextsharp pdf-parsing

我想为包含二进制和明文数据的文本解析pdf。当我尝试使用PdfReaderContentParser时,GetResultantText方法返回二进制内容的正确文本,但是为明文内容返回空格。这是我使用的代码:

        byte[] binaryPdf = File.ReadAllBytes(this.fileName);
        reader = new PdfReader(binaryPdf);

        PdfReaderContentParser parser = new PdfReaderContentParser(reader);

        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            SimpleTextExtractionStrategy simpleStragety = parser.ProcessContent(i, new SimpleTextExtractionStrategy());
            string contentText = simpleStragety.GetResultantText();

            // Do something with the contentText
            // ...
        }

知道如何获取所有内容吗?

1 个答案:

答案 0 :(得分:3)

概述

在评论中,OP澄清了他在提取的文本中缺少哪些文本:

  

基本上对于左侧的所有描述(例如提升时刻),我得到空格而不是实际文本。

原因很简单:在页面内容中,左侧大部分区域只有空格(如果有的话)。您看到的标签实际上是只读表单字段。

例如&#34;提升时刻&#34;是表单字段default to: Subscriber.all.collect(&:email).join(",") 的值。

如果您希望文本提取也包含这些字段,您应该考虑在第一步中展平文档(将字段外观移动到常规页面内容流中)并从此展平文档中提取文本。

文件分析

看起来规范标签国际化的主要部分是使用表单字段完成的。

概述我将原始文件分开

original document

进入常规页面内容

page content

和表单字段

page fields

表单字段下的页面内容确实有几个空格字符串。

假设曾经有一个该文档的早期版本(或其模板),其中包含这些标签(可能只有一种语言或两种语言)作为页面内容。

然后有一个更加动态的国际化的任务,所以有人用空格替换了页面内容中的现有标签,并添加了新的国际化标签作为只读表单字段,可能是因为表单字段更容易操作。

考虑到原始标签似乎已被相同数量的空格所取代,但有人可能推测甚至还有另一个程序在硬编码偏移处操纵此类和类似文档的页面流,并且为了在国际化过程中不破坏该程序,必须在页面内容之外创建实际标签。发生了奇怪的事情......

展平并提取

如上所述,如果您希望文本提取也包含这些字段,则应考虑在第一步中展平文档(将字段外观移动到常规页面内容流中)并从此展平文档中提取文本。这可以这样做:

13B141032

结果StandardOutput:

[Test]
public void ExtractFlattenedTextTestSeeb()
{
    FileInfo file = new FileInfo(@"PATH_TO_FILE\41851208.pdf");
    Console.Out.Write("41851208.pdf, flattened before extraction\n\n");

    using (MemoryStream memStream = new MemoryStream())
    {
        using (PdfReader readerOrig = new PdfReader(file.FullName))
        using (PdfStamper stamper = new PdfStamper(readerOrig, memStream))
        {
            stamper.Writer.CloseStream = false;
            stamper.FormFlattening = true;
        }
        memStream.Position = 0;
        using (PdfReader readerFlat = new PdfReader(memStream))
        {
            PdfReaderContentParser parser = new PdfReaderContentParser(readerFlat);

            for (int i = 1; i <= readerFlat.NumberOfPages; i++)
            {
                SimpleTextExtractionStrategy simpleStragety = parser.ProcessContent(i, new SimpleTextExtractionStrategy());
                string contentText = simpleStragety.GetResultantText();

                Console.Write("Page {0}:\n\n{1}\n\n", i, contentText);
            }
        }
    }
}

如你所见,&#34;提升时刻&#34;现在还有所有其他缺失的标签。