繁体   English   中英

无法使用 iTextSharp 读取 pdf 文件中特定位置的文本

[英]Unable to read text in a specific location in a pdf file using iTextSharp

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

在此处输入图像描述

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

           `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 中经历了很多查询和解决方案,但并不特定于这个查询。

文本提取不提取这些文本的原因很简单:这些文本不是 static 页面内容的一部分,而是表单字段,但是 iText 中的“文本提取”(以及其他 ZBCD1B68617759B1DFCFF0403A6B5 库) static 页面内容的文本”,因此。 您错过的那些文本不受文本提取的影响。

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

您可以在阅读此行中的 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中提取文本也会为您提供表单字段中的文本。

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

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

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

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

     ITextExtractionStrategy strategy = new HorizontalTextExtractionStrategy();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM