Изменить метаданные 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
Я был удивлен, увидев, что нет примера кода для 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)