PDF转图片是个老大难的问题了。要么清晰度不行,要么速度慢得要死,还有各种乱七八糟的问题。不过别担心,有了pdf2image这个神器,PDF转图片分分钟的事。
1.
安装配置
pdf2image依赖poppler,得先把这玩意装好。Mac用户直接用brew安装:
brew install poppler
Windows用户麻烦点,要下载poppler的二进制文件,把bin目录加到环境变量。装好poppler再装pdf2image:
pip install pdf2image
温馨提示:Windows用户记得重启电脑,让环境变量生效。不然一会儿运行代码可能会报错,找不到poppler。
2.
基本用法
来看看最简单的用法,一个PDF转成一堆图片:
from pdf2image import convert_from_path
# PDF转图片,默认格式是PNG
images = convert_from_path('demo.pdf')
# 保存图片,每页PDF生成一张图片
for i, image in enumerate(images):
image.save(f'page_{i+1}.png')
这代码超级简单,但已经能应付80%的需求了。每页PDF会转成一张图片,默认是PNG格式。我一般用PNG,因为清晰度高,不过占用空间也大。
3.
进阶玩法
想要调整图片质量和大小?这样搞:
images = convert_from_path(
'demo.pdf',
dpi=300, # 分辨率,越大越清晰
size=(800, None), # 指定宽度,高度自动调整
fmt='jpeg', # 换成JPEG格式
output_folder='output', # 指定输出目录
thread_count=4 # 多线程处理,速度杠杠的
)
温馨提示:dpi别设太大,300够用了。设太大不仅慢,文件还特别大。真要高清,建议用原始PDF。
4.
内存优化
PDF太大?一次性转换会把内存撑爆?试试分批处理:
from pdf2image import convert_from_path
def convert_batch(pdf_path, batch_size=5):
for i in range(0, 100, batch_size): # 假设PDF有100页
images = convert_from_path(
pdf_path,
first_page=i+1,
last_page=min(i+batch_size, 100)
)
for j, image in enumerate(images):
image.save(f'page_{i+j+1}.png')
convert_batch('large.pdf')
一次处理几页,内存占用小很多。就是速度会慢点,看具体需求取舍。
5.
坑点提醒
有几个坑得提前说清楚:
PDF有密码?得先解密,不然转不了
有些花里胡哨的PDF可能转出来不太对劲,比如有透明效果
Mac用户碰到权限问题,记得给poppler执行权限
转换速度和电脑配置、PDF复杂度都有关系,别指望太快
代码示例:
# 处理加密的PDF
images = convert_from_path(
'encrypted.pdf',
password='123456'
)
# 处理质量和文件大小的平衡
images = convert_from_path(
'demo.pdf',
dpi=150, # 适中的分辨率
fmt='jpeg',
jpeg_quality=80 # JPEG压缩质量
)
好了,现在可以愉快地把PDF转成图片了。这些代码都是实打实地测试过的,拿去用就完事了。要是想研究更多花样,pdf2image的文档写得挺详细,去看看准没错。
· END ·
欢迎分享到朋友圈
MU MU MA
领取专属 10元无门槛券
私享最新 技术干货