gue*_*tli 2 python pdf pdf-manipulation pypdf2
我想将元数据键值对添加到pdf文件的元数据中.
我找到了几年的答案,但我认为这是复杂的方法.我想今天有一种更简单的方法:https://stackoverflow.com/a/3257340/633961
我没有和pypdf2结婚,如果有更简单的方法,那我就这样走吧?
你可以使用pdfrw
pip install pdfrw
Run Code Online (Sandbox Code Playgroud)
然后运行
from pdfrw import PdfReader, PdfWriter
trailer = PdfReader("myfile.pdf")
trailer.Info.WhoAmI = "Tarun Lalwani"
PdfWriter("edited.pdf", trailer=trailer).write()
Run Code Online (Sandbox Code Playgroud)
然后检查 PDF 自定义属性
当问题明确要求PyPDF2时,我很惊讶地发现没有PyPDF2的代码示例,所以这里是:
from PyPDF2 import PdfFileReader, PdfFileWriter
fin = open('source.pdf', 'rb')
reader = PdfFileReader(fin)
writer = PdfFileWriter()
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()
Run Code Online (Sandbox Code Playgroud)
小智 7
在 Python 中编辑 PDF 元数据有多种方法,但一种方法优于其他方法。
我将首先讨论其他看起来正确但有副作用的方法。如果您没有足够的时间并使用正确的方法,请跳到本文末尾。
弱点是没有维护包。
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)
Run Code Online (Sandbox Code Playgroud)
pdfrw 可以很容易地完成,而不会丢失非显示信息,例如书签。
PyPDF2 比 pdfrw 支持更多的 PDF 功能,包括解密和更多类型的解压。
弱点是 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()
Run Code Online (Sandbox Code Playgroud)
使用PdfFileWriter创建一个新的 PDF appendPagesFromReader(),然后通过 获取旧内容,然后addMetadata()。
似乎我们不能直接修改 PDF 元数据,所以我们添加所有页面和元数据,然后写出一个新文件。
在 Python 中编辑 PDF 元数据的正确方法。
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()
Run Code Online (Sandbox Code Playgroud)
使用PdfFileMerger通过串连页append()。
append(fileobj, bookmark=None, pages=None, import_bookmarks=True)
pdfrw:另一个 Python PDF 库
读写 pdf 元数据
小智 6
建立在 Cyril N. 所说的基础上,代码运行良好,但它创建了很多“垃圾”文件,因为现在您拥有原始文件和带有元数据的文件。
我稍微更改了代码,因为我每天将在数百个文件上运行它,并且不想处理额外的清理工作:
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()
Run Code Online (Sandbox Code Playgroud)
如果您确实想将其作为新文件使用,只需在 fout 中为 pdf 使用不同的名称并保留 ab。如果您使用 wb,您将附加与原始文件相同的空白页。