如何使用Python读取存储在PDF文件中的属性/元数据,如标题、作者、主题和关键字?
xqk2d5yq1#
尝试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'}]
有关详细信息,请参阅本教程:A lightweight XMP parser for extracting PDF metadata in Python.
9njqaruj2#
对于Python 3,请参见PyPDF2,其中@Khaleel的示例代码更新为:
from PyPDF2 import PdfReader reader = PdfReader("test.pdf") pdf_info = reader.metadata print(str(pdf_info))
使用pip install PyPDF2进行安装。
pip install PyPDF2
n6lpvg4x3#
对于Python 3和新的pdfminer(pip安装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)
nbysray54#
莫滕·齐尔默指出:pyPdf homepage说它不再被维护。我已经使用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'}
2ledvvac5#
pikepdf提供了一种简单可靠的方法来实现这一点。我用一堆pdf文件测试了这个方法,在创建PDF时似乎有两种不同的插入元数据的方法,有些是插入NUL字节和其他无用信息,Pikepdf处理这两种方法都很好。
NUL
import pikepdf p = pikepdf.Pdf.open(r'path/to/file.pdf') str(p.docinfo['/Author']) # mind the slash
返回一个字符串-如果你用str Package 它的话。
str
'Normal person'
'ABC'
与其他选项比较:
easy_install
PyPDF2==3.0.0
pypdf==3.1.0
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()
b'\xfe\xff\x00A\x00B\x00C'.decode(encoding='utf-8', errors='ignore').replace('\x00', '')
pip install pdfreader
import pdfreader h = open(r'path/to/file.pdf', 'rb') d = pdfreader.PDFDocument(h) d.metadata['Author']
这将返回包含所请求信息的字符串,或者包含所找到数据的十六进制表示形式的字符串。这也包括相同的不可解码字符。例如:
'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 Package 它的话。加载一个大的PDF需要很长时间。我有一个PDF,borb在上面遇到了一个TypeError异常。也可以参见borb的专用示例repo上的示例。
iibxawm46#
尝试pdfreader您可以访问文档目录元数据如下:
from pdfreader import PDFDocument f = open("foo.pdf", 'rb') doc = PDFDocument(f) metadata = doc.root.Metadata
6条答案
按热度按时间xqk2d5yq1#
尝试pdfminer:
下面是输出:
有关详细信息,请参阅本教程:A lightweight XMP parser for extracting PDF metadata in Python.
9njqaruj2#
对于Python 3,请参见PyPDF2,其中@Khaleel的示例代码更新为:
使用
pip install PyPDF2
进行安装。n6lpvg4x3#
对于Python 3和新的pdfminer(pip安装pdfminer3k):
nbysray54#
莫滕·齐尔默指出:pyPdf homepage说它不再被维护。
我已经使用pyPdf实现了这个功能,请参见下面的示例代码。
输出:
2ledvvac5#
pikepdf提供了一种简单可靠的方法来实现这一点。
我用一堆pdf文件测试了这个方法,在创建PDF时似乎有两种不同的插入元数据的方法,有些是插入
NUL
字节和其他无用信息,Pikepdf处理这两种方法都很好。返回一个字符串-如果你用
str
Package 它的话。'Normal person'
'ABC'
与其他选项比较:
easy_install
,a.o.)PyPDF2==3.0.0
和pypdf==3.1.0
本质上是相同的,但是在pypdf中继续开发Pdf矿工六:
pip install pdfminer.six
这将返回一个二进制字符串,包括不可解码的字符(如果存在)。
b'Normal person'
b'\xfe\xff\x00A\x00B\x00C'
(ABC)要转换为字符串:
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
这将返回包含所请求信息的字符串,或者包含所找到数据的十六进制表示形式的字符串。这也包括相同的不可解码字符。例如:
'Normal person'
'FEFF004100420043'
(ABC)你首先需要检测这个字符串是否仍然是“已编码的”,我认为这是一个相当麻烦的问题,其次可以通过调用下面这段丑陋的代码使它成为一个合理的字符串:
博布
pip install borb
这将返回一个字符串-如果你用
str
Package 它的话。加载一个大的PDF需要很长时间。我有一个PDF,borb在上面遇到了一个TypeError异常。也可以参见borb的专用示例repo上的示例。iibxawm46#
尝试pdfreader您可以访问文档目录元数据如下: