Изменить метаданные PDF-файла с pypdf2

Я хочу добавить пару ключ-значение метаданных в метаданные файла PDF.

Я нашел ответ несколько лет назад, но я думаю, что это сложно. Я думаю, что сегодня есть более простой способ: /questions/10854764/izmenit-metadannyie-pdf-fajla-s-pypdf/10854771#10854771

Я не женат на pypdf2, если есть более простой путь, то я пойду по этому пути?

5 ответов

Решение

Вы можете сделать это с помощью pdfrw

pip install pdfrw

Тогда беги

from pdfrw import PdfReader, PdfWriter   
trailer = PdfReader("myfile.pdf")    
trailer.Info.WhoAmI = "Tarun Lalwani"    
PdfWriter("edited.pdf", trailer=trailer).write()

А затем проверьте пользовательские свойства PDF

EditedProperties

Я был удивлен, увидев, что нет примера кода для PyPDF2, когда вопросы явно задают PyPDF2, так что вот оно:

from PyPDF2 import PdfFileReader, PdfFileWriter

fin = open('source.pdf', 'rb')
reader = PdfFileReader(fin)

writer.appendPagesFromReader(reader)
metadata = reader.getDocumentInfo()
writer.addMetadata(metadata)

# Write your custom metadata here:
writer.addMetadata({
    '/Some': 'Example'
})

fout = open('result.pdf', 'wb')
writer.write(fout)

fin.close()
fout.close()

Правильный способ редактирования метаданных PDF в Python

Есть несколько способов редактировать метаданные PDF в Python, но один способ лучше других.

Я начну с обсуждения других способов, которые кажутся правильными, но имеют побочные эффекты. Если у вас мало времени, перейдите к концу этой статьи и просто используйте правильный способ.

Слабость - упаковка не поддерживается.

from pdfrw import PdfReader, PdfWriter, PdfDict

if __name__ == '__main__':
    pdf_reader = PdfReader('old.pdf')
    metadata = PdfDict(Author='Someone', Title='PDF in Python')
    pdf_reader.Info.update(metadata)
    PdfWriter().write('new.pdf', pdf_reader)

pdfrw может довольно легко обойтись без потери неотображаемой информации, такой как закладки.

PyPDF2 поддерживает больше функций PDF, чем pdfrw, включая расшифровку и другие типы распаковки.


Слабым местом PDF является то, что он не сохраняет контуры (закладки).

import pprint

from PyPDF2 import PdfFileReader, PdfFileWriter

if __name__ == '__main__':
    file_in = open('old.pdf', 'rb')
    pdf_reader = PdfFileReader(file_in)
    metadata = pdf_reader.getDocumentInfo()
    pprint.pprint(metadata)

    pdf_writer = PdfFileWriter()
    pdf_writer.appendPagesFromReader(pdf_reader)
    pdf_writer.addMetadata({
        '/Author': 'Someone',
        '/Title': 'PDF in Python'
    })
    file_out = open('new.pdf', 'wb')
    pdf_writer.write(file_out)

    file_in.close()
    file_out.close()
    

С помощью PdfFileWriter создать новый PDF-файл и получить старое содержимое через appendPagesFromReader(), тогда addMetadata().

Похоже, что мы не можем напрямую изменять метаданные PDF, поэтому мы добавляем все страницы и метаданные, а затем записываем их в новый файл.


Правильный способ редактирования метаданных PDF в Python.

import pprint

from PyPDF2 import PdfFileReader, PdfFileMerger

if __name__ == '__main__':
    file_in = open('old.pdf', 'rb')
    pdf_reader = PdfFileReader(file_in)
    metadata = pdf_reader.getDocumentInfo()
    pprint.pprint(metadata)

    pdf_merger = PdfFileMerger()
    pdf_merger.append(file_in)
    pdf_merger.addMetadata({
        '/Author': 'Someone',
        '/Title': 'PDF in Python'
    })
    file_out = open('new.pdf', 'wb')
    pdf_merger.write(file_out)

    file_in.close()
    file_out.close()
    

С помощью PdfFileMerger объединить страницы через append().

append(fileobj, bookmark=None, pages=None, import_bookmarks=True)

  • import_bookmarks (bool) - вы можете запретить импорт закладок исходного документа, указав это как False.

Ссылки

pdfrw: другая библиотека PDF Python
Чтение и запись метаданных PDF

Основываясь на том, что сказал Сирил Н., код работает нормально, но создает много "мусорных" файлов, поскольку теперь у вас есть исходный файл и файл с метаданными.

Я немного изменил код, так как буду запускать его с сотнями файлов в день и не хочу заниматься дополнительной очисткой:

from PyPDF2 import PdfFileReader, PdfFileWriter

fin = open('your_original.pdf', 'rb')
reader = PdfFileReader(fin)
writer = PdfFileWriter()

writer.appendPagesFromReader(reader)
metadata = reader.getDocumentInfo()
writer.addMetadata(metadata)

# Write your custom metadata here:
writer.addMetadata({
    '/Title': 'this'
})

fout = open('your_original.pdf', 'ab') #ab is append binary; if you do wb, the file will append blank pages
writer.write(fout)

fin.close()
fout.close()

Если вы хотите, чтобы это был новый файл, просто используйте другое имя для pdf в fout и сохраните ab. Если вы используете wb, вы добавите пустые страницы, равные исходному файлу.

Используйте pypdf (PyPDF2 устарел)

Я сопровождаю обе библиотеки.

Вот пример того, как добавить метаданные в данный документ с помощью pypdf:

      from pypdf import PdfWriter

writer = PdfWriter(clone_from="source.pdf")
writer.add_metadata(
    {
        "/Author": "Martin",
        "/Producer": "Libre Writer",
        "/Title": "Title",
        "/Subject": "Subject",
        "/Keywords": "Keywords",
        "/Creator": "Creator",
        "/CustomField": "CustomField",
    }
)

with open("result.pdf", "wb") as fp:
    writer.write(fp)
Другие вопросы по тегам