def extract_paths_from_svg(svg_content): """从 SVG 中提取所有 path 的 d 属性,并按 transform translate X 排序""" root = etree.fromstring(svg_content.encode('utf-8')) ns = {'svg': 'http://www.w3.org/2000/svg'} paths_with_x = [] for elem in root.xpath('//svg:path', namespaces=ns): d = elem.get('d') trans = elem.get('transform', '') m = re.search(r'translate\(([^,]+),', trans) x = float(m.group(1)) if m else 0.0 paths_with_x.append((x, d)) paths_with_x.sort(key=lambda t: t[0]) return [d for _, d in paths_with_x]
def build_template(svg_content, actual_numbers): """ actual_numbers: 整数列表,长度应与 SVG 中的 path 数量一致 返回模板列表 [(path_string, digit), ...] """ paths = extract_paths_from_svg(svg_content) # 将实际数字展开为单个数字列表(例如 1779 -> [1,7,7,9]) digits = [int(d) for num in actual_numbers for d in str(num)] if len(paths) != len(digits): raise ValueError(f"路径数量({len(paths)})与数字数量({len(digits)})不匹配") templates = list(zip(paths, digits)) return templates
def save_templates(templates, filepath='templates.pkl'): with open(filepath, 'wb') as f: pickle.dump(templates, f) data = { "svg_content": "“ } actual = [1779, 7315, 4463, 1366, 7080, 5154, 7302, 1472, 8363, 8264]