2012-09-06 128 views
1

我有一個將用於建立問題數據庫的程序。我正在爲一個網站製作一個網站,希望用戶知道該網站上的內容已被刪除。這就是爲什麼我希望輸出爲PDF - 幾乎每個人都可以查看它,幾乎沒有人可以編輯它(並且與一些更簡單的文件類型不同,移除例如頁腳或水印)。這解釋了爲什麼它HAS是PDF。在Java中讀取PDF作爲文件並使「PDF」可編輯

此程序將被衆多用戶使用,這些用戶將創建新數據庫或擴展現有數據庫。這就是爲什麼將輸出形成爲多個文件極其潦草和低效的方式來實現我想實現的目標(這會使用戶的操作複雜化)。

而我想要做的是創建PDF文件,這些文件一旦創建後仍然可以用我的程序編輯。

我想通過將我的程序可讀的自定義文件類型實現到輸出PDF中來實現此目的。

我想出了三種方式這樣做的:

  1. 附加文件爲PDF,然後破壞PDF的含有它,它只是使它包含該文件的PDF不知道的方式部分,從而使用戶無法注意到(輕鬆地)。在閱讀文檔後,我會使用其中一個可能的PDF庫恢復損壞並提取文件。

  2. 將圖像隱藏在圖像中,該圖像將被添加到第一頁或最後一頁上的PDF somwhere中,以某種方式(仍然需要制定)隱藏在公衆眼前。知道它的位置,它應該是相對容易的使用PDF庫檢索它。

  3. 我已經瞭解到,如果您在PDF中添加「%」符號作爲第一個字符,整行將被PDF閱讀器忽略(類似於Java中的「//」)(至少Adobe Reader ),使得我可以添加儘可能多的行,因爲我想要PDF(如果我知道我在哪裏,我知道),讓最終用戶知道這一點。我可以用這種方式將我的整個自定義文件實現爲PDF。這裏的問題是,我實際上必須使用Java的一個輸入閱讀器閱讀PDF,但我不確定哪一個。我知道PDF不能像文本文件那樣讀取,因爲它是一個二進制文件(對吧?)。

最後,我決定去與方法號3 除非有人有更好的想法,和條件是:只有 1.一個文件。那個文件是PDF。 2.用戶一定不知道添加。

問題是我不知道如何將PDF作爲文件讀取(我不想將它作爲PDF閱讀,我將使用PDF庫進行閱讀)。

  1. 那麼,有沒有人有更好的主意?
  2. 如果不是,我如何將PDF閱讀爲FILE,所以輸出是字符數組(使用換行檢測),然後用我的內容添加重寫整個文件?

回答

1

在Java中,文本和二進制文件沒有真正的區別,您可以將它們作爲輸入流讀取。不同之處在於,對於二進制文件,您無法真正爲其創建Reader,因爲它假定有一種將字節流轉換爲Unicode字符的方法,並且這對於PDF文件不起作用。

所以在你的情況下,你需要讀取字節緩衝區中的文件並且可能循環它們來掃描表示PDF中'%'和行尾字符的字節。

更好的方法是使用另一種現有的編碼PDF數據的方式:XMP標籤。這允許任何類型的複雜Key-Value對以XML格式進行編碼並嵌入到PDF,JPEG等中。請參閱http://partners.adobe.com/public/developer/en/xmp/sdk/XMPspecification.pdf

Java中有一個開源庫,允許您操作該庫:http://pdfbox.apache.org/userguide/metadata.html。另見另一個成功的人的相關問題:custom schema to XMP metadatahttp://plindenbaum.blogspot.co.uk/2010/07/pdfbox-insertextract-metadata-frominto.html

0

這一切都只是1和0 - 只是使用RandomAccessFile並開始閱讀。 PDF規範定義了什麼是有效的換行符(有幾個)。抓住一個十六進制編輯器並打開一個PDF,你至少可以開始感受一些東西。請注意插入行的位置 - 您需要將它們添加到文件末尾,以避免將外部參照表偏移量擰到obj條目上。

這裏有一個相關的問題可能會感興趣:PDF parsing file trailer

我建議startxref線之前把您的評論馬上。如果你把它放在其他任何地方,你可以結束四處移動並打破外部參照表指針。

所以一個簡單的算法插入你的特殊的註釋是:

轉到文件 向後的startxref 搜索結束時立即startxref前插入你的特別評論 - 一定要在插入一個換行符結束您的特別評論 保存PDF

您可以(也應該)在十六進制編輯器中手動執行此操作。

真的很重要:您的用戶是否將更改保存到這些文件?即如果他們填寫表格字段,他們是否會保存?如果是這樣,在保存過程中可能會刪除註釋行(並且不同版本的PDF查看器在這方面的行爲可能會有所不同)。

XMP標籤是正確的方式來做你想做的事 - 你可以嵌入整個XML片段,我想你會很難想出一個不能表達爲XML的數據結構。

我個人建議使用iText,但我有偏見(我是開發人員之一)。 iText In Action書籍將XMP數據嵌入到PDF中有一個很好的章節。以下是書中的一些示例代碼(我絕對推薦):http://itextpdf.com/examples/iia.php?id=217