java - 错误密码异常 : Bad user password

标签 java pdf itext

我正在使用此代码创建加密的 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)”。

最佳答案

首先让我关注一些细节:

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("艺术", 新矩形(36, 54, 555, 791));

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

现在是你问题的本质:

第一个反问:

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

您正在做的事情的简短描述:

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

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 密码是最终用户(想要阅读文档的人)在打开文档时需要输入的密码。 所有者 密码是用户未知 的密码,由创建文档的人输入。当此人想要更改文档中的某些内容时,例如:当他想要填写表格时,他将使用该密码。

第二个反问:

为什么要使用这条线:

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 并且您可以安全地填写表单。

关于java - 错误密码异常 : Bad user password,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33799183/

相关文章:

java - 在 iText 中合并两个模板

java - 无法使用itext从图像中获取absoluteX和absoluteY

Java if 语句不起作用

java - Mahout 推荐器无法正常工作

php - 将pdf文件上传到服务器并获取其url

javascript - PDF 动态内容 - 这可能吗?

java - 在android中使用iText生成带有动态内容的pdftable

c# - 我应该动态重新创建 PDF,而不是将其存储在数据库或文件系统中吗?

java - 某些语言环境在 TTS 中不可用——包括西类牙语

java - 使用 Play Framework 在应用程序启动时实例化 Controller 中的变量