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




