Я использую 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 могут на самом деле быть открыты или взаимодействовать с любым способом при нажатии.
Кто-нибудь знает решение этой проблемы?
Если нет, есть ли другой способ сделать какую-либо часть этого (так что я могу просто грубые изменения, пока я не получу решение)?