无需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的参数要求。
步骤:
- 安装PyMuPDF:
pip install pymupdf
- 替换原代码中生成
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可用时考虑。
步骤:
- 安装依赖:
pip install ghostscript pillow
- 转换代码示例:
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
相关产品推荐
相关产品推荐

