【Python 第三方库】pdf2image

2024-01-25 00:00:00

目录:

推荐使用 PyMuPDF,安装简单,使用简单。

pdf2image 模块介绍

pdf2image 用于将 PDF 文档转换为图像格式。原理是封装底层的 poppler-utils 工具集,将PDF的每一页转换为PIL(Python Imaging Library,现为 Pillow)的 Image 对象。

安装依赖:

$ pip install pdf2image

为了后续的图像处理,建议同时安装 Pillow 库:

$ pip install Pillow

pdf2image 本身不包含 PDF 渲染引擎,它依赖于开源的 poppler-utils,还需要安装 poppler:

# MacOS
$ brew install poppler
# Linux
$ sudo apt-get install poppler-utils

配置说明

可以控制图片分辨率,控制从 PDF 指定页码范围生成图片等。

from pdf2image import convert_from_path

images = convert_from_path(
    'document.pdf',
    dpi=300,                # 提高分辨率以获得更清晰的图像,适合打印或 OCR
    first_page=5,           # 从第 5 页开始转换(页码从 1 开始)
    last_page=10,           # 转换到第 10 页结束
    fmt='png',              # 指定输出为无损的 PNG 格式
    output_folder='./output_images',  # 指定图像输出目录
    output_file='doc_page', # 输出文件前缀,将生成如 doc_page-0001.png 的文件
    thread_count=4,         # 使用 4 个线程并行处理,加速转换
    size=(1200, None)       # 限制图像宽度为 1200 像素,高度按比例自动计算
)

读取 PDF 文件转换为图片

from pdf2image import convert_from_path

# 指定 PDF 文件路径,进行转换,默认 DPI 为 200,输出格式为 PPM
images = convert_from_path('document.pdf')

# 遍历 PIL 图像列表,按页序保存为 JPEG 文件
for i, image in enumerate(images):
    image.save(f'page_{i+1}.jpg', 'JPEG')

读取 PDF 字节流转换为图片

当 PDF 数据来源于网络请求或数据库时,可以使用字节流转换。

from pdf2image import convert_from_bytes

# 假设pdf_bytes是从网络或数据库获取的PDF二进制数据
with open('document.pdf', 'rb') as f:
    pdf_bytes = f.read()

images = convert_from_bytes(pdf_bytes, dpi=150)
# 后续处理与保存同上

使用 PIL 对图片做处理后转换为图片

from pdf2image import convert_from_path
from PIL import ImageEnhance

images = convert_from_path('document.pdf')

for i, img in enumerate(images):
    # 示例1:转换为灰度图
    grayscale_img = img.convert('L')
    grayscale_img.save(f'page_{i+1}_gray.jpg')
    
    # 示例2:增强图像对比度(常用于OCR预处理)
    enhancer = ImageEnhance.Contrast(img)
    enhanced_img = enhancer.enhance(2.0)  # 对比度增强2倍

    # 保存图片
    enhanced_img.save(f'page_{i+1}_enhanced.png')

获取 PDF 文档总页数

from pdf2image import pdfinfo_from_path

info = pdfinfo_from_path('document.pdf')
total_pages = info['Pages']
print(f"该PDF文档总共有 {total_pages} 页。")

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: