python
def batch_extract_text_from_png(png_img_list ,system_prompt):
"""
批量调用通义千问3-VL-4B-Instruct,识别多张 PNG 图片并提取文字
参数:
png_img_list: PNG 图片列表(元素为 图片路径str 或 PIL.Image 对象)
返回:
extracted_total_text: 带页号标识的所有图片识别文字(按列表顺序拼接)
"""
# 初始化 API Key
dashscope.api_key = DASHSCOPE_API_KEY
extracted_total_text = ""
# 遍历图片列表,批量处理(按顺序识别,保留页号)
for img_index, png_img in enumerate(png_img_list, 1):
png_img
try:
# 1. 将当前 PNG 图片转为 Base64 编码
img_base64_str = png_to_base64(png_img)
# 2. 构造精准的对话消息(提升文字提取准确性)
messages = [
{
"role": "user",
"content": [
{"image": img_base64_str}, # 传入 PNG 图片 Base64 数据
# 提示词:明确要求,避免冗余,保留格式
{"text": system_prompt}
]
}
]
# 3. 调用通义千问3-VL-4B-Instruct 模型
response = MultiModalConversation.call(
model=MODEL_NAME,
messages=messages,
result_format='message', # 标准消息格式,易解析
stream=False, # 非流式输出,直接获取完整结果
temperature=0.0 # 温度设为0,保证识别结果稳定精准
)
# 4. 解析响应结果并拼接
if response.status_code == 200:
# 提取单张图片的识别文字
single_page_text = response.output.choices[0].message.content[0]['text']
# 拼接页号标识(便于区分不同图片)
extracted_total_text += f"【第 {img_index} 张 PNG 图片】\n"
extracted_total_text += single_page_text + "\n\n"
#extracted_total_text = json.loads(total_text_result_tmp)
print(f"第 {img_index} 张 PNG 图片识别成功!")
else:
# 记录 API 调用失败信息
error_info = f"API调用失败:{response.message}"
extracted_total_text += f"【第 {img_index} 张 PNG 图片】\n{error_info}\n\n"
print(f"第 {img_index} 张 PNG 图片识别失败:{error_info}")
except Exception as e:
# 捕获其他异常(格式错误、网络问题等)
exception_info = f"异常错误:{str(e)}"
extracted_total_text += f"【第 {img_index} 张 PNG 图片】\n{exception_info}\n\n"
print(f"第 {img_index} 张 PNG 图片识别异常:{exception_info}")
return extracted_total_text