2015-05-27 39 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作为文件,他只需要将字节用作邮件的附件。 –