7

我想将元数据键值对添加到 pdf 文件的元数据中。

我找到了几年前的答案,但我认为这太复杂了。我想今天有一个更简单的方法:https ://stackoverflow.com/a/3257340/633961

我没有与pypdf2结婚,如果有更简单的方法,那么我就这样走?

4

4 回答 4

17

当问题明确要求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()
于 2018-03-01T15:54:56.633 回答
10

您可以使用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 自定义属性

编辑属性

于 2017-10-24T12:36:28.627 回答
8

在 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 可以很容易地完成,而不会丢失书签等非显示信息。

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()
    

使用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:另一个 Python PDF 库
读写 pdf 元数据

于 2019-10-03T15:23:17.657 回答
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()

如果您确实想将其作为新文件,只需在 fout 中为 pdf 使用不同的名称并保留 ab。如果您使用 wb,您将附加与原始文件相同的空白页。

于 2019-06-05T17:11:07.060 回答