You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
注册

PDF转图片Base64编码异常致Gemini无法完整识别页面问题排查

问题排查与修复方案

核心问题定位

你的编码验证环节已确认Base64编码/解码逻辑一致,因此问题不在编码阶段,而是出在PDF转图片的提取环节PIL处理环节——生成的原始图片本身仅包含页面极小部分,最终被编码后传给Gemini导致识别异常。

具体修复步骤

1. 强制设置pdf2image的高DPI参数

pdf2image默认DPI(通常为100)较低,对大尺寸页面或精细布局的PDF,低分辨率会导致提取的图片内容被压缩至局部。修改PDF转图片的代码,设置高DPI:

from pdf2image import convert_from_path

# 转PDF为图片时指定300DPI(适配多数文档的清晰提取需求)
pages = convert_from_path(
    "target.pdf",
    dpi=300,
    poppler_path=r"C:\poppler\bin"  # Windows环境需指定poppler路径,Linux/macOS可省略
)

2. 禁用PDF页面裁剪

部分PDF包含隐藏的裁剪框(CropBox),pdf2image默认会按裁剪框提取内容,导致完整页面被截断。添加参数关闭裁剪:

pages = convert_from_path(
    "target.pdf",
    dpi=300,
    cropbox=False,  # 强制提取完整页面内容
    poppler_path=r"C:\poppler\bin"
)

3. 检查并修正PIL处理的尺寸异常

generate_image_summary函数中添加尺寸校验,避免意外缩放导致的内容丢失:

with Image.open(image_path) as img:
    # 打印原始图片尺寸,确认是否符合预期(如A4纸300DPI对应1240×1754像素)
    print(f"当前图片尺寸:{img.size}")
    # 若尺寸过小,强制缩放至标准分辨率
    if img.size[0] < 800 or img.size[1] < 1100:
        img = img.resize((1240, 1754), Image.Resampling.LANCZOS)
    # 后续格式转换、保存逻辑...

4. 调整PNG保存参数

optimize=True可能在部分场景下触发异常压缩,尝试关闭该参数或手动设置压缩级别:

img.save(
    buffer, 
    format="PNG",
    optimize=False,  # 关闭自动优化,避免内容失真
    compress_level=6  # 手动设置压缩级别(0-9,6为默认平衡值)
)

5. 排查异常PDF文件本身

部分PDF可能存在损坏、非标准页面尺寸(超大/超小)或透明图层问题,单独测试这类异常文件:

  • 用PDF阅读器打开确认页面显示正常
  • 手动提取该页面为图片,对比代码生成的图片是否一致
  • 若PDF本身有问题,先用Adobe Acrobat等工具修复后再处理

验证方法

修改代码后,在生成Base64前将二进制数据保存为临时图片,确认页面完整:

with open("test_page.png", "wb") as f:
    f.write(binary_data)

若临时图片显示正常,再重新调用Gemini API测试反馈结果。

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

火山引擎 最新活动