【问题标题】:Why am I getting duplicate pages extracted from iText7 C#?为什么我会从 iText7 C# 中提取重复页面?
【发布时间】:2021-03-04 00:57:24
【问题描述】:

我正在从 PDF 中提取文本,并且遇到从连续页面返回相同文本的问题。我已经使用 iTextSharper 编写了一些 PDF 解析器,并且刚刚将以下代码从 iTextSharper 移植到 iText7,并假设这只是一个 iTextSharper 问题:

        var pdfDocument = new PdfDocument(new PdfReader(@"C:\Temp\MyForm.pdf"));

        for (int page = 1; page <= pdfDocument.GetNumberOfPages(); page++)
        {
            var strategy = new SimpleTextExtractionStrategy();
            var pdfPage = pdfDocument.GetPage(page);
            var currentText = PdfTextExtractor.GetTextFromPage(pdfPage, strategy);

            // Process this page
            Console.WriteLine("PAGE {0}", page);
            Console.WriteLine(currentText);
        }

这里有什么我遗漏的吗?

【问题讨论】:

  • 很遗憾,您没有共享测试 PDF。一个想法:默认情况下,iText 文本提取会忽略文本是在页面裁剪框内部还是外部。某些 PDF 在同一内容流上具有多个页面的内容,并且只能通过不同的裁剪框选择相应 PDF 页面对象的内容。您的 PDF 可能就是这种情况。如果是这样,对裁剪框应用过滤器应该可以解决问题。如果不是,请分享PDF进行分析。
  • 感谢 mkl 的回复。我将不得不调查您的过滤器/裁剪框方法(我不熟悉的东西)这是 PDF(在公共领域 BTW):link

标签: c# pdf itext itext7


【解决方案1】:

实际上它不是 从连续页面返回的相同文本。相反,您会得到

  • 提取第 1 页时第 1 页的文本;
  • 提取第 2 页时第 1 页和第 2 页的文本;
  • 提取第 3 页时第 1、2 和 3 页的文本;
  • ...

这通常发生在对多个页面重复使用文本提取策略的代码中。但在您的代码中并非如此,您正确地为每个页面创建了一个新的策略对象。因此,原因必须在 PDF 本身。

事实上,您文档的每一页都包含之前所有页面的内容,只是在其裁剪框之外。要仅提取相应页面裁剪框中的文本,您必须进行过滤,例如像这样:

string SRC = @"285187.pdf";

PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC));

Console.WriteLine("\n285187 Filtered\n============\n");

for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++)
{
    var strategy = new SimpleTextExtractionStrategy();
    var pdfPage = pdfDoc.GetPage(i);

    var filter = new IEventFilter[1];
    filter[0] = new TextRegionEventFilter(pdfPage.GetCropBox());
    var filteredTextEventListener = new FilteredTextEventListener(strategy, filter);

    var currentText = PdfTextExtractor.GetTextFromPage(pdfPage, filteredTextEventListener);

    Console.WriteLine("PAGE {0}", i);
    Console.WriteLine(currentText);
}

pdfDoc.Close();

目前尚不清楚 PDF 是这样设计的还是错误的。

【讨论】:

  • 非常感谢 mkl 解决了我的问题。我需要阅读作物箱。只有 SEC 才能回答您的问题!
  • “我需要阅读裁剪框” - 作为开始阅读 here 的框。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2012-03-25
  • 2019-12-19
  • 1970-01-01
相关资源
最近更新 更多