我开发了一个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程序
答案 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,但是将其保存在内存中,您可以将字节直接写入邮件附件。