用 Python 把 PDF 玩的明明白白

科技   2024-11-22 11:06   中国香港  

大家好,我是章北海

PDF 无处不在,无论是在线形式还是印刷形式,但很少有人利用这些有用的功能或掌握这种格式的细微差别。

PDF 文档解析更不是什么新东西了,但是最近大模型、RAG 兴起,把这一块又带火了。

本文,梳理 7 个很常用的 pdf 处理、解析、翻译库、项目和资料。

如有帮助,欢迎点个 【在看】

unsetunset1、PDFMathTranslate:文档翻译神器,公式、图表都不在话下unsetunset

项目地址:`https://github.com/Byaidu/PDFMathTranslate/

简介

功能

PDF 文档翻译及双语对照

  • 📊 保留公式和图表
  • 📄 保留可索引目录
  • 🌐 支持多种翻译服务

安装

要求 Python 版本 >=3.8, <=3.12

pip install pdf2zh

使用

命令行中执行翻译指令,在工作目录下生成翻译文档 example-zh.pdf 和双语对照文档 example-dual.pdf,默认使用 Google 作为翻译服务

# 翻译完整文档
pdf2zh example.pdf
# 翻译部分文档
pdf2zh example.pdf -p 1-3,5
# 使用指定语言翻译
pdf2zh example.pdf -li en -lo ja


# 使用 DeepL/DeepLX 翻译
# 参考 [DeepLX](https://github.com/OwO-Network/DeepLX)
# 设置环境变量构建接入点:`{DEEPL_SERVER_URL}/translate`
# - `DEEPL_SERVER_URL`(可选), e.g., `export DEEPL_SERVER_URL=https://api.deepl.com`
# - `DEEPL_AUTH_KEY`, e.g., `export DEEPL_AUTH_KEY=xxx`
pdf2zh example.pdf -s deepl



# 使用 Ollama 翻译
# 参考 [Ollama](https://github.com/ollama/ollama)
# 设置环境变量构建接入点:`{OLLAMA_HOST}/api/chat`
# - `OLLAMA_HOST`(可选), e.g., `export OLLAMA_HOST=https://localhost:11434`
pdf2zh example.pdf -s ollama:gemma2


# 使用 OpenAI/SiliconCloud/Zhipu 翻译
# 参考 [SiliconCloud](https://docs.siliconflow.cn/quickstart), [Zhipu](https://open.bigmodel.cn/dev/api/thirdparty-frame/openai-sdk)
# 设置环境变量构建接入点:`{OPENAI_BASE_URL}/chat/completions`
# - `OPENAI_BASE_URL`(可选), e.g., `export OPENAI_BASE_URL=https://api.openai.com/v1`
# - `OPENAI_API_KEY`, e.g., `export OPENAI_API_KEY=xxx`
pdf2zh example.pdf -s openai:gpt-4o



# 使用正则表达式指定需要保留样式的字体和字符
pdf2zh example.pdf -f "(CM[^RT].*|MS.*|.*Ital)" -c "(\(|\||\)|\+|=|\d|[\u0080-\ufaff])"

unsetunset2、pdf2htmlEX:PDF 转换为 HTMLunsetunset

简介

项目地址:https://github.com/pdf2htmlEX/pdf2htmlEX基于 pdf2htmlEX 的分支,将 PDF 转换为 HTML,其转换效果非常好,生成的网页和原始 PDF 几乎完全一致。

原理是利用 Chrome Headless 来渲染 PDF,然后导出为 HTML 格式,甚至连图片也被转换为了 base64 编码,因此生成的网页可以完整包含文本、字体和图片等所有内容。

功能

  • 原生 HTML 文本,具有精确的字体和位置。

  • 灵活的输出:一体化 HTML 或按需页面加载(需要 JavaScript)。

  • 文件大小适中,有时甚至比 PDF 还小。

  • 支持链接、大纲(书签)、打印、SVG 背景、Type 3 字体

安装

安装还是蛮麻烦的,照着文档一步一步操作吧

https://github.com/pdf2htmlEX/pdf2htmlEX/releases

使用

pdf2htmlEX /path/to/foobar.pdf

pdf2htmlEX --help

pdf2htmlEX --zoom 1.3 pdf/test.pdf

unsetunset3、文档合并:PyMuPDFunsetunset

简介

PyMuPDF 是一个高性能的 Python 库,用于对 PDF(及其他)文档进行数据提取、分析、转换和操作。

项目地址:https://github.com/pymupdf/PyMuPDF

功能

PyMuPDF 支持多种文档格式,如 PDF、XPS、EPUB 等,而其他软件如 pikepdf、PyPDF2、pdfrw、pdfplumber/pdfminer 支持的格式相对较少。PyMuPDF 在渲染文档页面、提取文本、提取表格、提取矢量图形、绘制矢量图形、OCR 集成等方面具有优势。

安装

pip install PyMuPDF

使用

import pymupdf # imports the pymupdf library
doc = pymupdf.open("example.pdf"# open a document
for page in doc: # iterate the document pages
  text = page.get_text() # get plain text encoded as UTF-8

unsetunset4、文档解析:Pdfminer.sixunsetunset

简介

项目地址:https://github.com/pdfminer/pdfminer.six

功能

完全用 Python 编写。解析、分析和转换 PDF 文档。提取内容为文本、图像、html 或 hOCR。支持 PDF-1.7 规范。(差不多吧)。支持中日韩语言和竖排书写脚本。支持各种字体类型(Type1、TrueType、Type3 和 CID)。支持提取图像(JPG、JBIG2、位图)。支持各种压缩方式(ASCIIHexDecode、ASCII85Decode、LZWDecode、FlateDecode、RunLengthDecode、CCITTFaxDecode)。支持 RC4 和 AES 加密。支持 AcroForm 交互式表单提取。目录提取。标记内容提取。自动布局分析。

安装

pip install pdfminer.six

使用

pdf2txt.py example.pdf

或者

from pdfminer.high_level import extract_text

text = extract_text("example.pdf")
print(text)

unsetunset5、文档提取:MinerUunsetunset

简介

一站式开源高质量数据提取工具,将 PDF 转换成 Markdown 和 JSON 格式。项目地址:https://github.com/opendatalab/MinerU

功能

  • 删除页眉、页脚、脚注、页码等元素,确保语义连贯
  • 输出符合人类阅读顺序的文本,适用于单栏、多栏及复杂排版
  • 保留原文档的结构,包括标题、段落、列表等
  • 提取图像、图片描述、表格、表格标题及脚注
  • 自动识别并转换文档中的公式为 LaTeX 格式
  • 自动识别并转换文档中的表格为 HTML 格式
  • 自动检测扫描版 PDF 和乱码 PDF,并启用 OCR 功能
  • 支持多种输出格式,如多模态与 NLP 的 Markdown、按阅读顺序排序的 JSON、含有丰富信息的中间格式等
  • 支持多种可视化结果,包括 layout 可视化、span 可视化等,便于高效确认输出效果与质检
  • 支持 CPU 和 GPU 环境
  • 兼容 Windows、Linux 和 Mac 平台

安装

1、安装 magic-pdf

conda create -n MinerU python=3.10
conda activate MinerU
pip install -U magic-pdf[full] --extra-index-url https://wheels.myhloli.com -i https://mirrors.aliyun.com/pypi/simple
  1. 下载模型权重文件 详细参考 https://github.com/opendatalab/MinerU/blob/master/docs/how_to_download_models_zh_cn.md

  2. 修改配置文件以进行额外配置 完成 2. 下载模型权重文件步骤后,脚本会自动生成用户目录下的 magic-pdf.json 文件,并自动配置默认模型路径。您可在【用户目录】下找到 magic-pdf.json 文件。

Tip

windows 的用户目录为 "C:\Users\用户名",
linux 用户目录为 "/home/用户名"
macOS 用户目录为 "/Users/用户名"

您可修改该文件中的部分配置实现功能的开关,如表格识别功能:

如 json 内没有如下项目,请手动添加需要的项目,并删除注释内容(标准 json 不支持注释)

{
    // other config
    "layout-config": {
        "model""layoutlmv3" // 使用 doclayout_yolo 请修改为“doclayout_yolo"
    },
    "formula-config": {
        "mfd_model""yolo_v8_mfd",
        "mfr_model""unimernet_small",
        "enable"true  // 公式识别功能默认是开启的,如果需要关闭请修改此处的值为"false"
    },
    "table-config": {
        "model""rapid_table",  // 默认使用"rapid_table",可以切换为"tablemaster"和"struct_eqtable"
        "enable"false// 表格识别功能默认是关闭的,如果需要开启请修改此处的值为"true"
        "max_time"400
    }
}

使用

magic-pdf --help
Usage: magic-pdf [OPTIONS]

Options:
  -v, --version                display the version and exit
  -p, --path PATH              local pdf filepath or directory  [required]
  -o, --output-dir PATH        output local directory  [required]
  -m, --method [ocr|txt|auto]  the method for parsing pdf. ocr: using ocr
                               technique to extract information from pdf. txt:
                               suitable for the text-based pdf only and
                               outperform ocr. auto: automatically choose the
                               best method for parsing pdf from ocr and txt.
                               without method specified, auto will be used by
                               default.
  -l, --lang TEXT              Input the languages in the pdf (if known) to
                               improve OCR accuracy.  Optional. You should
                               input "Abbreviation" with language form url: ht
                               tps://paddlepaddle.github.io/PaddleOCR/latest/en
                               /ppocr/blog/multi_languages.html#5-support-languages-
                               and-abbreviations
  -d, --debug BOOLEAN          Enables detailed debugging information during
                               the execution of the CLI commands.
  -s, --start INTEGER          The starting page for PDF parsing, beginning
                               from 0.
  -e, --end INTEGER            The ending page for PDF parsing, beginning from
                               0.
  --help                       Show this message and exit.


## show version
magic-pdf -v

## command line example
magic-pdf -p {some_pdf} -o {some_output_dir} -m auto

unsetunset6、布局解析:DocLayout-YOLOunsetunset

简介

基于 YOLO-v10,通过提供多样性文档预训练及适配文档检测的模型结构优化,可针对多样性文档进行实时鲁棒的检测。

项目地址:https://github.com/opendatalab/DocLayout-YOLO

安装

conda create -n doclayout_yolo python=3.10
conda activate doclayout_yolo
pip install -e .

注意:如果只想使用 DocLayout-YOLO 的推理功能,直接通过 pip 进行安装:

pip install doclayout-yolo

使用

可以通过脚本的方式或者 SDK 的方式进行推理:

脚本推理

通过以下命令运行推理脚本 demo.py 来进行推理:

python demo.py --model path/to/model --image-path path/to/image

SDK 推理

直接通过 SDK 进行模型推理:

import cv2
from doclayout_yolo import YOLOv10

# Load the pre-trained model
model = YOLOv10("path/to/provided/model")

# Perform prediction
det_res = model.predict(
    "path/to/image",   # Image to predict
    imgsz=1024,        # Prediction image size
    conf=0.2,          # Confidence threshold
    device="cuda:0"    # Device to use (e.g., 'cuda:0' or 'cpu')
)

# Annotate and save the result
annotated_frame = det_res[0].plot(pil=True, line_width=5, font_size=20)
cv2.imwrite("result.jpg", annotated_frame)

unsetunset7、pdf 文档标准:PDF Explained、PDF Cheat Sheetsunsetunset

最后再推荐俩资料,非常适合入门 PDF 及加深对其的理解

《PDF-Explained》为程序员,高级用户提供了世界领先的页面描述语言 (pdf) 的动手实践。以及搜索,电子出版和印刷行业的专业人士,有大量示例,本书是你完全理解 PDF 所需的文档。

项目地址:https://zxyle.github.io/PDF-Explained

pdf 知识卡片速查表


项目地址:https://pdfa.org/resource/pdf-cheat-sheets/

PDF 速查表:完整版,加我微信mindszhang获取


机器学习算法与Python实战
长期跟踪关注统计学、数据挖掘、机器学习算法、深度学习、人工智能技术与行业发展动态,分享Python、机器学习等技术文章。回复机器学习有惊喜资料。
 最新文章