>>> 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