2014-03-04 81 views
6

我正在使用iText生成PDF文件。我想禁止編輯PDF,但允許讀者提取頁面。這裏是我的代碼來設置加密:禁止編輯,但允許在Java iText/PDF中提取頁面

writer.setEncryption(null, null, 0xffffffff, PdfWriter.STANDARD_ENCRYPTION_128);

第三個參數指定的權限。我使用0xffffffff而不是個別iText標誌ALLOW_PRINTING等。這將要求iText啓用一切。但是,這是我在PDF文件中得到:

enter image description here

我覺得我應該被允許啓用提取,但禁止編輯,但我不能肯定。這裏有權限位按照Adobe: enter image description here enter image description here

(從here,但是要注意它的30兆)

所以關掉位6和11,但在其他人(特別是第5位和10)離開,這將關閉編輯,但允許提取。在任何情況下,通過指定0xffffffff我會認爲一切都會被允許;但是相反之外都允許提取。

我瀏覽了設置權限的iText源代碼,沒有看到任何會導致此問題的東西。下面是從PdfEncryption.setupAllKeys相關代碼:

permissions |= (revision == STANDARD_ENCRYPTION_128 || revision == AES_128 || revision == AES_256) ? 0xfffff0c0 
     : 0xffffffc0; 
permissions &= 0xfffffffc; 

第一行是做一個OR所以不會刪除任何權限;第二行是根據PDF規範將兩個最右邊的位置設置爲0。

我在想,如果這是一個iText的事情,PDF的事情,或者如果我做了其他的錯誤。

感謝

回答

1

類似的問題已經被提出here

使用加密實際上會適得其反,因爲它只能用於刪除權限,而不能添加它們。

根據這一點,它可能是有幫助的第一個完全解鎖PDF:

PdfReader reader = new PdfReader(file.toURI().toURL()); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
    file.getAbsolutePath().replace(".pdf", "_UNLOCKED.pdf"))); 
stamper.close(); 
reader.close(); 

之後,你可以抓住的輸出,並從頭開始(與權限位周圍亂)開始。希望這可以幫助。

編輯:如果您無權訪問密碼,iText sources可以修改。只需在com.itextpdf.text.pdf.PdfStamperImp中註釋if (!reader.isOpenedWithFullPermissions()) throw ...(版本5.5.0中的第121和122行)即可。

+1

*只需註釋掉第121行和第122行* - 我假設您的意思是if(!reader.isOpenedWithFullPermissions())會拋出......'行。該編輯是**不是必需的,參見。 [這個答案](http://stackoverflow.com/questions/17666577/opening-password-protected-pdf-file-with-itextsharp/17694943#17694943),只需設置PdfReader.unethicalreading = true後確保你確實有權忽略密碼保護帶來的限制。 – mkl

+0

感謝提示@mkl。不幸的是,這不**允許「更改文檔」,「文檔組裝」,「內容複製」和「頁面提取」(改變源代碼)。至少那是我所經歷的。 – beatngu13

+0

這會讓人感到意外,因爲兩者基本上都是一樣的,它們都能防止異常。 – mkl

相關問題