BadPasswordException:错误的用户密码
BadPasswordException: Bad user password
我正在使用此代码创建加密的 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),
'[=11=]', 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("art", 新矩形(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密码是终端用户(想要阅读文档的人)打开文档时需要输入的密码。 所有者密码是由创建文档的人介绍的用户未知的密码。当此人想要更改文档中的某些内容时,例如:当他想要填写表格时,他将使用该密码。
第二个反问:
为什么要使用这条线:
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
,您可以安全地填写表格。
我正在使用此代码创建加密的 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),
'[=11=]', 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("art", 新矩形(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密码是终端用户(想要阅读文档的人)打开文档时需要输入的密码。 所有者密码是由创建文档的人介绍的用户未知的密码。当此人想要更改文档中的某些内容时,例如:当他想要填写表格时,他将使用该密码。
第二个反问:
为什么要使用这条线:
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
,您可以安全地填写表格。