pptx-embed-fonts
Version:
Embed fonts in pptx files
1 lines • 17.1 kB
Source Map (JSON)
{"version":3,"sources":["/Users/apple/Desktop/codes/pptx-embed-fonts/dist/chunk-XXANICLS.cjs","../src/parse.ts","../src/index.ts","../src/utils.ts"],"names":["fntdataExtensionElement"],"mappings":"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","file":"/Users/apple/Desktop/codes/pptx-embed-fonts/dist/chunk-XXANICLS.cjs","sourcesContent":[null,"import JSZip from \"jszip\";\n\nexport async function toZip(file: ArrayBuffer): Promise<JSZip> {\n const zip = new JSZip();\n return zip.loadAsync(file);\n}\n","import JSZip from \"jszip\";\nimport { toZip } from \"./parse.js\";\nimport opentype from \"opentype.js\";\nimport { DOMParser } from \"@xmldom/xmldom\";\nimport { fontToEot } from \"./utils.js\";\n\nconst isNode =\n typeof process !== \"undefined\" &&\n !!process.versions?.node &&\n process.release?.name === \"node\";\n\nconst START_RID = 201314;\ninterface Font {\n name: string;\n data: ArrayBuffer;\n rid: number;\n}\nclass PPTXEmbedFonts {\n public zip: JSZip | undefined;\n public rId: number = START_RID;\n private _notLoadedError = \"pptx file not loaded\";\n public fonts: Font[] = [];\n constructor(zip?: JSZip) {\n if (zip) {\n this.zip = zip;\n }\n }\n async loadZip(zip: JSZip) {\n this.zip = zip;\n }\n async load(fileBuffer: ArrayBuffer) {\n this.zip = await toZip(fileBuffer);\n }\n public getFontInfo(fontBuffer: ArrayBuffer) {\n const font = opentype.parse(fontBuffer);\n return font;\n }\n private async updateContentTypesXML() {\n if (!this.zip) {\n throw new Error(this._notLoadedError);\n }\n const contentTypes = this.zip.file(\"[Content_Types].xml\");\n if (!contentTypes) {\n throw new Error(\"[Content_Types].xml not found\");\n }\n const contentTypesXml = await contentTypes.async(\"string\");\n const domParser = new DOMParser();\n const doc = domParser.parseFromString(contentTypesXml, \"text/xml\");\n const Types = doc.getElementsByTagName(`Types`)[0];\n if (!Types) {\n throw new Error(\"Types not found\");\n }\n const defaultElements = doc.getElementsByTagName(`Default`);\n const fntdataExtensionElement = Array.from(defaultElements).find(\n (element) => {\n if (element.getAttribute(\"Extension\") === \"fntdata\") {\n return element;\n }\n }\n );\n if (!fntdataExtensionElement) {\n const fntdataExtensionElement = doc.createElement(\"Default\");\n fntdataExtensionElement.setAttribute(\"Extension\", \"fntdata\");\n fntdataExtensionElement.setAttribute(\n \"ContentType\",\n \"application/x-fontdata\"\n );\n Types.insertBefore(fntdataExtensionElement, Types.firstChild);\n }\n this.zip.file(\"[Content_Types].xml\", doc.toString());\n }\n private async updatePresentationXML() {\n if (!this.zip) throw new Error(this._notLoadedError);\n\n const presentation = this.zip.file(\"ppt/presentation.xml\");\n if (!presentation) throw new Error(\"presentation.xml not found\");\n\n const presentationXml = await presentation.async(\"string\");\n const domParser = new DOMParser();\n const doc = domParser.parseFromString(presentationXml, \"text/xml\");\n const presentationNode = doc.getElementsByTagName(`p:presentation`)[0];\n if (!presentationNode) throw new Error(\"presentationNode not found\");\n\n // 设置必要属性\n presentationNode.setAttribute(\"saveSubsetFonts\", \"true\");\n presentationNode.setAttribute(\"embedTrueTypeFonts\", \"true\");\n\n // 创建嵌入字体节点的函数\n const createEmbeddedFontNode = (font: Font) => {\n const embeddedFontNode = doc.createElement(\"p:embeddedFont\");\n const fontNode = doc.createElement(\"p:font\");\n fontNode.setAttribute(\"typeface\", font.name);\n embeddedFontNode.appendChild(fontNode);\n\n const regularNode = doc.createElement(\"p:regular\");\n regularNode.setAttribute(\"r:id\", `rId${font.rid}`);\n embeddedFontNode.appendChild(regularNode);\n return embeddedFontNode;\n };\n\n // 查找或创建 embeddedFontLst 节点\n let embeddedFontLstNode =\n presentationNode.getElementsByTagName(\"p:embeddedFontLst\")[0];\n\n // 如果不存在则创建并插入到正确位置\n // https://www.iso.org/standard/71691.html 规范\n if (!embeddedFontLstNode) {\n embeddedFontLstNode = doc.createElement(\"p:embeddedFontLst\");\n\n // 关键修改1: 确保插入在 defaultTextStyle 之前\n const defaultTextStyleNode =\n presentationNode.getElementsByTagName(\"p:defaultTextStyle\")[0];\n\n if (defaultTextStyleNode) {\n // 如果存在 defaultTextStyle,则在它之前插入\n presentationNode.insertBefore(\n embeddedFontLstNode,\n defaultTextStyleNode\n );\n } else {\n // 否则插入到合理的位置 (sldSz/notesSz 之后)\n const sldSzNode = presentationNode.getElementsByTagName(\"p:sldSz\")[0];\n const notesSzNode =\n presentationNode.getElementsByTagName(\"p:notesSz\")[0];\n const referenceNode =\n notesSzNode || sldSzNode || presentationNode.lastChild;\n\n if (referenceNode) {\n presentationNode.insertBefore(\n embeddedFontLstNode,\n referenceNode.nextSibling\n );\n } else {\n presentationNode.appendChild(embeddedFontLstNode);\n }\n }\n }\n\n // 添加字体到 embeddedFontLst\n this.fonts.forEach((font) => {\n const existingFont = Array.from(\n embeddedFontLstNode!.getElementsByTagName(\"p:font\")\n ).find((node) => node.getAttribute(\"typeface\") === font.name);\n\n if (!existingFont) {\n embeddedFontLstNode!.appendChild(createEmbeddedFontNode(font));\n }\n });\n\n this.zip.file(\"ppt/presentation.xml\", doc.toString());\n }\n private async updateRelsPresentationXML() {\n if (!this.zip) {\n throw new Error(this._notLoadedError);\n }\n const relsPresentation = this.zip.file(\"ppt/_rels/presentation.xml.rels\");\n if (!relsPresentation) {\n throw new Error(\"presentation.xml.rels not found\");\n }\n const relsPresentationXml = await relsPresentation.async(\"string\");\n const domParser = new DOMParser();\n const doc = domParser.parseFromString(relsPresentationXml, \"text/xml\");\n const relationshipsNode = doc.getElementsByTagName(`Relationships`)[0];\n if (!relationshipsNode) {\n throw new Error(\"Relationships not found\");\n }\n this.fonts.forEach((font) => {\n const relationshipNode = doc.createElement(\"Relationship\");\n relationshipNode.setAttribute(\"Id\", `rId${font.rid}`);\n relationshipNode.setAttribute(\"Target\", `fonts/${font.rid}.fntdata`);\n relationshipNode.setAttribute(\n \"Type\",\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/font\"\n );\n relationshipsNode.appendChild(relationshipNode);\n });\n this.zip.file(\"ppt/_rels/presentation.xml.rels\", doc.toString());\n }\n private updateFontFiles() {\n if (!this.zip) {\n throw new Error(this._notLoadedError);\n }\n this.fonts.forEach((font) => {\n this.zip!.file(`ppt/fonts/${font.rid}.fntdata`, font.data, {\n binary: true,\n compression: \"DEFLATE\",\n });\n });\n }\n public uniqueId() {\n return this.rId++;\n }\n private async eot2FntData(eotFile: ArrayBuffer) {\n const unit8Array = new Uint8Array(eotFile);\n const blob = new Blob([unit8Array], {\n type: \"font/opentype\",\n });\n return await blob.arrayBuffer();\n }\n private async addFont(fontFace: string, fntData: ArrayBuffer) {\n const rid = this.uniqueId();\n this.fonts.push({ name: fontFace, data: fntData, rid });\n }\n public async addFontFromEOT(fontFace: string, eotFile: ArrayBuffer) {\n const fontData = await this.eot2FntData(eotFile);\n await this.addFont(fontFace, fontData);\n }\n public async addFontFromTTF(fontFace: string, ttfFile: ArrayBuffer) {\n const eotFile = fontToEot(\"ttf\", ttfFile);\n await this.addFontFromEOT(fontFace, eotFile);\n }\n public async addFontFromWOFF(fontFace: string, woffFile: ArrayBuffer) {\n const eotFile = fontToEot(\"woff\", woffFile);\n await this.addFontFromEOT(fontFace, eotFile);\n }\n public async addFontFromOTF(fontFace: string, otfFile: ArrayBuffer) {\n const eotFile = fontToEot(\"otf\", otfFile);\n await this.addFontFromEOT(fontFace, eotFile);\n }\n public async updateFiles() {\n await this.updateContentTypesXML();\n await this.updatePresentationXML();\n await this.updateRelsPresentationXML();\n this.updateFontFiles();\n }\n public async save() {\n if (!this.zip) {\n throw new Error(this._notLoadedError);\n }\n await this.updateFiles();\n const outputType = isNode ? (\"nodebuffer\" as const) : \"arraybuffer\";\n return this.zip.generateAsync({\n type: outputType,\n compression: \"DEFLATE\",\n compressionOptions: {\n level: 6, // 或 9\n },\n });\n }\n}\n\nexport default PPTXEmbedFonts;\n","import { Font } from \"fonteditor-core\";\nimport pako from \"pako\";\nexport function fontToEot(\n type: \"ttf\" | \"woff\" | \"woff2\" | \"otf\",\n fontBuffer: ArrayBuffer | Uint8Array\n) {\n const font = Font.create(fontBuffer, {\n type,\n hinting: true,\n inflate: pako.inflate as any,\n });\n\n const eotBuffer = font.write({\n type: \"eot\",\n toBuffer: true,\n });\n\n return new Uint8Array(eotBuffer).buffer;\n}\n"]}