【问题标题】:getting error while making a pdf as password protected in java [duplicate]在java中将pdf设置为密码保护时出错[重复]
【发布时间】:2015-05-27 09:39:13
【问题描述】:

我已经开发了一个 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程序

【问题讨论】:

  • 您是否检查过 index.pdf 存在于 C 驱动器中吗?我怀疑它是异常状态 File is Not found 。
  • 第一件事是不要尝试同时读取和写入同一个文件。写入一个临时文件,然后附加它。
  • @RealSkeptic 谢谢,你能不能更新我的帖子,这将有助于掌握更多谢谢 inadvance
  • @NeerajJain 是的,文件非常存在
  • 我刷新以确保,但您仍在读取和写入同一个文件。

标签: java pdf itext


【解决方案1】:

这是错误的:

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,而是将其保存在内存中,您可以将字节直接写入邮件附件。

【讨论】:

  • 加一个以获得可靠的答案和解释。 :)
  • 我什至更新了它,因为如果您阅读@gfhtghghg 的上一个问题,您会发现他不需要 PDF 作为文件,他只需要将字节用作附件一封邮件。
猜你喜欢
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多