如何使用 iText 7 删除受密码保护的 pdf 中的密码
Posted
技术标签:
【中文标题】如何使用 iText 7 删除受密码保护的 pdf 中的密码【英文标题】:How to remove password in password-protected pdf using iText 7 【发布时间】:2021-10-15 23:38:57 【问题描述】:我正在尝试使用 iText 7 知识库站点 (https://kb.itextpdf.com/home/it7kb/examples/encrypting-decrypting-pdfs) 中提供的示例在没有所有者密码的情况下解密受密码保护的 pdf,但我的示例程序抛出了 BadPasswordException 错误。
受密码保护的 pdf 具有 256 位 AES 密码安全性。该程序正在使用 itext7-core v7.1.16 依赖项。
public class DecryptPdf3
public static final String SRC = "./src/main/resources/pdfs/THISISATEST_PWP.pdf";
public static final String DEST = "./target/sandbox/security/decrypt_pdf3.pdf";
public static void main(String[] args) throws Exception
File file = new File(DEST);
file.getParentFile().mkdirs();
new DecryptPdf3().manipulatePdf(DEST);
protected void manipulatePdf(String dest) throws Exception
PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC).setUnethicalReading(true), new PdfWriter(dest));
pdfDoc.close();
Exception in thread "main" com.itextpdf.kernel.crypto.BadPasswordException: Bad user password. Password is not provided or wrong password provided. Correct password should be passed to PdfReader constructor with properties. See ReaderProperties#setPassword() method.
at com.itextpdf.kernel.crypto.securityhandler.StandardHandlerUsingAes256.initKeyAndReadDictionary(StandardHandlerUsingAes256.java:253)
at com.itextpdf.kernel.crypto.securityhandler.StandardHandlerUsingAes256.<init>(StandardHandlerUsingAes256.java:89)
at com.itextpdf.kernel.pdf.PdfEncryption.<init>(PdfEncryption.java:247)
at com.itextpdf.kernel.pdf.PdfReader.readDecryptObj(PdfReader.java:1300)
at com.itextpdf.kernel.pdf.PdfReader.readPdf(PdfReader.java:734)
at com.itextpdf.kernel.pdf.PdfDocument.open(PdfDocument.java:1945)
at com.itextpdf.kernel.pdf.PdfDocument.<init>(PdfDocument.java:331)
at com.itextpdf.kernel.pdf.PdfDocument.<init>(PdfDocument.java:299)
【问题讨论】:
正如您在堆栈跟踪中看到的,在阅读器中打开源 PDF 已经存在问题。因此,您的问题与您删除密码的任务无关,iText 无法读取您的文件。如需更详细的分析,请分享相关 PDF。 它没有让我上传安全设置的文件或图像,但我会在这里列出。 它没有让我上传安全设置的文件或图像,但我会在这里列出它们。使用 Adobe Acrobat Pro DC v 2021.005.60020 安全方法=密码安全文档打开密码=是权限密码=否打印=高分辨率其他安全设置=允许 如需更详细的分析,请分享相关 PDF。 Adobe Acrobat 关于安全设置的意见没有帮助。 @michadev “它没有让我上传文件” - 堆栈溢出不允许上传非图像(并且图像只有在具有一定的最小值时才能显示代表)。通常通过将 PDF 上传到公共文件共享(例如,谷歌驱动器或投递箱上的公共共享)并在此处共享链接来共享 PDF。 【参考方案1】:public class DecryptPdf3
public static final String SRC = "./src/main/resources/pdfs/THISISATEST_PWP.pdf";
public static final String DEST = "./target/sandbox/security/decrypt_pdf3.pdf";
public static final String USER_PASSWORD = "password";
public static void main(String[] args) throws Exception
File file = new File(DEST);
file.getParentFile().mkdirs();
new DecryptPdf3().manipulatePdf(DEST);
protected void manipulatePdf(String dest) throws Exception
try (PdfDocument pdfDoc = new PdfDocument(
new PdfReader(SRC, new ReaderProperties().setPassword(USER_PASSWORD.getBytes())).setUnethicalReading(true),
new PdfWriter(dest)
))
【讨论】:
以上是关于如何使用 iText 7 删除受密码保护的 pdf 中的密码的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 iText 将没有所有者密码的仅用户密码添加到 PDF