2015-05-27 54 views
-1

我已經開發了一個java郵件api程序,它將發送郵件,它也附加pdf文件,所以最終郵件發送時附有pdf文件並且pdf將密碼保護所以我使用iText庫在使用pdf作爲密碼保護在java中時出現錯誤

,所以我必須制訂下述

private static final byte[] USER = "password 1234".getBytes(); 
private static final byte[] OWNER = "password 1234".getBytes(); 


    // attachment part 
      MimeBodyPart attachPart = new MimeBodyPart(); 
      String filename = "c:\\index.pdf"; 

      PdfReader reader = new PdfReader(filename); 
      PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename)); 
      stamper.setEncryption(USER, OWNER, 
        PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA); 
       stamper.close(); 
       reader.close(); 
      DataSource source = new FileDataSource(filename); 
      attachPart.setDataHandler(new DataHandler(source)); 
      attachPart.setFileName(filename); 

這個代碼,但我得到這個錯誤下面,請指教如何進行

Exception in thread "main" java.io.FileNotFoundException: c:\index.pdf (The requested operation cannot be performed on a file with a user-mapped section open) 

現在你可以請指教我想通過我的Java程序本身使密碼保護的PDF文件,例如我想修改我的下面的程序,如打開PDF文件密碼1234創建,每當一個郵件發送客戶端應該打開PDF文件,但在打開之前,他應該在pdf文件的彈出框中輸入1234來查看它,請問我可以如何在java程序中實現這一點。下面在此先感謝是我的java程序

+0

** ** index.pdf **是否存在** C **驅動器中?我懷疑它是異常狀態文件未找到。 –

+0

首先,不要嘗試同時讀取和寫入同一個文件。寫入臨時文件,然後附加。 – RealSkeptic

+0

@RealSkeptic謝謝,你能否請更新我的帖子,這將有助於掌握更多謝謝inadvance –

回答

3

這是錯誤的:

String filename_src = "c:\\index.pdf"; 
PdfReader reader = new PdfReader(filename); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename)); 

當你創建一個新的文件new FileOutputStream(filename),與路徑filename的文件將被覆蓋。它將是0字節長。

PdfReader試圖訪問文件以加密它時,它不會再找到任何文件。

你得到一個異常是很正常的:你不能同時讀寫同一個文件。見How to update a PDF without creating a new PDF?

你需要的東西是這樣的:

String filename_src = "c:\\index.pdf"; 
String filename_dest = "c:\\index_encrypted.pdf"; 
PdfReader reader = new PdfReader(filename_src); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename_dest)); 

或者,也許你想爲你在這裏描述爲使用新文件作爲郵件的附件:getting error while making a pdf as password protected in java

在這種情況下,你可以這樣做:

String filename_src = "c:\\index.pdf"; 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
PdfReader reader = new PdfReader(filename_src); 
PdfStamper stamper = new PdfStamper(reader, baos); 
// Do the encrypting stuff 
stamper.close(); 
byte[] result = baos.toByteArray(); 

現在,您不要在文件系統上創建加密的PDF,而是將其保存在內存中,並且可以將字節寫入st喜歡你的郵件附件。

+0

加上一個確切的答案和解釋。 :) –

+0

我甚至更新了它,因爲如果您通過@gfhtghghg閱讀上一個問題,您會發現他不需要PDF作爲文件,他只需要將字節用作郵件的附件。 –