Как добавить несколько вложений в PDF с PYPDF2 - PullRequest
0 голосов
/ 02 марта 2020

Я использую PYPDF2 v1.26.0, и я не могу добавить несколько вложений в PDF.

Ниже приведен мой код - я адаптировал это решение из PnkFlffyUncrn


def embed_files_in_pdf(pdf_filepath, embed_doc_filepaths):


    from PyPDF2 import PdfFileReader, PdfFileWriter
    from PyPDF2.generic import DecodedStreamObject, NameObject, DictionaryObject, createStringObject, ArrayObject


    fr = PdfFileReader(pdf_filepath,'rb')
    fw = PdfFileWriter()
    fw.appendPagesFromReader(fr)

    my_attach_files = embed_doc_filepaths
    for my_test in my_attach_files:

        with open(my_test, 'rb') as my_test_attachment:
            my_test_data = my_test_attachment.read()


        # The entry for the file
        file_entry = DecodedStreamObject()
        file_entry.setData(my_test_data)
        file_entry.update({NameObject("/Type"): NameObject("/EmbeddedFile")})
        print(get_line_no_v2(str(file_entry["/Type"])))

        # The Filespec entry
        efEntry = DictionaryObject()
        efEntry.update({ NameObject("/F"): file_entry})

        filespec = DictionaryObject()
        filespec.update({NameObject("/Type"): NameObject("/Filespec"),NameObject("/F"): createStringObject(my_test),NameObject("/EF"): efEntry})

        if "/Names" not in fw._root_object.keys():
            # No files attached yet. Create the entry for the root, as it needs a reference to the Filespec
            embeddedFilesNamesDictionary = DictionaryObject()
            embeddedFilesNamesDictionary.update({NameObject("/Names"): ArrayObject([createStringObject(my_test), filespec])})

            embeddedFilesDictionary = DictionaryObject()
            embeddedFilesDictionary.update({NameObject("/EmbeddedFiles"): embeddedFilesNamesDictionary})
            fw._root_object.update({NameObject("/Names"): embeddedFilesDictionary})
        else:
            # There are files already attached. Append the new file.
            fw._root_object["/Names"]["/EmbeddedFiles"]["/Names"].append(createStringObject(my_test))
            fw._root_object["/Names"]["/EmbeddedFiles"]["/Names"].append(filespec)



    with open(pdf_filepath + '_new.pdf','wb') as file:
        fw.write(file)


embed_files_in_pdf("my_original_pdf.pdf", ["test_doc.docx", "test_excel.xlsx", "test_txt.txt", "test_pdf.pdf"])

Результат: my_original_pdf.pdf_new.pdf будет содержать все 4 вложения в списке, но только test_do c .docx и test_excel.xlsx могут на самом деле быть открыты или взаимодействовать с любым способом при нажатии.

Кто-нибудь знает решение этой проблемы?

Если нет, есть ли другой способ сделать какую-либо часть этого (так что я могу просто грубые изменения, пока я не получу решение)?

...