diff --git a/addons/account_edi/models/account_edi_format.py b/addons/account_edi/models/account_edi_format.py index 93d74840e69..9367b22a0fa 100644 --- a/addons/account_edi/models/account_edi_format.py +++ b/addons/account_edi/models/account_edi_format.py @@ -297,8 +297,11 @@ class AccountEdiFormat(models.Model): return to_process # Process embedded files. - for xml_name, content in pdf_reader.getAttachments(): - to_process.extend(self._decode_xml(xml_name, content)) + try: + for xml_name, content in pdf_reader.getAttachments(): + to_process.extend(self._decode_xml(xml_name, content)) + except NotImplementedError as e: + _logger.warning("Unable to access the attachments of %s. Tried to decrypt it, but %s." % (filename, e)) # Process the pdf itself. to_process.append({ diff --git a/odoo/addons/base/tests/test_pdf.py b/odoo/addons/base/tests/test_pdf.py index 6954ca4a689..6f1368e40d0 100644 --- a/odoo/addons/base/tests/test_pdf.py +++ b/odoo/addons/base/tests/test_pdf.py @@ -43,6 +43,25 @@ class TestPdf(TransactionCase): attachments = list(self.minimal_pdf_reader.getAttachments()) self.assertEqual(len(attachments), 2) + def test_odoo_pdf_file_reader_with_owner_encryption(self): + pdf_writer = pdf.OdooPdfFileWriter() + pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader) + + pdf_writer.addAttachment('test_attachment.txt', b'My awesome attachment') + pdf_writer.addAttachment('another_attachment.txt', b'My awesome OTHER attachment') + + pdf_writer.encrypt("", "foo") + + with io.BytesIO() as writer_buffer: + pdf_writer.write(writer_buffer) + encrypted_content = writer_buffer.getvalue() + + with io.BytesIO(encrypted_content) as reader_buffer: + pdf_reader = pdf.OdooPdfFileReader(reader_buffer) + attachments = list(pdf_reader.getAttachments()) + + self.assertEqual(len(attachments), 2) + def test_merge_pdf(self): self.assertEqual(self.minimal_pdf_reader.getNumPages(), 1) page = self.minimal_pdf_reader.getPage(0) diff --git a/odoo/tools/pdf.py b/odoo/tools/pdf.py index 66608c4b1ff..6929e2684ab 100644 --- a/odoo/tools/pdf.py +++ b/odoo/tools/pdf.py @@ -77,7 +77,14 @@ PdfFileReader.__init__ = lambda self, stream, strict=True, warndest=None, overwr class OdooPdfFileReader(PdfFileReader): # OVERRIDE of PdfFileReader to add the management of multiple embedded files. + ''' Returns the files inside the PDF. + :raises NotImplementedError: if document is encrypted and uses an unsupported encryption method. + ''' def getAttachments(self): + if self.isEncrypted: + # If the PDF is owner-encrypted, try to unwrap it by giving it an empty user password. + self.decrypt('') + if not self.trailer["/Root"].get("/Names", {}).get("/EmbeddedFiles", {}).get("/Names"): return [] for i in range(0, len(self.trailer["/Root"]["/Names"]["/EmbeddedFiles"]["/Names"]), 2):