如何使用 Python 读取存储在 PDF 文件中的属性/元数据,如标题、作者、主题和关键字?
6 回答
试试pdfminer:
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
fp = open('diveintopython.pdf', 'rb')
parser = PDFParser(fp)
doc = PDFDocument(parser)
print(doc.info) # The "Info" metadata
这是输出:
>>> [{'CreationDate': 'D:20040520151901-0500',
'Creator': 'DocBook XSL Stylesheets V1.52.2',
'Keywords': 'Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free',
'Producer': 'htmldoc 1.8.23 Copyright 1997-2002 Easy Software Products, All Rights Reserved.',
'Title': 'Dive Into Python'}]
有关更多信息,请查看本教程:用于在 Python 中提取 PDF 元数据的轻量级 XMP 解析器。
对于 Python 3,请参阅PyPDF2,其中来自 @Khaleel 的示例代码已更新为:
from PyPDF2 import PdfFileReader
pdf_toread = PdfFileReader(open("test.pdf", "rb"))
pdf_info = pdf_toread.getDocumentInfo()
print(str(pdf_info))
使用pip install PyPDF2
.
Morten Zilmer 指出:pyPdf主页说它不再维护。
我已经使用pyPdf实现了这一点。请参阅下面的示例代码。
from pyPdf import PdfFileReader
pdf_toread = PdfFileReader(open("doc2.pdf", "rb"))
pdf_info = pdf_toread.getDocumentInfo()
print(str(pdf_info))
输出:
{'/Title': u'Microsoft Word - Agnico-Eagle - Complaint (00040197-2)', '/CreationDate': u"D:20111108111228-05'00'", '/Producer': u'Acrobat Distiller 10.0.0 (Windows)', '/ModDate': u"D:20111108112409-05'00'", '/Creator': u'PScript5.dll Version 5.2.2', '/Author': u'LdelPino'}
对于 Python 3 和新的 pdfminer(pip install pdfminer3k):
import os
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfparser import PDFDocument
fp = open("foo.pdf", 'rb')
parser = PDFParser(fp)
doc = PDFDocument(parser)
parser.set_document(doc)
doc.set_parser(parser)
if len(doc.info) > 0:
info = doc.info[0]
print(info)
pikepdf提供了一种简单可靠的方法来做到这一点。
我用一堆 pdf 文件对此进行了测试,似乎有两种不同的方法可以在创建 PDF 时插入元数据。有些正在插入NUL
字节和其他乱码。Pikepdf 处理得很好。
import pikepdf
p = pikepdf.Pdf.open(r'path/to/file.pdf')
str(p.docinfo['/Author']) # mind the slash
这将返回一个字符串 - 如果你用str
. 例子:
'Normal person'
'ABC'
与其他选项比较:
- pdfminer - 没有积极维护
- pdfminer.6 - 活跃
- pdfreader - 活跃(但仍然建议您使用
easy_install
,ao) - pyPdf - 不维护
- PyPDF2 - 未维护(Phaseit, Inc. 不再关注)
- Borb - 活跃。
pdfminer.六:
pip install pdfminer.six
import pdfminer.pdfparser
import pdfminer.pdfdocument
h = open('path/to/file.pdf', 'rb')
p = pdfminer.pdfparser.PDFParser(h)
d = pdfminer.pdfparser.PDFDocument(p)
d.info[0]['Author']
这将返回一个二进制字符串,包括不可解码的字符(如果存在)。例子:
b'Normal person'
b'\xfe\xff\x00A\x00B\x00C'
(美国广播公司)
要转换为字符串:
b'Normal person'.decode()
产生字符串'Normal person'
b'\xfe\xff\x00A\x00B\x00C'.decode(encoding='utf-8', errors='ignore').replace('\x00', '')
产生字符串'ABC'
pdf阅读器
pip install pdfreader
import pdfreader
h = open(r'path/to/file.pdf', 'rb')
d = pdfreader.PDFDocument(h)
d.metadata['Author']
这将返回带有请求信息的字符串,或包含它找到的数据的十六进制表示的字符串。这也包括相同的不可解码字符。例子:
'Normal person'
'FEFF004100420043'
(美国广播公司)
然后,您首先需要检测这是否仍然是“编码的”,我认为这很麻烦。通过调用这段丑陋的代码,第二个可以成为一个合理的字符串:
s = 'FEFF004100420043'
''.join([c for c in (chr(int(s[i:i+2], 16)) for i in range(0, len(s), 2)) if c.isascii()]).replace('\x00', '')
>>> 'ABC'
鲍勃
pip install borb
import borb.pdf.pdf
h = open(r'path/to/file.pdf', 'rb')
d: borb.pdf.document.Document = borb.pdf.pdf.PDF.loads(h)
str(d.get_document_info().get_author())
这将返回一个字符串 - 如果你用str
. 加载相当大的 PDF 需要很长时间。我有一个 PDF,其中 borb 因 TypeError 异常而窒息。另请参阅borb 的专用示例 repo上的示例。
试试pdfreader 您可以访问文档目录元数据,如下所示:
from pdfreader import PDFDocument
f = open("foo.pdf", 'rb')
doc = PDFDocument(f)
metadata = doc.root.Metadata