如何使用 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。 它没有让我上传安全设置的文件或图像,但我会在这里列出。 它没有让我上传安全设置的文件或图像,但我会在这里列出它们。使用 Adob​​e 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

使用 itext 7 在 PDF 中添加新页面

我可以使用 iText 重置忘记的所有者密码吗?

如何从iText 7中的PDF格式的轮廓/书签访问矩形,拟合类型,缩放,页码

Itext 7使用pdf中的材料ui图标

使用 iText 7 和 C# 在可访问的 pdf 中将标题添加为 H1