【问题标题】:Itextsharp text extractionItextsharp 文本提取
【发布时间】:2011-01-17 08:08:47
【问题描述】:

我在 vb.net 上使用 itextsharp 从 pdf 文件中获取文本内容。该解决方案适用于某些文件,但不适用于其他甚至非常简单的文件。问题是token stringvalue设置为null(一组空方框)

token = New iTextSharp.text.pdf.PRTokeniser(pageBytes)
    While token.NextToken()
        tknType = token.TokenType()
        tknValue = token.StringValue

我可以测量内容的长度,但我无法获取实际的字符串内容。

我意识到这取决于 pdf 的字体。如果我使用 Acrobat 或带有 Courier 的 PdfCreator 创建 pdf(顺便说一句,这是我的 Visual Studio 编辑器中的默认字体),我可以获得所有文本内容。如果使用不同的字体构建相同的 pdf,我会得到空方框。

现在的问题是,如何在不考虑字体设置的情况下提取文本?

谢谢

【问题讨论】:

    标签: c# itextsharp


    【解决方案1】:

    Mark 的回答对我有很大帮助的补充。iTextSharp 实现命名空间和类与 java 版本有点不同

     public static string GetTextFromAllPages(String pdfPath)
        {
            PdfReader reader = new PdfReader(pdfPath); 
    
            StringWriter output = new StringWriter();  
    
            for (int i = 1; i <= reader.NumberOfPages; i++) 
                output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()));
    
            return output.ToString();
        }
    

    【讨论】:

    • +1 提供完整的代码示例,而不仅仅是一行
    • 是否可以使用 itextsharp 提取“ftp 服务器”上的文件?
    • @Munavvar ,不幸的是我没有这样的经历。但通常您可以从文件流或二进制文件的 frs 中读取 FTP 并提供 ItextSharp
    • 有时返回一个空(只有空格)可能是什么原因?
    • @Nerdintraining,有时请更准确地说,可能是通过了异常的 pdf 格式,或者当页面实际上是必须首先进行 OCRed 处理的图像时。
    【解决方案2】:

    查看PdfTextExtractor

    String pageText = 
      PdfTextExtractor.getTextFromPage(myReader, pageNum);
    

    String pageText = 
      PdfTextExtractor.getTextFromPage(myReader, pageNum, new LocationTextExtractionStrategy());
    

    两者都需要相当新版本的 iText[Sharp]。实际上,此时自己解析内容流只是重新发明轮子。省去自己的痛苦,让 iText 为你做这件事。

    PdfTextExtractor 将为您处理所有不同的字体/编码问题......无论如何都可以处理的所有问题。如果您无法准确地从 Reader 复制/粘贴,则 PDF 中没有足够的信息来从内容流中获取字符信息。

    【讨论】:

      【解决方案3】:

      如果有人需要,这里是 iTextSharp.text.pdf.PdfName.ANNOTS 和 iTextSharp.text.pdf.PdfName.CONTENT 的变体。

              string strFile = @"C:\my\path\tothefile.pdf";
              iTextSharp.text.pdf.PdfReader pdfRida = new iTextSharp.text.pdf.PdfReader(strFile);
              iTextSharp.text.pdf.PRTokeniser prtTokeneiser;
              int pageFrom = 1;
              int pageTo = pdfRida.NumberOfPages;
              iTextSharp.text.pdf.PRTokeniser.TokType tkntype ;
              string tknValue;
      
              for (int i = pageFrom; i <= pageTo; i++) 
              {
                  iTextSharp.text.pdf.PdfDictionary cpage = pdfRida.GetPageN(i);
                  iTextSharp.text.pdf.PdfArray cannots = cpage.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS);
      
                  if(cannots!=null)
                      foreach (iTextSharp.text.pdf.PdfObject oAnnot in cannots.ArrayList) 
                      {
                          iTextSharp.text.pdf.PdfDictionary cAnnotationDictironary = (iTextSharp.text.pdf.PdfDictionary)pdfRida.GetPdfObject(((iTextSharp.text.pdf.PRIndirectReference)oAnnot).Number);
      
                          iTextSharp.text.pdf.PdfObject moreshit = cAnnotationDictironary.Get(iTextSharp.text.pdf.PdfName.CONTENTS);
                          if (moreshit != null && moreshit.GetType() == typeof(iTextSharp.text.pdf.PdfString)) 
                          {
                              string cStringVal = ((iTextSharp.text.pdf.PdfString)moreshit).ToString();
                              if (cStringVal.ToUpper().Contains("LOS 8"))
                              { // DO SOMETHING FUN
      
                              }
                          }
                      }
              }
              pdfRida.Close();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        相关资源
        最近更新 更多