feat: 实现 DOCX 可编辑字体嵌入

This commit is contained in:
SkyJourney
2026-07-31 16:18:30 +08:00
parent f3847f3e4b
commit 10bc62cee4
32 changed files with 2195 additions and 76 deletions
+12 -1
View File
@@ -28,6 +28,11 @@ import {
type DynamicReferenceDocxResult
} from "./reference-builder.js";
import { finalizeGeneratedDocxStructure } from "./document-structure-transform.js";
import {
prepareDocxFonts,
type DocxFontSource
} from "./font-embedding.js";
import { embedFontsInGeneratedDocx } from "./font-package-transform.js";
import type { DynamicReferenceDocxOptions } from "./reference-options.js";
import { preparePandocMedia } from "./pandoc-media.js";
import { createPandocStructurePlan } from "./pandoc-structure.js";
@@ -67,6 +72,7 @@ export interface PandocDocxConversionInput {
exportConfig: ExportConfig;
theme: ThemeManifest;
themeTokens: DocxThemeTokenSet;
fonts: DocxFontSource[];
metadata: MarkdownDocumentMetadata;
semanticDocument: SemanticDocumentModel;
media: PreparedDocxMedia;
@@ -225,8 +231,10 @@ export class PandocDocxConverter {
): Promise<PandocDocxConversionResult> {
let preparedMedia;
let structurePlan;
let preparedFonts;
try {
preparedMedia = preparePandocMedia(input.media);
preparedFonts = await prepareDocxFonts(input.fonts);
structurePlan = createPandocStructurePlan(
input.semanticDocument,
input.themeTokens,
@@ -367,7 +375,10 @@ export class PandocDocxConverter {
structurePlan,
input.themeTokens
);
docx = finalized.content;
docx = embedFontsInGeneratedDocx(
finalized.content,
preparedFonts
).content;
if (docx.byteLength > this.maximumOutputBytes) {
throw new Error("DOCX 结构收口后的输出大小无效");
}