如何高效从PDF中提取文本、表格及图片内容?
- 内容介绍
- 文章标签
- 相关推荐
先聊聊PDF到底是个啥
我好了。 说实话,PDF就像那种硬邦邦的文档砖墙。 跨平台、排版不跑位,谁用谁爱嗯。 可是它天生只读,想挖里面的宝藏——文字、表格、图片—— 就得动点手脚。 别慌,咱今天把这些“开锁”技巧全拆出来保证你看完能直接上手。
文本提取:从直接复制到OCR全覆盖
最简单的办法, 就是打开PDF全选Ctrl+C,然后粘进Word。 哈哈,这招对纯文字PDF真的管用。 但要是遇到排版乱七八糟,或者复制出来满是乱码,怎么办? 这时候就要请出OCR啦。
客观地说... 常见的Python库有pdfplumber和pytesseract配合使用。
import pdfplumber
from PIL import Image
import pytesseract
def extract_text:
texts =
with pdfplumber.open as pdf:
for page in pdf.pages:
# 先尝试直接抓文字
txt = page.extract_text
if txt:
texts.append
else:
# 没有可选文字, 用截图+OCR
img = page.to_image.original
ocr_txt = pytesseract.image_to_string
texts.append
return "
".join
代码里先抢一波可直接抽的文字,抽不到再让OCR来救场。 不对不对,我忘了说要装好tesseract可施行文件,你懂的,那玩意儿得先装好才能跑。
小技巧:只提取页面局部
有时候只想要左上角那块标题。 Spire.PDF这类库都支持矩形区域提取。
# 假设使用Spire.PDF
from spire.pdf import PdfDocument, PdfTextExtractor, PdfTextExtractOptions
from spire.pdf.common import RectangleF
doc = PdfDocument
doc.LoadFromFile
page = doc.Pages
extractor = PdfTextExtractor
options = PdfTextExtractOptions
options.ExtractArea = RectangleF # x,y,w,h
text = extractor.ExtractText
print
表格提取:别让数据变成“一锅粥”
PDF里的表格往往没有真实的单元格结构,只是靠文字间距排版。 直接copy粘进Excel,后来啊行列乱套,那叫一个尴尬。 这里推荐两条路:一条是专门识别表格线条的库;另一条是把文字按空白划分,再自行拼装,纯正。。
用pdfplumber抓表格
换个角度看.… pdfplumber自带表格检测功能,用起来比我想象中还顺手。
import pdfplumber
import csv
def pdf_table_to_csv:
with pdfplumber.open as pdf:
page = pdf.pages # 假设只要第一页
table = page.extract_table
if table:
with open as f:
writer = csv.writer
writer.writerows
pdf_table_to_csv
如果表格里有合并单元格或斜线, 那就可能抓不到,这时候可以调节参数或者改用下面的方法。
Spire.PDF深度表格抽取
这个库能遍历每个单元格, 把文本逐个写进Excel工作簿,灵活度满分。
from spire.pdf import PdfDocument
from spire.pdf.common import *
from spire.xls import Workbook
doc = PdfDocument
doc.LoadFromFile
extractor = doc.TableExtractor # 假设有这个属性
wb = Workbook
wb.Worksheets.Clear
for i in range:
tables = extractor.ExtractTable
if tables:
for tbl in tables:
sheet = wb.Worksheets.Add
rows = tbl.GetRowCount
cols = tbl.GetColumnCount
for r in range:
for c in range:
txt = tbl.GetText
sheet.Range.Value2 = txt
wb.SaveToFile
doc.Close
我血槽空了。 看着代码有点长?别怕,你可以把它封装成函数,然后循环文件夹批量搞定。
图片提取:把高质量素材搬出来
设计师们常说:“图少了项目难推进”。 PDF里埋着的大图、 闹笑话。 logo甚至矢量图,都能一次性导出。
Spire.PDF图片助手示例
from spire.pdf import PdfDocument
from spire.pdf.common import *
doc = PdfDocument
doc.LoadFromFile
helper = doc.ImageHelper
img_idx = 0
for i in range:
imgs_info = helper.GetImagesInfo
for info in imgs_info:
img_idx += 1
out_name = f'img_{img_idx}.png'
info.Image.Save # 自动保存为PNG
print
doc.Close
这么干, 你根本不用截图,也不担心分辨率缩水。 如果你的PDF是扫描件, 我始终觉得... 那图片其实就是整页扫描图,这时候先走OCR再切割会更靠谱。
自动化批处理:一次性搞定千文件
手动点几下太慢?我们来写个“遍历文件夹+自动分类”的脚本吧,等..….。
import os
from spire.pdf import PdfDocument
def batch_extract:
if not os.path.isdir:
os.makedirs
for file in os.listdir:
if not file.lower.endswith:
continue
src_path = os.path.join
name_no_ext = os.path.splitext
dst_folder = os.path.join
os.makedirs
doc = PdfDocument
doc.LoadFromFile
# 提取文本
txt_all =
for p in range:
txt_all.append)
with open,'w',encoding='utf-8') as f:
f.write)
# 提取图片
helper=doc.ImageHelper
img_cnt=0
for p in range:
infos=helper.GetImagesInfo
for info in infos:
img_cnt+=1
img_path=os.path.join
info.Image.Save
doc.Close
print
batch_extract
运行完后 你会在extracted目录下看到每个PDF对应的子文件夹,里面放着text.txt和若干png。 害, 这段代码里用了Spire自带的页面文字抽取方法,如果你用的是pdfplumber,只要把对应调用换掉即可——很灵活,极度舒适。。
实战小贴士:别让细节拖慢效率
- - 把常用路径写进环境变量, 免得每次敲长串路径;
- - 批量处理前先跑一次小样本,确认编码和空行情况;
- - 对于中文OCR记得加上lang='chi_sim',不然只能识别英文;
- - 如果遇到加密PDF,需要提前解密,否则库会报错——记得找密码或使用娱乐工具。
- - 导出的CSV如果出现多余引号,用Excel打开后另存为UTF‑8即可解决乱码问题。
从“只读”到“可编辑”,一步到位
总算说完了吧?哈哈, 一下:
文本——优先直接抽,不行再走OCR; 表格——先试pdfplumber,再需要精准结构时选Spire; 图片——Spire.ImageHelper秒出高清素材; 批量——写个遍历脚本,一键搞定上千份文档,瞎扯。。
)
先聊聊PDF到底是个啥
我好了。 说实话,PDF就像那种硬邦邦的文档砖墙。 跨平台、排版不跑位,谁用谁爱嗯。 可是它天生只读,想挖里面的宝藏——文字、表格、图片—— 就得动点手脚。 别慌,咱今天把这些“开锁”技巧全拆出来保证你看完能直接上手。
文本提取:从直接复制到OCR全覆盖
最简单的办法, 就是打开PDF全选Ctrl+C,然后粘进Word。 哈哈,这招对纯文字PDF真的管用。 但要是遇到排版乱七八糟,或者复制出来满是乱码,怎么办? 这时候就要请出OCR啦。
客观地说... 常见的Python库有pdfplumber和pytesseract配合使用。
import pdfplumber
from PIL import Image
import pytesseract
def extract_text:
texts =
with pdfplumber.open as pdf:
for page in pdf.pages:
# 先尝试直接抓文字
txt = page.extract_text
if txt:
texts.append
else:
# 没有可选文字, 用截图+OCR
img = page.to_image.original
ocr_txt = pytesseract.image_to_string
texts.append
return "
".join
代码里先抢一波可直接抽的文字,抽不到再让OCR来救场。 不对不对,我忘了说要装好tesseract可施行文件,你懂的,那玩意儿得先装好才能跑。
小技巧:只提取页面局部
有时候只想要左上角那块标题。 Spire.PDF这类库都支持矩形区域提取。
# 假设使用Spire.PDF
from spire.pdf import PdfDocument, PdfTextExtractor, PdfTextExtractOptions
from spire.pdf.common import RectangleF
doc = PdfDocument
doc.LoadFromFile
page = doc.Pages
extractor = PdfTextExtractor
options = PdfTextExtractOptions
options.ExtractArea = RectangleF # x,y,w,h
text = extractor.ExtractText
print
表格提取:别让数据变成“一锅粥”
PDF里的表格往往没有真实的单元格结构,只是靠文字间距排版。 直接copy粘进Excel,后来啊行列乱套,那叫一个尴尬。 这里推荐两条路:一条是专门识别表格线条的库;另一条是把文字按空白划分,再自行拼装,纯正。。
用pdfplumber抓表格
换个角度看.… pdfplumber自带表格检测功能,用起来比我想象中还顺手。
import pdfplumber
import csv
def pdf_table_to_csv:
with pdfplumber.open as pdf:
page = pdf.pages # 假设只要第一页
table = page.extract_table
if table:
with open as f:
writer = csv.writer
writer.writerows
pdf_table_to_csv
如果表格里有合并单元格或斜线, 那就可能抓不到,这时候可以调节参数或者改用下面的方法。
Spire.PDF深度表格抽取
这个库能遍历每个单元格, 把文本逐个写进Excel工作簿,灵活度满分。
from spire.pdf import PdfDocument
from spire.pdf.common import *
from spire.xls import Workbook
doc = PdfDocument
doc.LoadFromFile
extractor = doc.TableExtractor # 假设有这个属性
wb = Workbook
wb.Worksheets.Clear
for i in range:
tables = extractor.ExtractTable
if tables:
for tbl in tables:
sheet = wb.Worksheets.Add
rows = tbl.GetRowCount
cols = tbl.GetColumnCount
for r in range:
for c in range:
txt = tbl.GetText
sheet.Range.Value2 = txt
wb.SaveToFile
doc.Close
我血槽空了。 看着代码有点长?别怕,你可以把它封装成函数,然后循环文件夹批量搞定。
图片提取:把高质量素材搬出来
设计师们常说:“图少了项目难推进”。 PDF里埋着的大图、 闹笑话。 logo甚至矢量图,都能一次性导出。
Spire.PDF图片助手示例
from spire.pdf import PdfDocument
from spire.pdf.common import *
doc = PdfDocument
doc.LoadFromFile
helper = doc.ImageHelper
img_idx = 0
for i in range:
imgs_info = helper.GetImagesInfo
for info in imgs_info:
img_idx += 1
out_name = f'img_{img_idx}.png'
info.Image.Save # 自动保存为PNG
print
doc.Close
这么干, 你根本不用截图,也不担心分辨率缩水。 如果你的PDF是扫描件, 我始终觉得... 那图片其实就是整页扫描图,这时候先走OCR再切割会更靠谱。
自动化批处理:一次性搞定千文件
手动点几下太慢?我们来写个“遍历文件夹+自动分类”的脚本吧,等..….。
import os
from spire.pdf import PdfDocument
def batch_extract:
if not os.path.isdir:
os.makedirs
for file in os.listdir:
if not file.lower.endswith:
continue
src_path = os.path.join
name_no_ext = os.path.splitext
dst_folder = os.path.join
os.makedirs
doc = PdfDocument
doc.LoadFromFile
# 提取文本
txt_all =
for p in range:
txt_all.append)
with open,'w',encoding='utf-8') as f:
f.write)
# 提取图片
helper=doc.ImageHelper
img_cnt=0
for p in range:
infos=helper.GetImagesInfo
for info in infos:
img_cnt+=1
img_path=os.path.join
info.Image.Save
doc.Close
print
batch_extract
运行完后 你会在extracted目录下看到每个PDF对应的子文件夹,里面放着text.txt和若干png。 害, 这段代码里用了Spire自带的页面文字抽取方法,如果你用的是pdfplumber,只要把对应调用换掉即可——很灵活,极度舒适。。
实战小贴士:别让细节拖慢效率
- - 把常用路径写进环境变量, 免得每次敲长串路径;
- - 批量处理前先跑一次小样本,确认编码和空行情况;
- - 对于中文OCR记得加上lang='chi_sim',不然只能识别英文;
- - 如果遇到加密PDF,需要提前解密,否则库会报错——记得找密码或使用娱乐工具。
- - 导出的CSV如果出现多余引号,用Excel打开后另存为UTF‑8即可解决乱码问题。
从“只读”到“可编辑”,一步到位
总算说完了吧?哈哈, 一下:
文本——优先直接抽,不行再走OCR; 表格——先试pdfplumber,再需要精准结构时选Spire; 图片——Spire.ImageHelper秒出高清素材; 批量——写个遍历脚本,一键搞定上千份文档,瞎扯。。
)

