在java中将pdf作为密码保护时出错

时间:2015-05-27 09:39:13

标签: java pdf itext

我开发了一个java邮件api程序,它将发送邮件并附加pdf文件,所以最后发送一个邮件,其中附加了pdf文件,pdf将受密码保护,所以我使用itext图书馆

所以我在下面开发了这段代码

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程序

1 个答案:

答案 0 :(得分: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,但是将其保存在内存中,您可以将字节直接写入邮件附件。