为什么我会从 iText7 C# 中提取重复的页面?
Why am I getting duplicate pages extracted from iText7 C#?
我正在从 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);
}
我在这里遗漏了什么吗?
实际上,不是 从连续页面返回的相同文本。相反你得到
- 提取第 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 是有意创建的还是错误的。
我正在从 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);
}
我在这里遗漏了什么吗?
实际上,不是 从连续页面返回的相同文本。相反你得到
- 提取第 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 是有意创建的还是错误的。