From 55c8a627acbb0b712d4365f4e2bb29ea653dd6a2 Mon Sep 17 00:00:00 2001 From: "Douglas C. R. Paes" Date: Wed, 23 Oct 2019 16:02:57 -0300 Subject: [PATCH] Decrypt PDF files before attempting appending new pages It was found that encrypted PDFs are not "appendable" by pdfbox, so instead of simply failing, it was included an attempt to decrypt such PDFs using an empty password. --- .../pdftoolkit/service/PDFToolkitServiceImpl.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pdf-toolkit-repo/src/main/java/org/alfresco/extension/pdftoolkit/service/PDFToolkitServiceImpl.java b/pdf-toolkit-repo/src/main/java/org/alfresco/extension/pdftoolkit/service/PDFToolkitServiceImpl.java index 154813e..7d8c3c5 100644 --- a/pdf-toolkit-repo/src/main/java/org/alfresco/extension/pdftoolkit/service/PDFToolkitServiceImpl.java +++ b/pdf-toolkit-repo/src/main/java/org/alfresco/extension/pdftoolkit/service/PDFToolkitServiceImpl.java @@ -53,6 +53,7 @@ import org.apache.pdfbox.multipdf.PDFMergerUtility; import org.apache.pdfbox.multipdf.Splitter; import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException; import org.springframework.extensions.surf.util.I18NUtil; import com.itextpdf.text.Document; @@ -125,6 +126,9 @@ public NodeRef appendPDF(NodeRef targetNodeRef, Map params pdf = PDDocument.load(is); pdfTarget = PDDocument.load(tis); + pdf = decryptPdf(pdfTarget, is); + pdfTarget = decryptPdf(pdfTarget, tis); + // Append the PDFs PDFMergerUtility merger = new PDFMergerUtility(); merger.appendDocument(pdfTarget, pdf); @@ -216,6 +220,17 @@ public NodeRef appendPDF(NodeRef targetNodeRef, Map params return destinationNode; } + + private PDDocument decryptPdf(PDDocument pdf, InputStream tis) throws IOException, InvalidPasswordException { + // if the document is encrypted, try to remove its protection by using the "" (EMPTY) password + // as an attempt before failing during the append operation + if(pdf.isEncrypted()) { + pdf.close(); + pdf = PDDocument.load(tis, ""); + pdf.setAllSecurityToBeRemoved(true); + } + return pdf; + } @Override public NodeRef encryptPDF(NodeRef targetNodeRef, Map params)