2012-10-18 62 views
6

我必须从PDF文件中检索文本。但使用下面的代码我只能得到空的文本文件。如何将PDF转换为iTextSharp中的文本文件

for (int i = 0; i < n; i++) 
{ 
    pagenumber = i + 1; 
    filename = pagenumber.ToString(); 
    while (filename.Length < digits) filename = "0" + filename; 
    filename = "_" + filename; 
    filename = splitFile + name + filename; 
    // step 1: creation of a document-object 
    document = new Document(reader.GetPageSizeWithRotation(pagenumber)); 
    // step 2: we create a writer that listens to the document 
    PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(filename + ".pdf", FileMode.Create)); 

    // step 3: we open the document 
    document.Open(); 

    PdfContentByte cb = writer.DirectContent; 
    PdfImportedPage page = writer.GetImportedPage(reader, pagenumber); 
    int rotation = reader.GetPageRotation(pagenumber); 
    if (rotation == 90 || rotation == 270) 
    { 
     cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pagenumber).Height); 
    } 
    else 
    { 
     cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
    } 
    // step 5: we close the document 

    document.Close(); 
    PDFParser parser = new PDFParser(); 
    parser.ExtractText(filename + ".pdf", filename + ".txt"); 
} 

我在做什么错,我应该如何从PDF中提取文本?

+0

用于创建包含原始页面的部分PDF的代码似乎都使用iTextSharp类。另一方面,PdfParser类不是来自该库,是吗?这个从哪里来?为什么不在iText中使用PdfTextExtrator?您不必像在这种情况下那样拆分文档。还请提供一个可以产生问题的PDF样本。 – mkl

+2

如果该PdfParser来自http://www.codeproject.com/Articles/14170/Extract-Text-from-PDF-in-C-100-NET,不要惊讶,你得不到好的输出--- PdfParser是非常天真地实施。 – mkl

回答

9

对于iTextSharp的文本提取,采取库的最新版本,并使用

PdfTextExtractor.GetTextFromPage(reader, pageNumber); 

当心,还有在一些5.3.x版本的文本提取码已同时被固定在行李箱中的错误。因此,您可能需要检出中继版本。

3
using System; 
using System.IO; 
using System.Linq; 
using System.Text; 
using iTextSharp.text.pdf; 
using iTextSharp.text.pdf.parser; 

namespace Pdf2Text 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (!args.Any()) return; 

      var file = args[0]; 
      var output = Path.ChangeExtension(file, ".txt"); 
      if (!File.Exists(file)) return; 

      var bytes = File.ReadAllBytes(file); 
      File.WriteAllText(output, ConvertToText(bytes), Encoding.UTF8); 
     } 

     private static string ConvertToText(byte[] bytes) 
     { 
      var sb = new StringBuilder(); 

      try 
      { 
       var reader = new PdfReader(bytes); 
       var numberOfPages = reader.NumberOfPages; 

       for (var currentPageIndex = 1; currentPageIndex <= numberOfPages; currentPageIndex++) 
       { 
        sb.Append(PdfTextExtractor.GetTextFromPage(reader, currentPageIndex)); 
       } 
      } 
      catch (Exception exception) 
      { 
       Console.WriteLine(exception.Message); 
      } 

      return sb.ToString(); 
     } 
    } 
}