>>> from env_helper import info; info()
页面更新时间: 2024-04-05 10:31:28
运行环境:
Linux发行版本: Debian GNU/Linux 12 (bookworm)
操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
Python版本: 3.11.2
4.6. 使用 pdfminer3k
模块提取PDF文件内容¶
pdfminer3k是pdfminer的Python 3接口。 PDFMiner是用于从PDF文档提取信息的工具。 与其他PDF相关工具不同,它完全专注于获取和分析文本数据。 PDFMiner允许获取页面中文本的确切位置以及其他信息,例如字体或线条。 它包括一个PDF转换器,可以将PDF文件转换为其他文本格式(例如HTML)。
注意: 测试发现
pdfminer3
模块仅支持全英文文档。使用包含中文的 PDF 会报错。
4.6.1. 安装¶
要注意这里的模块名称, 有 pdfminer
, 还有 pdfminer3
。 在
Debian / Ubuntu 仓储库中提供的是 pdfminer
模块,使用 pdfminer3
需要建立虚拟环境然后安装。
pip install pdfminer3k
尽管有说“PDFMiner在python2中名为PDFMiner,在python3中名为PDFMiner3k”,但是运行发现这两个库有一些差异。
4.6.2. 查看文档内容¶
我们读取一个本地文件,作为示例:
>>> from pdfminer.pdfparser import PDFParser, PDFDocument
>>> from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
>>> from pdfminer.pdfdevice import PDFDevice
>>> from pdfminer.converter import PDFPageAggregator
>>> from pdfminer.layout import LAParams
>>> fp = open('./xx_mark.pdf','rb')
创建一个与文档关联的解释器
>>> parse = PDFParser(fp)
PDF文档的对象
>>> doc = PDFDocument()
连接解释器和文档对象
>>> parse.set_document(doc)
>>> doc.set_parser(parse)
初始化文档,当前文档没有密码,设为空字符串
>>> doc.initialize("")
创建PDF资源管理器
>>> resource = PDFResourceManager()
参数分析器
>>> laparam = LAParams()
创建一个聚合器
>>> device = PDFPageAggregator(resource, laparams=laparam)
创建PDF页面解释器
>>> interpreter = PDFPageInterpreter(resource, device)
输出
>>> doc
<pdfminer.pdfparser.PDFDocument at 0x7f43d5b19f90>
>>> res=[]
>>> for page in doc.get_pages():
>>> interpreter.process_page(page)
>>> # print(device.get_text())
>>>
>>> layout = device.get_result()
>>> for cnt in layout:
>>> if hasattr(cnt,"get_text"):
>>> print(cnt.get_text().strip())
H ello
H ello
H ello
H ello
>>> res=[]
>>> for page in doc.get_pages():
>>> interpreter.process_page(page)
>>> layout = device.get_result()
>>> for out in layout:
>>> res.append(out)
>>> for i in res[:3]:
>>> print(i.get_text())
H ello
H ello
H ello
4.6.3. 命令行工具¶
与其他的库不太相同,在命令行可以直接使用PDFMiner工具,PDFMiner带有两个方便的工具: pdf2txt.py和dumppdf.py。
pdf2txt.py¶
pdf2txt.py从PDF文件中提取文本内容。它提取所有要以编程方式呈现的文本,即以ASCII或Unicode字符串表示的文本。它不能识别绘制为需要光学字符识别的图像的文本。它还提取每个文本部分的相应位置,字体名称,字体大小,书写方向(水平或垂直)。当访问受限制的PDF文档时,需要提供密码。您不能从没有提取权限的PDF文档中提取任何文本。
注意: 并非PDF中的所有字符都可以安全地转换为Unicode。转换中文可能会乱码。
主要参数如下:
o filename
指定输出文件名。默认情况下,它将以文本格式将提取的内容打印到stdout。p pageno[,pageno,...]
指定要提取的页码的逗号分隔列表。页码从1开始。默认情况下,它从所有页面提取文本。c codec
指定输出编解码器。t type
指定输出格式。当前支持以下格式。text:TEXT格式。(默认)
html:HTML格式。不建议将其用于提取目的,因为标记很乱。
xml:XML格式。提供最多的信息。
tag:“标记的PDF”格式。带标签的PDF具有自己的内容,并用类似HTML的标签注释。pdf2txt尝试提取其内容流,而不是推断其文本位置。此处使用的标签在PDF规范中定义(。
I image_directory
指定用于图像提取的输出目录。当前仅支持JPEG图像。
将文本提取为文件名为output.html的HTML文件
pdf2txt.py -o output.html aaa.pdf
F boxes_flow
指定确定文本顺序时文本的水平和垂直位置的重要性。该值应在-1.0(仅适用于水平位置)至+1.0(仅适用于垂直位置)的范围内。当该值超出范围(例如+2)时,将使用更简单的排序规则。默认值为0.5。C
禁止对象缓存。这将减少内存消耗,但也会减慢该过程。n
抑制布局分析。A
强制对所有文本字符串(包括图形中包含的文本)执行布局分析。V
允许垂直写入检测。Y layout_mode
指定应如何保留页面布局。(当前仅适用于HTML格式。)exact :保留每个字符的确切位置(大而混乱的HTML)。
normal:保留每个文本块中的位置和换行符。(默认)
loose :保留每个文本块的整体位置。
以垂直书写方式提取HTML文件
pdf2txt.py -V -c -o output.html aaa.pdf
E extractdir
指定嵌入式文件的提取目录。s scale
指定输出比例。只能以HTML格式使用。m maxpages
指定要提取的最大页面数。默认情况下,它提取文档中的所有页面。P password
提供访问PDF内容的用户密码。d
增加调试级别。
从加密的PDF文件中提取文本
pdf2txt.py -P mypassword -o output.txt aaa.pdf
dumppdf.py¶
dumppdf.py以伪XML格式转储PDF文件的内部内容。该程序主要用于调试目的,但也可以提取一些有意义的内容(例如图像)。
转储所有标题和内容
dumppdf.py -a foo.pdf
主要参数如下:
a
指示转储所有对象。默认情况下,它仅打印文档预告片(如标题)。i objno,objno, ...
指定要显示的PDF对象ID。接受逗号分隔的ID或多个-i选项。p pageno,pageno, ...
指定要提取的页码。接受逗号分隔的页码或多个-p选项。请注意页码从1开始,而不是零。r
(row)b
(二进制)t
(文本) 指定流内容的输出格式。由于流对象的内容可能很大,因此,如果未指定上述任何选项,则将其忽略。 如果-r
选择,“原始”流内容将不进行解压缩而转储。使用-boption
时,解压缩的内容将作为二进制blob转储。使用-t
选项,将解压缩的内容以文本格式转储,类似于repr()
方式。如果指定 -r或-b选项,则不会显示任何流头,以便于将其保存到文件中。
转储目录
dumppdf.py -T foo.pdf
T
显示目录。E directory
将pdf中的嵌入式文件提取到给定目录中。P password
提供访问PDF内容的用户密码。d
增加调试级别。
提取JPEG图像
dumppdf.py -r -i6 foo.pdf > pic.jpeg