#!/usr/bin/env python3 """Embed Open Sans / Open Sans Light TTFs into a docx so it renders correctly even on machines that don't have the fonts installed. Mirrors the (unobfuscated) embedding scheme found in the Cloud Drift case-study docx: fontKey all-zeros, plain .ttf parts referenced directly.""" import shutil import zipfile import re import sys DOCX = sys.argv[1] if len(sys.argv) > 1 else "clouddrift-reference.docx" FONT_DIR = "fonts" FONTS = { "Open Sans Light": { "regular": "OpenSansLight-regular.ttf", "bold": "OpenSansLight-bold.ttf", "italic": "OpenSansLight-italic.ttf", "boldItalic": "OpenSansLight-boldItalic.ttf", }, "Open Sans": { "regular": "OpenSans-regular.ttf", "bold": "OpenSans-bold.ttf", "italic": "OpenSans-italic.ttf", "boldItalic": "OpenSans-boldItalic.ttf", }, } NS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships" FONT_REL_TYPE = f"{NS_R}/font".replace(NS_R, "http://schemas.openxmlformats.org/officeDocument/2006/relationships") + "/font" FONT_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/font" def build_font_table_and_rels(): rid = 1 font_entries = [] rels = [] file_map = {} for name, variants in FONTS.items(): embeds = [] for kind, fname in variants.items(): tag = { "regular": "w:embedRegular", "bold": "w:embedBold", "italic": "w:embedItalic", "boldItalic": "w:embedBoldItalic", }[kind] rId = f"rIdFont{rid}" embeds.append( f'<{tag} r:id="{rId}" w:fontKey="{{00000000-0000-0000-0000-000000000000}}" w:subsetted="0"/>' ) rels.append( f'' ) file_map[rId] = fname rid += 1 font_entries.append(f'{"".join(embeds)}') font_table_xml = ( '' '' + "".join(font_entries) + "" ) rels_xml = ( '' '' + "".join(rels) + "" ) return font_table_xml, rels_xml, file_map def patch_settings(xml_text): if "embedTrueTypeFonts" in xml_text: return xml_text return re.sub( r"(]*>)", r'\1', xml_text, count=1, ) def patch_content_types(xml_text): if 'Extension="ttf"' in xml_text: return xml_text return xml_text.replace( "