1# -*- coding: utf-8 -*- 2# Part of Odoo. See LICENSE file for full copyright and licensing details. 3 4from odoo.tests.common import TransactionCase 5from odoo.tools import pdf 6from odoo.modules.module import get_module_resource 7import io 8 9 10class TestPdf(TransactionCase): 11 """ Tests on pdf. """ 12 13 def setUp(self): 14 super().setUp() 15 file_path = get_module_resource('base', 'tests', 'minimal.pdf') 16 self.file = open(file_path, 'rb').read() 17 self.minimal_reader_buffer = io.BytesIO(self.file) 18 self.minimal_pdf_reader = pdf.OdooPdfFileReader(self.minimal_reader_buffer) 19 20 def test_odoo_pdf_file_reader(self): 21 attachments = list(self.minimal_pdf_reader.getAttachments()) 22 self.assertEqual(len(attachments), 0) 23 24 pdf_writer = pdf.PdfFileWriter() 25 pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader) 26 pdf_writer.addAttachment('test_attachment.txt', b'My awesome attachment') 27 28 attachments = list(self.minimal_pdf_reader.getAttachments()) 29 self.assertEqual(len(attachments), 1) 30 31 def test_odoo_pdf_file_writer(self): 32 attachments = list(self.minimal_pdf_reader.getAttachments()) 33 self.assertEqual(len(attachments), 0) 34 35 pdf_writer = pdf.OdooPdfFileWriter() 36 pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader) 37 38 pdf_writer.addAttachment('test_attachment.txt', b'My awesome attachment') 39 attachments = list(self.minimal_pdf_reader.getAttachments()) 40 self.assertEqual(len(attachments), 1) 41 42 pdf_writer.addAttachment('another_attachment.txt', b'My awesome OTHER attachment') 43 attachments = list(self.minimal_pdf_reader.getAttachments()) 44 self.assertEqual(len(attachments), 2) 45 46 def test_odoo_pdf_file_reader_with_owner_encryption(self): 47 pdf_writer = pdf.OdooPdfFileWriter() 48 pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader) 49 50 pdf_writer.addAttachment('test_attachment.txt', b'My awesome attachment') 51 pdf_writer.addAttachment('another_attachment.txt', b'My awesome OTHER attachment') 52 53 pdf_writer.encrypt("", "foo") 54 55 with io.BytesIO() as writer_buffer: 56 pdf_writer.write(writer_buffer) 57 encrypted_content = writer_buffer.getvalue() 58 59 with io.BytesIO(encrypted_content) as reader_buffer: 60 pdf_reader = pdf.OdooPdfFileReader(reader_buffer) 61 attachments = list(pdf_reader.getAttachments()) 62 63 self.assertEqual(len(attachments), 2) 64 65 def test_merge_pdf(self): 66 self.assertEqual(self.minimal_pdf_reader.getNumPages(), 1) 67 page = self.minimal_pdf_reader.getPage(0) 68 69 merged_pdf = pdf.merge_pdf([self.file, self.file]) 70 merged_reader_buffer = io.BytesIO(merged_pdf) 71 merged_pdf_reader = pdf.OdooPdfFileReader(merged_reader_buffer) 72 self.assertEqual(merged_pdf_reader.getNumPages(), 2) 73 merged_reader_buffer.close() 74 75 def test_branded_file_writer(self): 76 # It's not easy to create a PDF with PyPDF2, so instead we copy minimal.pdf with our custom pdf writer 77 pdf_writer = pdf.PdfFileWriter() # BrandedFileWriter 78 pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader) 79 writer_buffer = io.BytesIO() 80 pdf_writer.write(writer_buffer) 81 branded_content = writer_buffer.getvalue() 82 writer_buffer.close() 83 84 # Read the metadata of the newly created pdf. 85 reader_buffer = io.BytesIO(branded_content) 86 pdf_reader = pdf.PdfFileReader(reader_buffer) 87 pdf_info = pdf_reader.getDocumentInfo() 88 self.assertEqual(pdf_info['/Producer'], 'Odoo') 89 self.assertEqual(pdf_info['/Creator'], 'Odoo') 90 reader_buffer.close() 91 92 def tearDown(self): 93 super().tearDown() 94 self.minimal_reader_buffer.close() 95