【问题标题】:Unable to read text in a specific location in a pdf file using iTextSharp无法使用 iTextSharp 读取 pdf 文件中特定位置的文本
【发布时间】:2020-04-27 07:11:35
【问题描述】:

我被要求阅读 pdf 文本并做一些提取文本的工作。我正在使用 iTextSharp 阅读 PDF。这里的问题是 PdfTextExtractor.GetTextFromPage 没有给我页面的所有内容。例如

在上述 PDF 中,我无法阅读以蓝色突出显示的文本。其余的字符我看不懂。下面是执行上述操作的行

           `string filePath = "myFile path";
            PdfReader pdfReader = new PdfReader(filePath);
            for (int page = 1; page<=1; page++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                string currentPageText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
            }`

这里有什么建议吗?

我在 SO 中经历了很多查询和解决方案,但不是针对此查询。

【问题讨论】:

标签: c# .net itext


【解决方案1】:

文本提取不提取这些文本的原因很简单:这些文本不是静态页面内容的一部分,而是表单字段!但是 iText(以及我也知道的其他 PDF 库)中的“文本提取”被认为是指“提取静态页面内容的文本”。因此,您错过的那些文本不会被文本提取。

如果您也想让表单字段值受制于文本提取代码,您首先必须展平表单字段可视化。这里的“扁平化”意味着使它们成为静态页面内容的一部分,并丢弃它们所有的表单字段动态。

您可以通过在阅读此行中的 PDF 后添加来做到这一点

PdfReader pdfReader = new PdfReader(filePath);

用于展平此 PDF 并将展平的 PDF 加载到 pdfReader 的代码,例如像这样:

MemoryStream memoryStream = new MemoryStream();
PdfStamper pdfStamper = new PdfStamper(pdfReader, memoryStream);
pdfStamper.FormFlattening = true;
pdfStamper.Writer.CloseStream = false;
pdfStamper.Close();

memoryStream.Position = 0;
pdfReader = new PdfReader(memoryStream);

从这个重新初始化的pdfReader 中提取文本也会为您提供表单字段中的文本。

不幸的是,扁平化的表单文本被添加到内容流的末尾。由于您选择的文本提取策略SimpleTextExtractionStrategy 只是按照绘制的顺序返回文本,前面的表单字段内容都在最后提取。

您可以通过使用不同的文本提取策略来更改此设置,即替换此行:

ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
  • 使用LocationTextExtractionStrategy(它是iText 分发的一部分)已经返回了更好的结果;不幸的是,表单字段值与我们认为在同一行的静态内容并不完全在同一基线上,因此出现了一些意外的换行符。

    ITextExtractionStrategy strategy = new LocationTextExtractionStrategy();
    
  • 使用HorizontalTextExtractionStrategy(来自this answer,其中包含Java 和C# 版本),结果会更好。但请注意,此策略并非普遍适用,请阅读答案文本中的警告。

    ITextExtractionStrategy strategy = new HorizontalTextExtractionStrategy();
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多