feat: 完成 DOCX 视觉门禁与字体兼容映射

This commit is contained in:
SkyJourney
2026-07-31 20:13:19 +08:00
parent 10bc62cee4
commit e5da699ea3
32 changed files with 3015 additions and 17 deletions
@@ -19,6 +19,7 @@ import {
readGeneratedDocxPackage,
writeGeneratedDocxPackage
} from "./reference-package.js";
import { createWordFontMetadata } from "./word-font-metadata.js";
const FONT_RELATIONSHIP_TYPE =
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/font";
@@ -318,17 +319,49 @@ function updateFontTable(
font
])
);
const metadataFamilies = new Set<string>();
for (const face of faces) {
const family = face.font.metadata.family;
let font = byName.get(normalizeFontName(family));
const normalizedFamily = normalizeFontName(family);
let font = byName.get(normalizedFamily);
if (!font) {
font = appendElement(root, WORD_NAMESPACE, "w:font", {
"w:name": family
});
appendElement(font, WORD_NAMESPACE, "w:family", {
"w:val": "auto"
byName.set(normalizedFamily, font);
}
if (!metadataFamilies.has(normalizedFamily)) {
const metadata = createWordFontMetadata(face.font.metadata);
removeDirectChildren(
font,
WORD_NAMESPACE,
"panose1",
"charset",
"family",
"pitch",
"sig"
);
appendElement(font, WORD_NAMESPACE, "w:panose1", {
"w:val": metadata.panose1
});
byName.set(normalizeFontName(family), font);
appendElement(font, WORD_NAMESPACE, "w:charset", {
"w:val": metadata.charset
});
appendElement(font, WORD_NAMESPACE, "w:family", {
"w:val": metadata.family
});
appendElement(font, WORD_NAMESPACE, "w:pitch", {
"w:val": metadata.pitch
});
appendElement(font, WORD_NAMESPACE, "w:sig", {
"w:usb0": metadata.signature.usb0,
"w:usb1": metadata.signature.usb1,
"w:usb2": metadata.signature.usb2,
"w:usb3": metadata.signature.usb3,
"w:csb0": metadata.signature.csb0,
"w:csb1": metadata.signature.csb1
});
metadataFamilies.add(normalizedFamily);
}
appendElement(font, WORD_NAMESPACE, `w:${face.role}`, {
"r:id": face.relationshipId,