簡體   English   中英

使用 pypdf2 更改 pdf 文件的元數據

[英]Change metadata of pdf file with pypdf2

我想將元數據鍵值對添加到 pdf 文件的元數據中。

我找到了一個幾年前的答案,但我認為這很復雜。 我想今天有一個更簡單的方法: https : //stackoverflow.com/a/3257340/633961

我沒有和pypdf2結婚,如果有更簡單的方法,那我就走這條路?

當問題明確要求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()

你可以使用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 中編輯 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 元數據

建立在 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,您將附加與原始文件相同的空白頁。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM