【问题标题】:BadPasswordException: Bad user passwordBadPasswordException:错误的用户密码
【发布时间】:2015-11-19 08:56:03
【问题描述】:

我正在使用此代码创建一个加密的 PDF:

Document document = new Document(
    new Rectangle(PageSize.A4.getWidth(), PageSize.A4.getHeight()));
PdfWriter writer = PdfWriter.getInstance(document,
    new FileOutputStream(RESULT1));
writer.setBoxSize("art", new Rectangle(36, 54, 555, 791));
writer.setEncryption("Vibhu".getBytes(), "Vibhu@123456789".getBytes(),
    PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
document.open();
// Creating Tables and Cells
document.close();

我省略了创建单元格和表格的代码以及创建可以输入名字、姓氏等值的表单的代码。

然后我像这样操作表单。

private void manipulatePdf(String src, String dest, EclaimsVO eclaimsVO,
    String language) throws IOException, DocumentException {
    File file = new File(src);
    if (isObjectPresent(file)) {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper;
        stamper = new PdfStamper(reader, new FileOutputStream(dest),
                '\0', false);
        form = stamper.getAcroFields();
        addToForm("field_2", eclaimsVO.getName());
        addToForm("field_3", eclaimsVO.getSurName());
        stamper.close();
    }
}

创建文件时,我一直在尝试通过setEncryption() 向 PDF 文件添加密码,但在读取文件时会引发此异常:

com.itextpdf.text.exceptions.BadPasswordException: Bad user password
at com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:681)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:181)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:219)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:207)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:197)

但是,如果我将 unethicalreading 更改为 true 并将 OWNER-PASSWORD 设置为空字符串,则不会出现异常。

writer.setEncryption("".getBytes(), "Vibhu@123456789".getBytes(),
            PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
PdfReader.unethicalreading = true;

现在,当我尝试打开 PDF 时,它会在没有密码提示的情况下打开。 但是当我打开 PDF 时,该文档的标题为“Sample.pdf(SECURED)”。

【问题讨论】:

  • 你的问题有点奇怪。查看您的代码,就好像您想在创建 文档时设置 密码。据我所知,您提到的错误仅在您尝试 read 一个 existing 文档而不使用密码时发生。你能澄清一下吗?您是否正在创建或操作现有文档。您应该提供更多代码。
  • 是的,我想在创建文档时设置密码。很抱歉给您带来麻烦。
  • 在这种情况下,我不明白 (1.) 为什么你会得到异常,因为你没有使用 PdfReader 和 (2.) 为什么你将 unethicalreading 设置为 true因为你不需要解密任何东西,你只想加密一个PDF。所以我再一次问你:显示更多代码。没有更多的代码 = 没有更多的答案或 cmets(以及我投票结束问题的风险是不清楚的)。
  • 我在link 阅读了一篇帖子,因此使用了不道德的阅读。我在努力。我已经编辑了代码。
  • 我已经更新了你的问题。当我问:您是在创建还是在操作代码时,您没有正确回答。你以后应该更准确!

标签: java pdf itext


【解决方案1】:

首先请允许我关注一些细节:

Document document = new Document(
    new Rectangle(PageSize.A4.getWidth(), PageSize.A4.getHeight()));

constance A4 是一个具有特定宽度和高度的Rectangle 对象。你可以这样使用它:

Document document = new Document(PageSize.A4);

为什么还要创建另一个矩形? new Rectangle(PageSize.A4.getWidth(), PageSize.A4.getHeight()) 相当于PageSize.A4,那你为什么不直接使用PageSize.A4

你为什么要定义一个艺术盒?

writer.setBoxSize("art", new Rectangle(36, 54, 555, 791));

通常很少有理由创建艺术盒。为什么不删除这一行?

现在是您问题的本质:

第一个反问:

您似乎正在创建一个稍后要填写的表单。如果此表格仅供私人使用,您为什么要加密该表格?为什么在填写的过程中不加密呢?这不会简化事情吗?

简要说明你在做什么:

假设您真的想加密模板。在这种情况下,您知道所有者密码:

writer.setEncryption("Vibhu".getBytes(), "Vibhu@123456789".getBytes(),
    PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);

你也试过了:

writer.setEncryption("".getBytes(), "Vibhu@123456789".getBytes(),
    PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);

您声称您将 OWNER-PASSWORD 设置为空字符串。这不正确!您使用空的String 作为用户密码user 密码是最终用户(想要阅读文档的人)在打开文档时需要输入的密码。 owner 密码是用户不知道的密码,由创建文档的人引入。此人在想要更改文档中的某些内容时会使用该密码,例如:当他想要填写表格时。

第二个反问:

你为什么用这条线:

PdfReader.unethicalreading = true;

这一行是人们在不知道所有者密码时使用的。但是,您确实知道所有者密码:它是 "Vibhu@123456789"

避免 BadPasswordException 的简单解决方案:

由于您知道所有者密码,因此您应该在阅读文档时使用它。这在我对问题How can I decrypt a PDF document with the owner password?的回答中进行了解释@

您应该像这样更新创建reader 对象的行:

PdfReader reader = new PdfReader(src, "Vibhu@123456789".getBytes());

现在您将不再收到BadPasswordException,您可以放心地填写表格。

【讨论】:

  • 非常感谢。也感谢您的耐心等待。
  • 何@DvD:如果答案解决了您的问题,请接受答案。
猜你喜欢
  • 2011-07-09
  • 2016-04-09
  • 2013-06-03
  • 2016-06-14
  • 2018-08-09
  • 1970-01-01
  • 2022-10-14
  • 2016-08-30
  • 2016-11-11
相关资源
最近更新 更多