惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
A
Arctic Wolf
Security Latest
Security Latest
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
Latest news
Latest news
Help Net Security
Help Net Security
S
Security Affairs
Webroot Blog
Webroot Blog
The Hacker News
The Hacker News
AI
AI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tor Project blog
Forbes - Security
Forbes - Security
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
H
Help Net Security
L
Lohrmann on Cybersecurity
S
SegmentFault 最新的问题
Google Online Security Blog
Google Online Security Blog
MongoDB | Blog
MongoDB | Blog
Cyberwarzone
Cyberwarzone
The Last Watchdog
The Last Watchdog
S
Securelist
N
News and Events Feed by Topic
S
Secure Thoughts
F
Fortinet All Blogs
博客园_首页
C
Cybersecurity and Infrastructure Security Agency CISA
量子位
M
MIT News - Artificial intelligence
F
Full Disclosure
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
P
Privacy International News Feed
L
LangChain Blog
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes

博客园 - E-iceblue

如何使用 Python 快速将 Excel 转换为 XML 文件 Python 办公自动化:Word 文档加密与权限控制实战 在 Python 中快速锁定 Excel 单元格与行列 使用 Python 在 Word 文档中添加或删除文本框 如何使 PDF 可编辑 - Python 教程详解 将 Excel 表格插入 Word 文档的三种实用方案(Python 自动化) Python 办公自动化:如何轻松调整 Word/PDF 页面大小为 Legal 尺寸 数字签名 vs 电子签名:区别与如何在文件中插入数字签名 Python 教程:快速复制 Excel 工作表 如何对比 Excel 两列数据的不同:从基础操作到 Python 自动化 如何提取 Word 文档中的表格并导出为 Excel(Python 教程) 使用 Python 在 PowerPoint 中添加或移除背景图和背景颜色 在 Java 中使用 Spire.PDF 合并 PDF 文档(含加密与压缩处理) 在 Python 中自动化转化 Markdown 为 HTML 【详细教程】 Python 控制 PDF 页面大小、页边距、页面方向与缩放 Python 办公自动化:快速将 HTML 转换为 PDF 格式 在 Python 中给 PDF 设置背景图或背景色 在 Python 中转换 XML 为 PDF 文档:基础转换与转换设置 在 Python 中对比 Word 文档:自动生成修订报告【教程向】 Excel 删除空白行的 5 种方法 【手动与 Python 自动化】 删除 Excel 表格中的重复行 【4 种实用方法】 从纯文本到精美文档:TXT 转 PDF 的三种高效方案 Python 实现 PDF 表单域的自动化创建与智能填充 PPT 批量转图片:在 Web 预览中实现翻页效果(C#/VB.NET) 为什么生成的条形码扫不出来?从静区、分辨率和色彩三个方向解析条码识别率 Excel vs CSV:在系统数据处理中该如何选择?(附格式转换代码示例) 【2026 最新教程】Java 自动化提取 PDF 表格:从文本到 Excel/CSV 的全场景实现 零成本实现文档智能:本地化 OCR 提取与 AI 处理全流程实战 PPT 智能提取与分析实战:把演示文档变成结构化数据 PDF 文件为什么打不开?常见原因与解决思路 PDF vs PDF/A:区别、场景与常用转换方法(2026 全面解读) 使用 Java 将 PowerPoint 转换为 PDF 的完整指南 如何在 Python 中轻松添加、隐藏和删除幻灯片
为什么 PDF 文本能看到,却提取不到?从开发者角度解析与解决方案
E-iceblue · 2025-12-25 · via 博客园 - E-iceblue

在 PDF 文档的处理过程中,很多人都遇到过这样的情况:PDF 打开完全正常,文字清晰可选,鼠标可以复制,但用代码提取文本时,却只能得到空字符串或零散乱码。这时,你可能会怀疑是代码出现了错误,或者使用的库无法处理这种任务。然而,事实往往并非如此,这类问题更多是 PDF 本身的类型和结构决定的,而非代码或库的问题。

视觉层与逻辑层:看得到不等于程序能读到

一些开发者可能会混淆视觉效果和数据结构的区别。人眼看到的是渲染结果,包括字体样式、字符位置和排版效果,这属于视觉层面。程序读取的,是 PDF 的逻辑结构:页面中是否存在文本对象、字符映射是否完整,以及内容流中记录的是文字还是绘图指令。

视觉与逻辑上的 PDF 差异

因此,即使你能看到文字,程序也可能无法提取。理解这一点,是排查 PDF 文本提取问题的第一步。

三类容易“看得到,却提取不到”的 PDF

在开发实践中,看得到却无法通过程序提取的问题主要集中在三种 PDF 类型上:

  1. 扫描件 PDF
    这是最典型的案例。文件看起来是正常文档,每页文字清晰可见,但实际上每一页都只是图片,PDF 中并没有任何文本对象。使用任何 PDF 库直接提取文本,结果只能为空。

  2. 字体嵌入但映射不完整的 PDF
    这种 PDF 外观正常,字体也嵌入,但 ToUnicode 或字符映射不完整。程序无法还原字符,提取结果是乱码或零散字符,即使使用 Spire.PDF 等强大库,也只能得到技术上存在但实际语义不可用的文本。

  3. 混合型 PDF
    当 PDF 页面上既有文本对象,又有图片时。表面上似乎可以成功提取到内容,但关键内容可能缺失严重,因为一部分内容存在于图片中。这类 PDF 最容易让开发者误认为是使用的库不能处理高级任务,其实问题在于 PDF 自身的结构。

三种不同类型的 PDF 文件

通过这个分类,开发者可以快速判断自己遇到的 PDF 属于哪一类,从而选择合适的处理策略。

不过,需要明确的是换库并不能解决根本问题。当我们遇到提取失败时,很多人本能地选择换库或者调整参数,但这通常解决不了问题。无论是 Spire.PDF、iText 还是 PDFBox,它们本质上都使用同样的方法读取同一份 PDF 的逻辑结构。如果文本对象不存在或字体映射损坏,换库也只能得到同样不可用的数据。

解决方案示例:扫描件 PDF

当我们遇到上述的三类 PDF 时,究竟应该怎样去解决无法准确提取文本信息的问题呢?

对于扫描件 PDF 或逻辑层缺失的文档,传统文本提取几乎无效。这时候,我们可以通过将 PDF 转成图片,再使用 OCR 识别的方式获取可用文本。本文以扫描件 PDF 为示例说明可行的工程方案,字体映射缺失和混合型 PDF 也可以参考类似思路进行处理。

1. 将 PDF 页面转换为图片

首先我们需要将 PDF 页面转换为可被 OCR 识别的图片格式。使用 Spire PDF 提供的 PdfDocument.SaveAsImage() 方法,可以将每一页 PDF 导出为高分辨率图片,保证页面内容完整可见,同时保留排版效果。这样,即使 PDF 本身没有文本对象,也能为后续 OCR 做准备。

Spire.PDF for Python

2. 使用 OCR 识别图片文字

在成功得到图片后,我们再使用 Spire.OCR 对生成的图片进行文字识别,提取文本。OCR 可以识别扫描文字和图片中的文字,绕开 PDF 结构的限制。示例 Python 代码如下:

from spire.ocr import *

# 创建 OCR 扫描器实例
scanner = OcrScanner()

# 配置 OCR 模型路径和语言
configureOptions = ConfigureOptions()
configureOptions.ModelPath = r'E:/DownloadsNew/win-x64/'
configureOptions.Language = 'Chinese'
scanner.ConfigureDependencies(configureOptions)

# 使用 OCR 扫描图片
scanner.Scan(r'E:/Administrator/Python1/output/pdftoimage/ToImage_0.png')

# 将提取的文本保存为文本文件
text = scanner.Text.ToString()
with open('E:/Administrator/Python1/output/扫描件PDF文本提取.txt', 'a', encoding='utf-8') as file:
    file.write(text + '\n')

详细教程可以参考主页文章:如何使用 OCR 提取扫描件 PDF 的文本(Python 实现)>>

3. 处理其他类型 PDF

  • 字体嵌入但映射不完整的 PDF:可以先尝试使用专业 PDF 修复工具或库进行字体嵌入/映射修复;如果修复失败,也可以用 OCR 获取文本。

  • 混合型 PDF:对于文本对象部分可直接提取,图片部分用 OCR 识别,最后将两部分结果合并。

总的来说,OCR 是退而求其次的工程方案,但在扫描件或逻辑缺失的 PDF 中,它通常是最稳定、最可落地的选择。

实践建议

在写代码,或使用代码提取 PDF 的文本前,先判断 PDF 类型非常重要。对于扫描件或逻辑层缺失的文档,无需浪费时间在参数调试或库更换上。PDF 自动化的上限,由 PDF 本身决定。

在自动化流程中,建议先分析 PDF,判断其逻辑层结构;对扫描件或结构缺失文档,使用 OCR 获取文本;再对结果进行结构化处理,以保证数据可用性。

结语

当 PDF 文本看得到,却提取不到时,并不意味着写错了代码,也不代表库不行。核心原因在于 PDF 类型和内部结构。把问题理解为文档工程问题而非单纯 API 问题,你会发现很多重复尝试和调参都是可以避免的。

正确的认知和工程实践,才是应对 PDF 自动化挑战的关键。