You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@pdfbox.apache.org by Laurent III <jo...@yahoo.fr> on 2012/04/27 17:11:36 UTC

Password openning error with PDF protected by PDFBox

Hello,

After hours of vain research I need the help of the pdfbox community.

Here is my problem:

I have a pdf document produced by XEP4.19, which have metadata and password protection. I need to open this document, modify some page (replace embedded graphics page by their original PDF graphic file) and then save the document.

In order to achieve this I create a new document in which I import the text pages of the original document and import the graphic pdf page when needed. Then I save then close the new document.
Here is my java code (I'm using pdfbox 1.6.0):

public void testPdfBox() throws Exception {

        final File originalPDF = PDFBOX_SAMPLE;
        final PDFParser parser = new PDFParser(new BufferedInputStream(new FileInputStream(
                originalPDF)));
        parser.parse();

        final PDDocument originialPdfDoc = parser.getPDDocument();

        // Open the protection on the orig doc if necessary.
        final boolean isOriginalDocEncrypted = originialPdfDoc.isEncrypted();
        if (isOriginalDocEncrypted) {
            originialPdfDoc.openProtection(new StandardDecryptionMaterial("secret"));
        }

        final PDDocument updatedDoc = new PDDocument();

        final List<PDPage> allPages = originialPdfDoc.getDocumentCatalog().getAllPages();
        final Iterator<PDPage> it = allPages.iterator();
        int i = 0;
        while (it.hasNext()) {
            i++;
            final PDPage oldPage = it.next();
            if (i == PDFBOX_PAGE_NB) {
                // Append the graphic file.
                final PDFParser graphParser = new PDFParser(new BufferedInputStream(
                        new FileInputStream(PDFBOX_PDF_GRAPH)));
                graphParser.parse();
                final PDDocument graphDoc = graphParser.getPDDocument();
                final List<PDPage> graphPageList = graphDoc.getDocumentCatalog().getAllPages();
                final PDPage page = graphPageList.iterator().next();
                updatedDoc.addPage(page);
            } else {
                updatedDoc.importPage(oldPage);
            }
        }

        // Set the metadata of the 'old' PDF to the new one
        updatedDoc.setDocumentInformation(originialPdfDoc.getDocumentInformation());
        updatedDoc.setEncryptionDictionary(originialPdfDoc.getEncryptionDictionary());

        if (isOriginalDocEncrypted) {
            final AccessPermission originalAccessPermission = originialPdfDoc.getSecurityHandler()
                    .getCurrentAccessPermission();
            final StandardProtectionPolicy originalProtectionPolicy = new StandardProtectionPolicy(
                    "secret", null, originalAccessPermission);
            updatedDoc.protect(originalProtectionPolicy);
        }

        updatedDoc.save(new BufferedOutputStream(new FileOutputStream(PDFBOX_RESULT)));
        updatedDoc.close();
        originialPdfDoc.close();

        // Only for test purpose.
        openPDFDoc(PDFBOX_RESULT);

    }

    private final void openPDFDoc(final File pdfFile) throws Exception {
        final File originalPDF = pdfFile;
        final PDFParser parser = new PDFParser(new BufferedInputStream(new FileInputStream(
                originalPDF)));
        parser.parse();

        final PDDocument originialPdfDoc = parser.getPDDocument();

        // Open the protection on the orig doc if necessary.
        final boolean isOriginalDocEncrypted = originialPdfDoc.isEncrypted();
        if (isOriginalDocEncrypted) {
            originialPdfDoc.openProtection(new StandardDecryptionMaterial("secret"));
        }
    }


The new document is as I expect: correct pages, correct metadata,... but PDFBox is not able to open the new document. I get the following exception:
org.apache.pdfbox.exceptions.CryptographyException: Error: The supplied password does not match either the owner or user password in the document.
    at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.decryptDocument(StandardSecurityHandler.java:239)
    at org.apache.pdfbox.pdmodel.PDDocument.openProtection(PDDocument.java:1325)

Here are some additional observations:
I can open the document with adobe reader. File/Properties/Security show the correct permissions, but if I look in the "Show Details..." then the permissions are not the same! everything is allowed...The original PDF document had the same permissions in both the Security tab and the "Show Details..." window.

pdftk is not able to open the document even if I give the correct password or if I give it no psswd. I get the following:
Error: Failed to open PDF file: 
   /home/[...]/newDocument.pdf
   OWNER PASSWORD REQUIRED, but not given (or incorrect)
Done.  Input errors, so no output created.

 I you need any clarification just let me know.
Any help will be really appreciated.
Laurent.