2011-07-12 29 views
2

我一直致力於在PDF上設置密碼以防止複製/粘貼並允許打印,添加水印和設置所有者密碼以防止進一步的更改。如何最好使用ItextPDF來真正保護PDF?

一切運作良好,沒有問題。

然後我下載了這個免費的15天PDF清除工具,a-pdf。在眨眼時,無論密碼的複雜程度如何,它都會取消所有的保護(使用50個字符長度進行嘗試,將所有類型的字符)。

我看到在itextPDF中有其他方法來加密文檔。我使用以下內容:

File f = new File("C:/TEMP/zip/waterMarked.pdf"); 

String hardPassword = "D [email protected] CqAk+NQCW)[email protected]&02ifu!2TMX*d 0TGK(j(Kq"; 
byte[] hardPasswordByte = hardPassword.getBytes(); 

PdfReader reader = new PdfReader("C:/TEMP/zip/Original_document-9.pdf"); 

FileOutputStream out = new FileOutputStream(f); 

PdfStamper stamp = new PdfStamper(reader, out); 

//first argument is the user password. If set to something it asks for password when opening file, not wanted. 
stamp.setEncryption(null, hardPasswordByte, PdfWriter.ALLOW_PRINTING, true); 

//do stuff on the stamper, save file. 

有誰知道更好的方法來保護PDF文件免受Java代碼?

+7

您遇到的問題與您正在進行的類型或限制有關:爲顯示PDF,計算機需要訪問與從文檔中複製文本所需的數據幾乎相同的數據。您無法可靠地允許打印並防止從文檔複製和粘貼。你所嘗試的一切只是提高了線索。 –

+3

請勿在禁止複製的情況下創建PDF。爲了複製文檔中的文本,必須打開OCR非常煩人,無論您是否嘗試阻止,我都會這樣做。 – endolith

回答

9

PDF文件支持2個密碼:用戶密碼和所有者密碼。如果用戶知道任何這些密碼,用戶可以查看該PDF文件。如果文件具有用戶密碼,則在使用PDF查看器打開文件時,查看器會要求用戶輸入密碼,並且用戶密碼或所有者密碼都可以使用。如果文件只有所有者密碼,則在嘗試更改文件的訪問權限時,會自動顯示文檔並且需要密碼。這是PDF規範建議的操作流程,但實際上它的工作原理是這樣的:如果文件受到用戶密碼保護,則密碼破解需要使用暴力破解方法,密碼破解所需的時間越長。問題是您的真實用戶需要密碼才能打開文件。如果文件僅受所有者密碼保護,則存在默認的解密密鑰(請記住,任何查看者都可以在不請求密碼的情況下顯示PDF文件),並且處理PDF文件的應用程序決定是否尊重文檔訪問權限。一旦文件被解密,它將被保存而不加密,並且輸出文件不再有密碼。由於您的文檔僅擁有所有者密碼,因此該工具可使用默認解密密鑰毫無問題地將其刪除。

有幾種解決方案(或多或少與iText相關)取決於您的受衆: 簡單的PDF加密(有上述問題),如果您的觀衆很普遍,例如您在網站上發表論文;第三方DRM解決方案,更復雜,需要在用戶的計算機上安裝各種插件;證書加密(不知道iText是否支持它),同樣複雜,要求每個用戶擁有數字證書,併爲每個用戶定義文檔訪問權限。最後2個選項在受控制的企業環境中工作。

+0

感謝您的詳細解答! IText支持證書加密,但正如您所說的,所有這些管理都非常複雜,而且目標受衆太廣泛,無法以這種方式實施安全性。我試圖讓已經存在的東西變得更好,但我想我會解決現狀。正如Joachim所解釋的那樣,客戶仍然需要閱讀而沒有限制,因此保護僅僅來自閱讀應用程序。感謝你們的答案! – IceGras

+2

那麼只要您允許用戶查看文檔,任何複製文本的解決方案都會失敗。即使有些仙塵可以避免它們複製數據,截圖和OCR軟件也可以很好地工作 – Voo