def test_encryption(name, requres_pycryptodome): inputfile = os.path.join(RESOURCE_ROOT, "encryption", name) if requres_pycryptodome and not HAS_PYCRYPTODOME: with pytest.raises(DependencyError) as exc: ipdf = PyPDF2.PdfReader(inputfile) ipdf.decrypt("asdfzxcv") dd = dict(ipdf.metadata) assert exc.value.args[ 0] == "PyCryptodome is required for AES algorithm" return else: ipdf = PyPDF2.PdfReader(inputfile) if inputfile.endswith("unencrypted.pdf"): assert not ipdf.is_encrypted else: assert ipdf.is_encrypted ipdf.decrypt("asdfzxcv") assert len(ipdf.pages) == 1 dd = dict(ipdf.metadata) # remove empty value entry dd = {x[0]: x[1] for x in dd.items() if x[1]} assert dd == { "/Author": "cheng", "/CreationDate": "D:20220414132421+05'24'", "/Creator": "WPS Writer", "/ModDate": "D:20220414132421+05'24'", "/SourceModified": "D:20220414132421+05'24'", "/Trapped": "/False", }
def merge(): pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf") outline = os.path.join(RESOURCE_ROOT, "pdflatex-outline.pdf") pdf_forms = os.path.join(RESOURCE_ROOT, "pdflatex-forms.pdf") pdf_pw = os.path.join(RESOURCE_ROOT, "libreoffice-writer-password.pdf") file_merger = PyPDF2.PdfMerger() # string path: file_merger.append(pdf_path) file_merger.append(outline) file_merger.append(pdf_path, pages=PyPDF2.pagerange.PageRange(slice(0, 0))) file_merger.append(pdf_forms) # Merging an encrypted file reader = PyPDF2.PdfReader(pdf_pw) reader.decrypt("openpassword") file_merger.append(reader) # PdfReader object: file_merger.append(PyPDF2.PdfReader(pdf_path, "rb"), bookmark=True) # File handle with open(pdf_path, "rb") as fh: file_merger.append(fh) bookmark = file_merger.add_bookmark("A bookmark", 0) file_merger.add_bookmark("deeper", 0, parent=bookmark) file_merger.add_metadata({"author": "Martin Thoma"}) file_merger.add_named_destination("title", 0) file_merger.set_page_layout("/SinglePage") file_merger.set_page_mode("/UseThumbs") tmp_path = "dont_commit_merged.pdf" file_merger.write(tmp_path) file_merger.close() # Check if bookmarks are correct reader = PyPDF2.PdfReader(tmp_path) assert [ el.title for el in reader._get_outlines() if isinstance(el, Destination) ] == [ "A bookmark", "Foo", "Bar", "Baz", "Foo", "Bar", "Baz", "Foo", "Bar", "Baz", "True", ] # Clean up os.remove(tmp_path)
def test_both_password(name, user_passwd, owner_passwd): from PyPDF2 import PasswordType inputfile = os.path.join(RESOURCE_ROOT, "encryption", name) ipdf = PyPDF2.PdfReader(inputfile) assert ipdf.is_encrypted assert ipdf.decrypt(user_passwd) == PasswordType.USER_PASSWORD assert ipdf.decrypt(owner_passwd) == PasswordType.OWNER_PASSWORD assert len(ipdf.pages) == 1
def test_get_page_of_encrypted_file_new_algorithm(pdffile, password): """ Check if we can read a page of an encrypted file. This is a regression test for issue 327: IndexError for get_page() of decrypted file """ path = os.path.join(RESOURCE_ROOT, pdffile) PyPDF2.PdfReader(path, password=password).pages[0]
def test_encryption_merge(names): pdf_merger = PyPDF2.PdfMerger() files = [os.path.join(RESOURCE_ROOT, "encryption", x) for x in names] pdfs = [PyPDF2.PdfReader(x) for x in files] for pdf in pdfs: if pdf.is_encrypted: pdf.decrypt("asdfzxcv") pdf_merger.append(pdf) # no need to write to file pdf_merger.close()
def test_merge(): pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf") outline = os.path.join(RESOURCE_ROOT, "pdflatex-outline.pdf") pdf_forms = os.path.join(RESOURCE_ROOT, "pdflatex-forms.pdf") pdf_pw = os.path.join(RESOURCE_ROOT, "libreoffice-writer-password.pdf") merger = PyPDF2.PdfMerger() # string path: merger.append(pdf_path) merger.append(outline) merger.append(pdf_path, pages=PyPDF2.pagerange.PageRange(slice(0, 0))) merger.append(pdf_forms) merger.merge(0, pdf_path, import_bookmarks=False) # Merging an encrypted file reader = PyPDF2.PdfReader(pdf_pw) reader.decrypt("openpassword") merger.append(reader) # PdfReader object: merger.append(PyPDF2.PdfReader(pdf_path), bookmark="foo") # File handle with open(pdf_path, "rb") as fh: merger.append(fh) bookmark = merger.add_bookmark("A bookmark", 0) bm2 = merger.add_bookmark("deeper", 0, parent=bookmark, italic=True, bold=True) merger.add_bookmark("Let's see", 2, bm2, (255, 255, 0), True, True, "/FitBV", 12) merger.add_bookmark("The XYZ fit", 0, bookmark, (255, 0, 15), True, True, "/XYZ", 10, 20, 3) merger.add_bookmark("The FitH fit", 0, bookmark, (255, 0, 15), True, True, "/FitH", 10) merger.add_bookmark("The FitV fit", 0, bookmark, (255, 0, 15), True, True, "/FitV", 10) merger.add_bookmark("The FitR fit", 0, bookmark, (255, 0, 15), True, True, "/FitR", 10, 20, 30, 40) merger.add_bookmark("The FitB fit", 0, bookmark, (255, 0, 15), True, True, "/FitB") merger.add_bookmark("The FitBH fit", 0, bookmark, (255, 0, 15), True, True, "/FitBH", 10) merger.add_bookmark("The FitBV fit", 0, bookmark, (255, 0, 15), True, True, "/FitBV", 10) found_bm = merger.find_bookmark("nothing here") assert found_bm is None found_bm = merger.find_bookmark("foo") assert found_bm == [9] merger.add_metadata({"author": "Martin Thoma"}) merger.add_named_destination("title", 0) merger.set_page_layout("/SinglePage") merger.set_page_mode("/UseThumbs") tmp_path = "dont_commit_merged.pdf" merger.write(tmp_path) merger.close() # Check if bookmarks are correct reader = PyPDF2.PdfReader(tmp_path) assert [ el.title for el in reader._get_outlines() if isinstance(el, Destination) ] == [ "A bookmark", "Foo", "Bar", "Baz", "Foo", "Bar", "Baz", "Foo", "Bar", "Baz", "foo", ] # TODO: There seem to be no destinations for those links? # Clean up os.remove(tmp_path)