【指南】PyMuPDF:从多列页面中提取文本

2024年07月04日 由 alex 发表 433 0

简介

本文将教你如何使用 PyMuPDF 从多栏页面中提取文本。在报纸或科学文章中,经常会遇到文本出现在多栏中的页面。


首先,我们将确保你有一个包含所有必要组件的 Python 编程环境。


对于实际的文本提取,我们将提供所需的 Python 源代码和一些 PDF 示例。当你执行这些程序时,它们将创建文本文件(不同格式),代表所选输入文件中所有页面的内容。


程序如何工作

我们提供了两个工作方式类似的程序。这两个程序都使用 PyMuPDF 或 PyMuPDF4LLM 中实现的函数循环遍历输入 PDF 的所有页面。


PyMuPDF4LLM 基于 PyMuPDF,是一个专门从事文本提取的软件包,尤其适用于 LLM / RAG 环境。在这个软件包中,识别多栏文本的方法已被解决,可以在更多的情况下使用。


准备工作

在真正开始编码之前,我们需要确保所有需要的 Python 组件都已安装。


在计算机上打开一个终端窗口。在该窗口中输入命令:


确保 Python 版本足够高。执行:


python -V


在某些机器上,如 Linux 或 Mac OSX,你可能需要写 python3 而不是 python。在下面的所有内容中,请根据你的机器要求,始终使用 python 或 python3。


回复类似 Python 3.12.3。


我们至少需要 Python 3.9.0。如果你的 Python 是 3.8.x 或更低版本,则必须先升级 Python。


具体如何操作取决于你的操作系统,因此请调查这种不幸情况的详细信息。


假设你的 Python 版本确实符合要求。接下来要确认的是,你的 Python 包含标准安装程序 "pip"。安装 PyMuPDF 和 PyMuPDF4LLM 时需要用到它。


检查终端窗口中的以下命令是否有效:


python3 -m pip –version


如果出现未安装 pip 的错误提示,你必须先安装后才能继续。如果你使用的是 MS Windows 机器,则不会出现这种情况。在 Linux 和 Mac OSX 机器上执行以下命令:


Linux(以 Ubuntu 为例):


sudo apt update
sudo apt install python3-pip


Mac OSX:


python3 -m ensurepip --upgrade


现在,我们就可以进行所需的安装了。


在终端窗口输入以下命令。第一行将确保 Python 安装程序 pip 处于当前级别。


第 2 行将安装 PyMuPDF4LLM,如果需要,还可能安装 PyMuPDF。


python3 -m pip install --upgrade pip
python3 -m pip install pymupdf4llm


下载和执行程序

请将以下文件下载到你选择的文件夹中:


  • markdowntext.py - 以 Markdown 格式提取多栏文本的程序
  • 2col2tables.pdf - 有两列和两个表格的 PDF 示例。
  • science-example1.pdf - 来自科学手册的 PDF 示例,有 3 列和一张图片


打开一个终端窗口,执行以下命令(再次提醒,如果需要,可以使用 python3 代替):


python markdowntext.py 2col2tables.pdf
python markdowntext.py science-example1.pdf


脚本将为每个 PDF 文档创建与输入文件同名的 Markdown 文本文件,其中后缀名 .pdf 已被后缀名 .md 所替换。


检查代码

代码可能再简单不过了!


9  import pymupdf4llm
10 import pathlib
11 import sys
12  
13  
14 filename = sys.argv[1]  # read filename from command line
15 outname = filename.replace(".pdf", ".md")
16 md_text = pymupdf4llm.to_markdown(filename)
17  
18 # output document markdown text as one string
19 pathlib.Path(outname).write_bytes(md_text.encode())
20  


请在下面按代码行号查找注释:


  • 第 9 至 11 行导入必要的 Python 软件包。
  • 第 14 行从命令行读取要处理的文件名。
  • 第 15 行定义输出文本文件的名称。这将等于文件名,其中文件扩展名由 Markdown 文件扩展名替换。
  • 第 16 行生成实际文本。
  • 第 19 行将文本写入定义的输出文件。为了支持一般的 UTF-8 编码字符集,我们将文本转换为二进制格式,并将该版本写入文件。


即使列数保持不变,上述脚本也能自动识别多页文本列。


你可以将生成的 Markdown 文本文件用于多种用途,例如

  • 将其输入 LLM / RAG 流程
  • 使用 Markdown 渲染器(如 GitHub、VS Code 或 react-markdown)渲染。


检查结果

让我们看看程序是如何读取示例页面的。


在文件 2col2tables.pdf 中,页面从两列开始,然后是一列区域,最后再次回到两列。


图片中的红色矩形和箭头表示提取文本的顺序。


4


算法检测到 5 个文本块,并发现其中两个区域有两列,一个区域只有一列。


由此确定箭头所示的整体顺序。


请注意:这两个表格是以兼容 GitHub 的 Markdown 表格格式检测和编写的。


下面是第二个示例,文件 science-example1.pdf:


5


这是一份科学杂志的一页,其中有三列文字,围绕着一张附有说明的图片。图片未被提取。


结论

结合 PyMuPDF 和 PyMuPDF4LLM 的强大功能,PyMuPDF4LLM 提供了广泛的创新文本提取选项,超越了 PyMuPDF 本身。


使用直观的 API,它可以检测并提取多栏页面上的文本和表格,这在杂志和报纸中是很常见的。

文章来源:https://medium.com/@pymupdf/extracting-text-from-multi-column-pages-a-practical-pymupdf-guide-a5848e5899fe
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消