使用pypdf2更改pdf文件的元数据

时间:2017-10-20 13:06:17

标签: python pdf pypdf2 pdf-manipulation

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

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

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

4 个答案:

答案 0 :(得分:8)

当问题明确要求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()

答案 1 :(得分:3)

您可以使用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

答案 2 :(得分:1)

基于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,则将附加等于原始文件的空白页。

答案 3 :(得分:1)

在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 (布尔)–您可以通过将其指定为False来阻止源文档的书签的导入。

参考

pdfrw: the other Python PDF library
Reading and writing pdf metadata