2012-10-18 92 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(); 
     } 
    } 
}