2012-12-11 155 views
-1

我正在尋找一種方法來實際獲取文件本身的內容,以文本格式轉儲。例如:我不想要一個字典對象,我不想要某種提取策略選項,我只想要與itextsharp用來解析的相同文本文檔...整個事物作爲字符串或字符串構建器...itextsharp PDF到文本轉儲

我還沒有找到一種方法來做到這一點使用任何工具,所以永遠......我的問題是,我正在嘗試閱讀一個動態的PDF到一個C#應用程序......我們都知道那些補給動態PDF可以不會被iTextSharp解析(AcroForm和AcroFields總是空的),所以我想如果我能得到整個文件的實際文本轉儲,我可以看到它看起來像什麼,並自己解析它爲這個特定的任務(例如:爲每個我知道我可以收到的文檔創建一個類,並根據我所看到的創建一個地圖)。

如果任何人都可以幫助我做到這一點,甚至更好,請在C#中找到一種方式來爲PDF提取XML源(有點像單擊LiveCycle中的XML源代碼標籤),這將不勝感激。

謝謝!

馬特

回答

2

如果你正在尋找的實際經營者和每一頁的命令,在原始文本格式,請嘗試以下代碼:

var reader = new PdfReader("test.pdf"); 
    int intPageNum = reader.NumberOfPages; 
    for (int i = 1; i <= intPageNum; i++) 
    { 
     byte[] contentBytes = reader.GetPageContent(i); 
     File.WriteAllBytes("page-" + i + ".txt", contentBytes); 
    } 
    reader.Close(); 
+0

要知道,即使是全文的頁面此頁面的內容可能僅僅包含對其他資源流,又包含文本或引用其他資源引用... – mkl

+0

它具有對所選字體,選定圖像等的引用。例如,在這裏很明顯,選擇了/ F1字體。現在您知道應該從哪裏開始在可用流中查找此對象。 – VahidN

+0

在上下文中,XObject資源可能更相關。或者根本沒有,OP似乎畢竟對XFA表單數據感興趣。 – mkl

0

我正在尋找一種方式來實際以文本格式獲取文件 本身的內容,並將其轉儲。例如:我不想要字典 對象,我不想要某種提取策略選項,我只需要 想要與itextsharp用來解析的相同文本文檔...整個 事物作爲字符串或stringbuilder .. 。

不幸的是,數據iTextSharp的用於分析尚未文本;該數據中的操作符以某種文本格式給出,但實際的字形可以以完全任意的特殊編碼給出。據說,通常使用一些標準編碼,因爲它是所使用組件的最簡單解決方案。不過,你一般不能指望這一點。 VahidN的答案告訴你如何訪問該內容的起點;儘管如此,他並不很少提取的頁面內容數據只包含對不同對象中包含的資源的引用。

我的問題是,我想讀一個動態的PDF成C# 應用程序......我們都知道,那些該死的動態PDF文件無法通過 iTextSharp的(AcroForm和AcroFields解析總是出現空),

這聽起來好像你實際上有一個完全不同的任務在手。動態表單及其內容是而不是部分頁面內容,而是存儲在單獨的XML Forms Architecture流中。

iText in Action, 2nd edition,在第8章中給出了關於如何訪問XFA流數據的一些信息,第一次查看示例XfaMovie.cs

您可能還想查看iText XML Worker項目,以更輕鬆地操作XFA流。

+0

mkl:這看起來不錯,聽起來不錯...但它可以與動態PDF一起使用嗎?每次我嘗試使用任何方法閱讀它們時,我都會從Adobe獲得一些消息,例如:如果此消息未被PDF內容替代,請更新您的Adobe Reader版本...我可能需要一些時間來實現此類你已經給了我,但我不知道我是否有時間做所有的測試和其他一切......如果你在動態PDF中使用這個類的經驗,那將非常感謝! – MaxOvrdrv

+0

@MaxOvrdrv請提供樣本PDF;我認爲你正在談論動態的XFA表單; iText in Action中提到的章節展示瞭如何檢索現有的XFA表單數據,並在改變它們之後如何將它們寫回。 – mkl

1

如果你只想轉儲文本,試試這個:

 PdfReader reader = new PdfReader(pdfFileName); 
     String text = ""; 
     nPages = reader.NumberOfPages; 
     for (int i = 0; i < nPages; i++) 
     { 
      text += PdfTextExtractor.GetTextFromPage(reader, i + 1); 
     }