BadPasswordException:用户密码错误

时间:2015-11-19 08:56:03

标签: 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();

我省略了创建单元格和表格的代码以及创建表格的代码,其中可以输入诸如firstname,lastname之类的值。

然后我操纵这样的形式。

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)

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

第二个反问题:

为什么使用这一行:

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