Example #1
0
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",
    }
Example #2
0
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)
Example #3
0
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
Example #4
0
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]
Example #5
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()
Example #6
0
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)