You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需pdf2image:如何将多页PDF转为图像用于LazyDocument?

问题:无Poppler权限时,替代pdf2image生成LazyDocument所需images变量的方法

我尝试用pdf2image将多页PDF转为图像变量,用于Textractor的LazyDocument,代码如下:

import pdf2image
from pdf2image import convert_from_path, convert_from_bytes
import boto3
from textractcaller import call_textract, OutputConfig
from textractcaller.t_call import Textract_Call_Mode, Textract_API, get_full_json


file_source = 's3://mybucket/my/path/to/file.pdf'
bucket = 'mybucket'
key = 'my/path/to/file.pdf'

session = boto3.session.Session(region_name= 'us-east-1')
textract_client = session.client("textract", region_name= 'us-east-1')

output_config = OutputConfig(s3_bucket=bucket, s3_prefix=key)
response = call_textract(
            input_document=file_source,
            output_config = output_config,
            features=[TextractFeatures.FORMS, TextractFeatures.TABLES, TextractFeatures.SIGNATURES, TextractFeatures.LAYOUT],
            return_job_id=True,
            force_async_api=True,
            call_mode=Textract_Call_Mode.FORCE_ASYNC,
            boto3_textract_client= textract_client,
            job_done_polling_interval=1,
        )

s3_client = session.client("s3")

file_obj = s3_client.get_object(Bucket=bucket, Key=key).get("Body").read()
images = convert_from_bytes(bytearray(file_obj))

LazyDoc = LazyDocument(
        response["JobId"],
        Textract_API.ANALYZE,
        textract_client= textract_client,
        images=images,
        output_config=output_config,
    )

安装pdf2image后出现错误:

PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?

因权限问题无法下载Poppler并配置路径,求不使用pdf2image获取images变量的替代方法。


替代方案1:使用PyMuPDF(fitz)生成图像列表

PyMuPDF是纯Python实现的PDF处理库,无需额外安装系统依赖,直接通过pip即可部署。它可以将PDF每页转为PIL图像,输出格式与pdf2image完全一致,兼容LazyDocument的参数要求。

步骤:

  1. 安装PyMuPDF:
pip install pymupdf
  1. 替换原代码中生成images的逻辑:
import fitz  # PyMuPDF
from PIL import Image

# ... 保留原有从S3获取file_obj的代码 ...

# 用PyMuPDF解析PDF字节流
pdf_doc = fitz.open("pdf", file_obj)
images = []
for page_num in range(pdf_doc.page_count):
    page = pdf_doc.load_page(page_num)
    # 按300dpi分辨率生成图像(可调整matrix参数修改分辨率)
    pix = page.get_pixmap(matrix=fitz.Matrix(300/72, 300/72))
    # 转换为PIL图像对象
    img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
    images.append(img)

# 后续LazyDocument初始化代码保持不变
LazyDoc = LazyDocument(
        response["JobId"],
        Textract_API.ANALYZE,
        textract_client= textract_client,
        images=images,
        output_config=output_config,
    )

替代方案2:使用Ghostscript(环境预装时可用)

如果目标环境已预装Ghostscript,可结合ghostscript库和PIL实现PDF转图像,但需确保Ghostscript已在系统PATH中。该方案优先级低于PyMuPDF,仅在Ghostscript可用时考虑。

步骤:

  1. 安装依赖:
pip install ghostscript pillow
  1. 转换代码示例:
from ghostscript import Ghostscript
from PIL import Image
import io

# ... 保留原有从S3获取file_obj的代码 ...

images = []
# 调用Ghostscript将PDF转为多页PNG(输出到标准输出)
args = [
    "gs",
    "-dNOPAUSE", "-dBATCH", "-dSAFER",
    "-sDEVICE=png16m",
    "-r300",  # 分辨率设置为300dpi
    "-sOutputFile=-",
    "-",
]

with Ghostscript(*args, stdin=file_obj) as gs:
    output = gs.stdout.read()
    # 分割多页PNG数据
    png_marker = b"\x89PNG\r\n\x1a\n"
    png_pages = output.split(png_marker)[1:]
    for page_data in png_pages:
        img = Image.open(io.BytesIO(png_marker + page_data))
        images.append(img)

内容的提问来源于stack exchange,提问作者mjoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:35:01