2013-10-08 80 views
0

免責聲明:我一直在試圖用iText來做到這一點。我已閱讀,研究,詢問,詢問,試驗,並盡我所能去做這項工作。我很氣憤。請不要以爲我沒有嘗試,只是來到這裏,以便我可以讓別人爲我做這件事;事實並非如此。我想學習,我想弄清楚這一點。我正在尋找有經驗的人的一個好方向。

簡單的閱讀PDF文件,讀取文本和寫入新的PDF文件。 (Java)

我有一個包含可編輯文本字段的PDF。我想要做的是以編程方式從該PDF中讀取並從已存在的文本字段中提取文本,從我的應用中的其他位置獲取文本,然後將以前的信息+新的文本信息寫回原始PDF。

我曾嘗試:
- 閱讀PDF文件使用PdfReader
- 使用PdfStamper(PdfReader,FileOutputStream中)寫入PDF
- 使用reader.getAcroFields()獲取文本字段。

我已經搜索了好幾天了,我無法解決這個問題。當我這樣做:

String in = "C:/Users/me/Desktop/file.pdf"; 
String out = "C:/Users/me/Desktop/file.pdf"; 
PdfReader reader = new PdfReader(in); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(out)); 
AcroFields form = stamper.getAcroFields(); 
form.setField("dateDisc1", "5/21"); 

它最終創建一個損壞的PDF(file.pdf)。

如果有更簡單的方法可以做到這一點,請幫助我對此發表一些看法。

謝謝!

+2

您是否嘗試過使用不同的輸入/輸出文件名稱,對吧? –

+0

@StefanoSanfilippo是的,我試過了。那是當它給我一個腐敗的PDF不會打開。 – Rincewind

+1

我沒有看到你關閉壓模。你是否簡單地忘記將最後的'stamper.close()'複製到你的問題中,還是真的丟失了?在後一種情況下添加它,但使用不同的文件名。 – mkl

回答

0

我自己的想法。我在未來爲其他人創建了一個演練,尋找類似的東西:

我已經搜索了幾天網絡,試圖找到一個簡單的方法來做到這一點。不成功,我挖掘了自己的腳後跟,並確定如果可能的話,我會讓它工作。我曾在互聯網上看過幾十個地方,詢問如何做到這一點;現在,這是一個有據可查的例子。

//Define the location of the PDF and establish a new file to write to. We will change the target later// 
    String dest = System.getProperty("user.home").concat("directory_and_name_of_PDF.pdf"); 
    String out = System.getProperty("user.home").concat("directory_and_name_that_will_be_changed.pdf"); 
    PdfReader pdfreader = new PdfReader(dest);     
    PdfStamper stamper = new PdfStamper(pdfreader, new FileOutputStream(System.getProperty("user.home").concat("same_as_String out")));  
    AcroFields form = stamper.getAcroFields(); 

//Append text to the text fields// 
    form.setField("text field name", "text to add"); 
    form.setField("text field name2", "repeat"); 
    form.setField("text field name3", "repeat"); 
    form.setField("text field name4", "repeat"); 
    stamper.close(); 
    pdfreader.close(); 

//Change the file name of fileOutputStream to the original that was read from// 
    File destfile = new File(dest); 
    File outfile = new File(out); 
    destfile.delete();   
    outfile.renameTo(new File(System.getProperty("user.home").concat("name_of_the_original_PDF.pdf"))); 

在那裏,我們有它。請注意,這將刪除原始文件並將fileOutputStream重命名爲原始文件名;如果有原始信息沒有讀入,它將會丟失。確保收集您希望複製的所有信息。另外,請記住,我設置了一個條件語句(if),以確保讀入的文本字段中的任何文本都不會被寫入。您必須這樣做,否則您有可能無法將以前的文本轉移到新的PDF中。

如果有任何問題,隨時問。我絕不是專業開發人員,但我可以就我所知道的事情提供建議。記得在你問之前進行研究。祝你好運!

+0

我將您的解決方案從您的問題(這不是真正的問題)遷移到此處答案的正文中,它屬於哪裏。對自己的問題寫一個答案是完全正確的,事實上,如果你能夠解決問題,我們鼓勵你。 –

1

是的對不起,我沒有注意到文件名。

原來的答覆:

好吧有沒有簡單的方法,我很久以前發現了這一點。

PDF實際上是某種身邊的PostScript包裝的(它包含字體和等),並轉換PDF到PostScript是很容易的(我只是跑的命令,並從那裏上的PostScript工作)

它不象LaTeX,PostScript適用於打印機,它有一個可以推送狀態的堆棧,每個字母都是絕對定位的,PostScript是打印機解釋的虛擬機的一組指令。

文字highlighing等來自更高的知識,文字從左到右流動的東西。我閱讀了PostScript標準,得到了我想要的並且沒有觸及它,但這不是一個偉大的策略,但肯定會指向正確的方向。

記住PDF和PostScript(文檔)不會進行編輯,它們不會進行文本換行等,如果您需要放大縮放,則必須進行平移,它們存在以保留格式,適用於打印機等。

+0

@Smit自己想象出來。不過,感謝您提供有用的信息。看到答案。 – Rincewind