certflow.handlers.scan_handler module¶
合格证扫描件处理器
负责扫描件的底层绘制和文件生成: - 图片绘制 (PIL) - 背景图片处理 - 文字渲染 - JPG/PDF 导出 - 布局计算 - 文件命名
- class certflow.handlers.scan_handler.ScanImageHandler[源代码]¶
基类:
object扫描件图片处理器(底层绘制)
- RENDER_DPI = 300¶
- PX_PER_MM = 11.811023622047244¶
- FONT_SCALE = 3.125¶
- MM_TO_PX = 11.811023622047244¶
- classmethod load_background_rgb(background_path)[源代码]¶
加载背景图并归一化到干净 sRGB(修复俄英文背景在 Linux/IDE 偏色)。
问题根因(实测
ru_en_bg.png):该 PNG 像素为 RGB 模式,却内嵌了约 557KB 的 CMYK 打印机 profile**(``Japan Color 2001 Coated``, device class=prtr, space=CMYK)——profile 与像素模式**不匹配。支持色彩管理的 看图器(Linux/IDE 预览)会试图按该 CMYK profile 解读 RGB 像素 → 顶栏/印章 偏色;不做色彩管理的看图器则正常。全中文/中英文背景无 ICC,故不受影响。解法: - profile 的色彩空间与图像 mode **匹配**(如 RGB profile 配 RGB 图)→ 用
ImageCms正常转换到 sRGB;profile 与 mode 不匹配**(本例 CMYK profile 配 RGB 图,无法转换)→ 判定为错误标签,**剥离 profile,直接使用 RGB 像素值;
无 ICC → 仅确保 mode == RGB。
最终一律**清除 ``icc_profile``**,使生成结果在任意看图器下渲染一致(消除 用户所述「Linux 环境 / IDE 打开导致偏色」的不确定性)。
- 参数:
background_path (str) -- 背景图片路径。
- 返回:
无 ICC profile 的 sRGB Image.Image。
- 返回类型:
Image
- draw_text(img, text, x_mm, y_mm, font_size=9, color='black')[源代码]¶
在画布上绘制文字(单段,不自动换行;框内换行请用 draw_field)。
- draw_field(img, value, x_mm, y_mm, font_size=9, width_mm=None, height_mm=None, align='left', v_align='top', color='black')[源代码]¶
绘制字段:按框宽自动换行、超框高自动缩小字号、按对齐绘制。
解决阶段5扫描件两类渲染缺陷(BUG-006): - 长字符串(如产品型号
BESDZY-320)按框宽折行,不再溢出整行; - 字号按基准font_size给出,不再被放大 2 倍; - 内容超高时自动缩小字号以适配框高; - 支持水平(align)/垂直(v_align)对齐,使用坐标配置中的 width/height。- 参数:
img (Image) -- PIL Image 对象
value (str) -- 字段文字内容
x_mm (float) -- 字段框左上角坐标(毫米)
y_mm (float) -- 字段框左上角坐标(毫米)
font_size (int) -- 基准字号(像素)
width_mm (float | None) -- 字段框宽/高(毫米);提供后启用换行与缩放
height_mm (float | None) -- 字段框宽/高(毫米);提供后启用换行与缩放
align (str) -- 水平对齐 left/center/right
v_align (str) -- 垂直对齐 top/center/bottom
color (str) -- 文字颜色
- 返回:
直接在 img 上绘制,无返回值
- 返回类型:
None
- class certflow.handlers.scan_handler.ScanLayoutHandler(rows=1, cols=1)[源代码]¶
基类:
object扫描件布局处理器(负责位置计算)