【问题标题】:Change metadata of pdf file with pypdf2使用 pypdf2 更改 pdf 文件的元数据
【发布时间】:2018-04-01 15:54:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: python pdf pypdf2 pdf-manipulation


    【解决方案1】:

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

    【讨论】:

    • 是的,它奏效了。在我的情况下,我需要添加一个不是有效 python 名称的键,但它的工作方式如下:setattr(reader.Info, 'original-files', value)。谢谢
    【解决方案2】:

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

    【讨论】:

    • 这对我不起作用。 appendPageFromReader 只是添加正确数量的空白页。
    【解决方案3】:

    基于 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,您将附加与原始文件相同的空白页。

    【讨论】:

      【解决方案4】:

      在 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: the other Python PDF library
      Reading and writing pdf metadata

      【讨论】:

      • 使用 pypdf2 时,我的书签会偏移,我的目录会丢失所有链接。
      • 我用许多不同制作的 PDF(Acrobat、Libre 等)测试了正确的方法:在没有一种情况下,输出文件包含 pdf 的正文内容。它是空的。但更糟糕的是,pdf_merger 部分破坏了输入文件,使其成为 0 kb 僵尸。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-19
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多