使用 pypdf2 更改 pdf 文件的元数据
Change metadata of pdf file with pypdf2
我想将元数据键值对添加到 pdf 文件的元数据中。
我找到了一个几年前的答案,但我认为这太复杂了。我想今天有一个更简单的方法:
我没有和pypdf2结婚,如果有更简单的方法,那我走这条路?
您可以使用 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
reader = PdfFileReader("source.pdf")
writer = PdfFileWriter()
writer.appendPagesFromReader(reader)
metadata = reader.getDocumentInfo()
writer.addMetadata(metadata)
# Write your custom metadata here:
writer.addMetadata({"/Some": "Example"})
with open("result.pdf", "wb") as fp:
writer.write(fp)
根据 Cyril N. 的说法,代码工作正常,但它创建了很多“垃圾”文件,因为现在您有了原始文件 和 带有元数据。
我稍微更改了代码,因为我每天要 运行 处理数百个文件,不想处理额外的 clean-up:
from PyPDF2 import PdfFileReader, PdfFileWriter
reader = PdfFileReader("your_original.pdf")
writer = PdfFileWriter()
writer.appendPagesFromReader(reader)
metadata = reader.getDocumentInfo()
writer.addMetadata(metadata)
# Write your custom metadata here:
writer.addMetadata({"/Title": "this"})
with open("your_original.pdf", "ab") as fout:
# ab is append binary; if you do wb, the file will append blank pages
writer.write(fout)
如果您确实想将它作为一个新文件,只需为 fout 中的 pdf 使用不同的名称并保留 ab。如果您使用 wb,您将追加与原始文件相同的空白页。
在 Python
中编辑 PDF 元数据的正确方法
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)
pdfrw can do quite easily without losing non-display information such as bookmarks.
PyPDF2 supports more PDF features than pdfrw, including decryption and more types of decompression.
缺点是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 元数据,所以我们添加所有页面和元数据,然后写出到一个新文件中。
在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()
使用 PdfFileMerger
通过 append()
连接页面。
append(fileobj, bookmark=None, pages=None, import_bookmarks=True)
- import_bookmarks (bool) – 您可以通过将其指定为 False 来阻止导入源文档的书签。
参考资料
pdfrw: the other Python PDF library
Reading and writing pdf metadata
我想将元数据键值对添加到 pdf 文件的元数据中。
我找到了一个几年前的答案,但我认为这太复杂了。我想今天有一个更简单的方法:
我没有和pypdf2结婚,如果有更简单的方法,那我走这条路?
您可以使用 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
reader = PdfFileReader("source.pdf")
writer = PdfFileWriter()
writer.appendPagesFromReader(reader)
metadata = reader.getDocumentInfo()
writer.addMetadata(metadata)
# Write your custom metadata here:
writer.addMetadata({"/Some": "Example"})
with open("result.pdf", "wb") as fp:
writer.write(fp)
根据 Cyril N. 的说法,代码工作正常,但它创建了很多“垃圾”文件,因为现在您有了原始文件 和 带有元数据。
我稍微更改了代码,因为我每天要 运行 处理数百个文件,不想处理额外的 clean-up:
from PyPDF2 import PdfFileReader, PdfFileWriter
reader = PdfFileReader("your_original.pdf")
writer = PdfFileWriter()
writer.appendPagesFromReader(reader)
metadata = reader.getDocumentInfo()
writer.addMetadata(metadata)
# Write your custom metadata here:
writer.addMetadata({"/Title": "this"})
with open("your_original.pdf", "ab") as fout:
# ab is append binary; if you do wb, the file will append blank pages
writer.write(fout)
如果您确实想将它作为一个新文件,只需为 fout 中的 pdf 使用不同的名称并保留 ab。如果您使用 wb,您将追加与原始文件相同的空白页。
在 Python
中编辑 PDF 元数据的正确方法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)
pdfrw can do quite easily without losing non-display information such as bookmarks.
PyPDF2 supports more PDF features than pdfrw, including decryption and more types of decompression.
缺点是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 元数据,所以我们添加所有页面和元数据,然后写出到一个新文件中。
在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()
使用 PdfFileMerger
通过 append()
连接页面。
append(fileobj, bookmark=None, pages=None, import_bookmarks=True)
- import_bookmarks (bool) – 您可以通过将其指定为 False 来阻止导入源文档的书签。
参考资料
pdfrw: the other Python PDF library
Reading and writing pdf metadata