【问题标题】:Reading PDF document with iTextSharp creates string with repeating first page使用 iTextSharp 阅读 PDF 文档会创建重复第一页的字符串
【发布时间】:2015-05-12 10:43:16
【问题描述】:

我目前使用 iTextSharp 读取一些 PDF 文件并使用我收到的字符串解析它们。我遇到了一些 PDF 文件的奇怪行为。例如,当获取 4 页 PDF 的字符串时,字符串按以下顺序填充页面:

1 2 1 3 1 4

我读取文件的代码如下:

using (PdfReader reader = new PdfReader(fileStream))
{
     StringBuilder sb = new StringBuilder();

     ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
     for (int page = 0; page < reader.NumberOfPages; page++)
     {
         string text = PdfTextExtractor.GetTextFromPage(reader, page + 1, strategy);
         if (!string.IsNullOrWhiteSpace(text))
             sb.Append(Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(text))));
     }

     Debug.WriteLine(sb.ToString());
}

这是一个指向发生此行为的文件的链接:

https://onedrive.live.com/redir?resid=D9FEFF3BF45E05FD!1536&authkey=!AFLRlskAvlg89yY&ithint=file%2cpdf

希望大家能帮帮我!

【问题讨论】:

  • 我没有给你答案,但我可以告诉你,完成所有转码的那一行实际上是不正确的(尽管互联网上的大多数示例似乎仍在使用它)并且会非常崩溃容易地。有关更多详细信息,请参阅this post,但基本上,text 是一个 100% 完美的 .Net 字符串,当您从 PDF 中得到它时,保证。最好的情况是,转码什么都不做,最坏的情况是你会把文本变成乱码。
  • 当我创建样本时,我一直在看这条线并想了很多,但因为它是这么多样本的一部分,所以我把它留了下来供参考。虽然我改变了它,但它没有任何区别。
  • 另一件事是文本提取策略通常不打算重复使用(除非您有特定的理由)。这样做的原因是他们没有明确的“新页面”命令来擦除他们的内部状态。通过重用该对象,您实际上是在“附加模式”下工作。不要在循环之外实例化它,而是每次尝试创建一个新的var text = PdfTextExtractor.GetTextFromPage(reader, page + 1, new SimpleTextExtractionStrategy());
  • 正如@ChrisHaas 所说,通过重用策略,您可以将所有页面的内容添加到策略中。因此,您的 StringBuilder 最终不应仅包含 1 2 1 3 1 4 而是包含 1 1 2 1 2 3 1 2 3 4

标签: itextsharp


【解决方案1】:

感谢 Chris Haas,我发现出了问题。在网上找到的关于如何使用 iTextSharp.Pdf 的示例对于我的实现不正确或不正确。

SimpleTextExtractionStrategy 需要为您尝试阅读的每个页面进行实例化。不这样做会将结果字符串中的每个前一页相乘。

还可以更改附加 StringBuilder 的行:

sb.Append(Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(text))));

sb.Append(text);

因此下面的代码给出了正确的结果:

using (PdfReader reader = new PdfReader(fileStream))
{
    StringBuilder sb = new StringBuilder();

    for (int page = 0; page < reader.NumberOfPages; page++)
    {
        string text = PdfTextExtractor.GetTextFromPage(reader, page + 1, new SimpleTextExtractionStrategy());
        if (!string.IsNullOrWhiteSpace(text))
            sb.Append(text);
    }
    Debug.WriteLine(sb.ToString());                    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多