【问题标题】:Using iTextSharp, trying to extract text from a PDF gives non-readable data使用 iTextSharp,尝试从 PDF 中提取文本会产生不可读的数据
【发布时间】:2014-04-24 18:29:10
【问题描述】:

好的,我正在尝试使用 iTextSharp 从 PDF 文件中提取文本……这就是我想要的。但是,当我提取文本时,它给我的是垃圾而不是文本。

这是我正在使用的代码...

List<String> pdfText = new List<string>();
for (int page = 1; page <= reader.NumberOfPages; page++)
{
    ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
    String strPage = PdfTextExtractor.GetTextFromPage(reader, page, its);

    strPage = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default,
              Encoding.UTF8, Encoding.Default.GetBytes(strPage)));

    pdfText.Add(strPage);
}

然后我将该数据保存到一个文本文件中,但我得到的不是可读文本,而是看起来像二进制数据的文本......到处都是不可打印的字符。我会发布我所看到的图像,但它不会让我。对此感到抱歉。

我已经尝试过不进行编码尝试,但它并没有更好地工作......仍然是二进制数据(在记事本中查看),尽管我不确定它与编码尝试产生的数据相同。

知道发生了什么以及如何解决它吗?

【问题讨论】:

  • 看看这是否对初学者有帮助stackoverflow.com/a/10191879/231316
  • 请提供有问题的 PDF 文件。有些 PDF 文件不包含如何将字形标识符转换为 Unicode 的信息,有些甚至试图误导。
  • 克里斯,我不确定这是否是问题所在,因为我尝试了没有编码行的代码,但问题仍然存在。不过,我会再试一次,只是为了覆盖所有基础。
  • mkl,如果 PDf 采用自定义编码方法,除非 PDF 文件包含处理它所需的信息,否则 Adob​​e 如何正确显示它?无论如何,我要解析的 PDF 文件可以位于以下网址:fileshare.homestead.com/files/share/…
  • 如果 PDf 采用自定义编码方法,除非 PDF 文件包含处理它所需的信息,否则 Adob​​e 如何正确显示它? - PDF 可以包含嵌入的字体。如果他们这样做了,所有关于编码“含义”的信息都可以省略; PDF 需要包含的所有内容都是针对所用编码的每个字节的一组图形渲染指令。它确实需要该图形表示哪个Unicode字母的信息。

标签: c# .net pdf itextsharp


【解决方案1】:

请在 Adob​​e Reader 中打开文档,然后尝试复制/粘贴部分文本。

如果您对第一页执行此操作,您将获得:

以下政策 (L30304) 已由 Alpha II 存档。许多政策是更大范围的一部分 管辖权,而不是由政策表明。本政策涵盖以下州:

• 印第安纳州

• 密歇根州

但是,如果您对第二页执行此操作,您将获得:

换句话说:从 Adob​​e Reader 复制/粘贴会给您带来垃圾。

如果从 Adob​​e Reader 复制/粘贴给您带来垃圾,那么任何文本提取工具都会给您带来垃圾。您需要对文档进行 OCR 才能解决此问题。

关于您在 cmets 中的附加问题:如果 PDf 采用自定义编码方法,除非 PDF 文件包含处理它所需的信息,否则 Adob​​e 如何正确显示它?

这个问题在 14 分钟的电影中得到了解答:https://www.youtube.com/watch?v=wxGEEv7ibHE

【讨论】:

    【解决方案2】:

    试试这个代码:

     List<String> pdfText = new List<string>();
    for (int page = 1; page <= reader.NumberOfPages; page++)
    {
        ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
        PdfTextExtractor.GetTextFromPage(reader, page, its);
    
        strPage = its.GetResultantText();
    
        pdfText.Add(strPage);
    }
    

    【讨论】:

      【解决方案3】:

      试试这个代码,为我工作

       using (PdfReader reader = new PdfReader(path))
                  {
                      StringBuilder text = new StringBuilder();
      
                      for (int i = 1; i <= reader.NumberOfPages; i++)
                      {
                          text.Append(PdfTextExtractor.GetTextFromPage(reader, i));
                      }
      
                      return text.ToString();
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        相关资源
        最近更新 更多