阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。
一百页扫描件逐页打开很慢,只看第一页又会漏掉倒置、空白和重复页。缩略总览适合先发现大范围异常,但它不能替代细字、金额和签章检查。做总览时,最重要的是保留页号与原件之间的对应关系。
缩略图保持比例,不把所有页拉成一样
使用
ImageOps.contain
可以在给定框内缩小图像并保持长宽比,再放到固定大小的卡片中。横页和竖页的差别应该保留,否则总览可能掩盖页面方向异常。页码标签由系统添加,不与原始页面内容混淆。
构造两页可追溯总览
from PIL import Image, ImageOps, ImageDraw
pages = [Image.new("RGB", (100, 200), "white"),
Image.new("RGB", (200, 100), "#dddddd")]
sheet = Image.new("RGB", (240, 160), "#eeeeee")
draw = ImageDraw.Draw(sheet)
manifest = []
for index, page in enumerate(pages):
thumb = ImageOps.contain(page, (100, 120))
x = index * 120 + (120 - thumb.width) // 2
sheet.paste(thumb, (x, 5))
draw.text((index * 120 + 10, 140), f"Page {index + 1}", fill="black")
manifest.append({"page": index + 1, "source_size": page.size,
"thumb_size": thumb.size, "column": index})
assert sheet.size == (240, 160)
assert manifest[0]["thumb_size"] == (60, 120)
assert manifest[1]["thumb_size"] == (100, 50)
assert [row["page"] for row in manifest] == [1, 2]
assert pages[0].size == (100, 200)
代码生成内存图,没有写文件,也没有调用识别服务。真实批次应按页分组生成多个总览,避免把数千张缩略图放入一个巨大画布。标签最好还能关联来源文件 ID,防止多个文件的第一页混淆。
总览负责发现什么
可快速发现
不适合仅靠缩略图判断
下一步
大面积空白
是否遗漏淡色批注
打开原图
方向明显异常
小角度倾斜是否影响识别
查看局部与 OCR 结果
页面外形突变
内容是否缺行
对照原始页号
疑似重复页
两页细微修订
比较原图和文本
标记异常而不是自动删除
空白页可能承担章节分隔,重复外观可能是不同版本签署页。总览只负责把疑点交给审校者,不应自动删掉“不像有用内容”的页面。最终交付仍需说明输入页与输出内容的对应关系。
先巡检输入,再审查翻译
使用
OmniDoc(产品入口)
处理长扫描件前,做一次总览巡检能更早发现输入问题。译后再围绕异常页和高风险字段审查,比只看开头几页更有针对性。总览提供方向,原图与双语内容提供最终判断依据。
参考:
Pillow ImageOps.contain
。
- 1 -
更新于 2026-10-08