documentation-hub 5.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +43 -0
- package/.github/workflows/build.yml +64 -0
- package/.github/workflows/ci.yml +39 -0
- package/.vscode/extensions.json +3 -0
- package/Current.md +97 -0
- package/DocHub_Image.png +0 -0
- package/README.md +666 -0
- package/USER_GUIDE.md +1173 -0
- package/Updater.md +311 -0
- package/build/256x256.png +0 -0
- package/build/512x512.png +0 -0
- package/build/app-update.yml +4 -0
- package/build/create-icon.js +208 -0
- package/build/icon.ico +0 -0
- package/build/icon.png +0 -0
- package/build/icon_1024x1024.png +0 -0
- package/dist/assets/Analytics-BpsG9895.js +1 -0
- package/dist/assets/Card-IAZin8kp.js +1 -0
- package/dist/assets/CurrentSession-B-rFkHvf.js +12 -0
- package/dist/assets/Dashboard-C_5gMb0q.js +1 -0
- package/dist/assets/Documents-CqZ25axS.js +1 -0
- package/dist/assets/Input-l89xwXBi.js +1 -0
- package/dist/assets/Reporting-DqdHJY_a.js +1 -0
- package/dist/assets/Search-XNbu5z_3.js +1 -0
- package/dist/assets/SessionManager-lH9hZfzH.js +1 -0
- package/dist/assets/Sessions-ClZOPYNc.js +1 -0
- package/dist/assets/Settings-DUEHGURa.js +11 -0
- package/dist/assets/index-8xUe8ptc.js +24 -0
- package/dist/assets/index-RYyJqF7O.css +1 -0
- package/dist/assets/path-BkOl0AGO.js +1 -0
- package/dist/assets/promises-ID_B9S-h.js +1 -0
- package/dist/assets/urlHelpers-TvgahX0r.js +1 -0
- package/dist/assets/useToast-yRSO1dkm.js +1 -0
- package/dist/assets/vendor-charts-RkGK5ROP.js +36 -0
- package/dist/assets/vendor-db-l0sNRNKZ.js +1 -0
- package/dist/assets/vendor-react-BVZ_anCF.js +4 -0
- package/dist/assets/vendor-search-Dw8P0qyA.js +1 -0
- package/dist/assets/vendor-ui-BU7NfluV.js +53 -0
- package/dist/electron/PowerAutomateApiService-LfW09ZGr.js +147 -0
- package/dist/electron/main-CXkNtyv-.js +19789 -0
- package/dist/electron/main.js +5 -0
- package/dist/electron/preload.js +1 -0
- package/dist/icon.png +0 -0
- package/dist/index.html +27 -0
- package/docs/CODEBASE_ANALYSIS_REPORT.md +309 -0
- package/docs/DEBUG_LOGGING_GUIDE.md +244 -0
- package/docs/README.md +115 -0
- package/docs/TOC_WIRING_GUIDE.md +344 -0
- package/docs/analysis/Bullet_Symbol_Bug_Analysis.md +136 -0
- package/docs/analysis/DOCXMLATER_ANALYSIS_SUMMARY.txt +169 -0
- package/docs/analysis/Document_Processing_Issues_Analysis.md +704 -0
- package/docs/analysis/FIELD_PRESERVATION_ANALYSIS.md +1200 -0
- package/docs/analysis/INDENTATION_PRESERVE_ANALYSIS.md +181 -0
- package/docs/analysis/INDENTATION_PRESERVE_IMPLEMENTATION.md +207 -0
- package/docs/analysis/List_Implementation.md +206 -0
- package/docs/analysis/List_Implementation_Accuracy_Report.md +366 -0
- package/docs/analysis/PROCESSING_OPTIONS_UI_UPDATES.md +220 -0
- package/docs/analysis/RefactorStyles.md +852 -0
- package/docs/analysis/STYLE_PARAMETER_ENHANCEMENT.md +143 -0
- package/docs/analysis/docxmlater-comparison-todo-2025-11-13.md +636 -0
- package/docs/analysis/docxmlater-implementation-analysis-2025-11-13.md +340 -0
- package/docs/analysis/docxmlater-template_ui-integration-analysis.md +263 -0
- package/docs/analysis/github-issues-to-create.md +237 -0
- package/docs/api/API_README.md +538 -0
- package/docs/api/API_REFERENCE.md +751 -0
- package/docs/api/TYPE_DEFINITIONS.md +869 -0
- package/docs/architecture/FONT_EMBEDDING_GUIDE.md +318 -0
- package/docs/architecture/docxmlater-functions-and-structure.md +726 -0
- package/docs/docxmlater-readme.md +1341 -0
- package/docs/fixes/EXECUTION_LOG_TEST_BASE.md +573 -0
- package/docs/fixes/HYPERLINK_TEXT_SANITIZATION.md +253 -0
- package/docs/fixes/README.md +37 -0
- package/docs/github-issues/issue-1-body.md +125 -0
- package/docs/github-issues/issue-10-body.md +850 -0
- package/docs/github-issues/issue-2-body.md +200 -0
- package/docs/github-issues/issue-3-body.md +270 -0
- package/docs/github-issues/issue-4-body.md +169 -0
- package/docs/github-issues/issue-5-body.md +173 -0
- package/docs/github-issues/issue-6-body.md +158 -0
- package/docs/github-issues/issue-7-body.md +171 -0
- package/docs/github-issues/issue-8-body.md +407 -0
- package/docs/github-issues/issue-9-body.md +515 -0
- package/docs/github-issues/issue-tracker.md +274 -0
- package/docs/github-issues/predictive-analysis-2025-10-18.md +2131 -0
- package/docs/implementation/List_Framework_Refactor_Plan.md +336 -0
- package/docs/implementation/PRIMARY_TEXT_COLOR_FEATURE.md +217 -0
- package/docs/implementation/RELEASE_PLAN_v2.1.0.md +362 -0
- package/docs/implementation/RefactorStyles.md +588 -0
- package/docs/implementation/implement-plan.md +489 -0
- package/docs/implementation/missing-helpers-implementation.md +391 -0
- package/docs/implementation/refactor-plan.md +520 -0
- package/docs/implementation/session-implementation-complete.md +233 -0
- package/docs/implementation/session-management-plan.md +250 -0
- package/docs/setup-checklist.md +77 -0
- package/docs/versions/changelog.md +345 -0
- package/electron/customUpdater.ts +656 -0
- package/electron/main.ts +2441 -0
- package/electron/memoryConfig.ts +187 -0
- package/electron/preload.ts +394 -0
- package/electron/proxyConfig.ts +340 -0
- package/electron/services/BackupService.ts +452 -0
- package/electron/services/DictionaryService.ts +402 -0
- package/electron/services/LocalDictionaryLookupService.ts +147 -0
- package/electron/services/PowerAutomateApiService.ts +231 -0
- package/electron/services/SharePointSyncService.ts +474 -0
- package/electron/windowsCertStore.ts +427 -0
- package/electron/zscalerConfig.ts +381 -0
- package/eslint.config.js +92 -0
- package/jest.config.js +52 -0
- package/package.json +214 -0
- package/postcss.config.mjs +6 -0
- package/public/icon.png +0 -0
- package/publish-release.ps1 +5 -0
- package/renovate.json +30 -0
- package/src/App.tsx +216 -0
- package/src/__mocks__/p-limit.js +12 -0
- package/src/__mocks__/styleMock.js +1 -0
- package/src/components/common/BugReportButton.tsx +44 -0
- package/src/components/common/BugReportDialog.tsx +193 -0
- package/src/components/common/Button.tsx +153 -0
- package/src/components/common/Card.tsx +86 -0
- package/src/components/common/ColorPickerDialog.tsx +177 -0
- package/src/components/common/ConfirmDialog.tsx +96 -0
- package/src/components/common/DebugConsole.tsx +275 -0
- package/src/components/common/EmptyState.tsx +183 -0
- package/src/components/common/ErrorBoundary.tsx +98 -0
- package/src/components/common/ErrorDetailsDialog.tsx +153 -0
- package/src/components/common/ErrorFallback.tsx +218 -0
- package/src/components/common/Input.tsx +109 -0
- package/src/components/common/Skeleton.tsx +184 -0
- package/src/components/common/SplashScreen.tsx +81 -0
- package/src/components/common/Toast.tsx +155 -0
- package/src/components/common/Tooltip.tsx +79 -0
- package/src/components/common/UpdateNotification.tsx +320 -0
- package/src/components/comparison/ComparisonWindow.tsx +374 -0
- package/src/components/comparison/SideBySideDiff.tsx +486 -0
- package/src/components/comparison/index.ts +8 -0
- package/src/components/document/DocumentUploader.tsx +288 -0
- package/src/components/document/HyperlinkPreview.tsx +430 -0
- package/src/components/document/HyperlinkService.md +1484 -0
- package/src/components/document/Hyperlink_Technical_Documentation.md +496 -0
- package/src/components/document/InlineChangesView.tsx +707 -0
- package/src/components/document/ProcessingProgress.tsx +303 -0
- package/src/components/document/ProcessingResults.tsx +256 -0
- package/src/components/document/TrackedChangesDetail.tsx +530 -0
- package/src/components/document/TrackedChangesPanel.tsx +546 -0
- package/src/components/document/VirtualDocumentList.tsx +240 -0
- package/src/components/editor/DocumentEditor.tsx +723 -0
- package/src/components/editor/DocumentEditorModal.tsx +640 -0
- package/src/components/editor/EditorQuickActions.tsx +502 -0
- package/src/components/editor/EditorToolbar.tsx +312 -0
- package/src/components/editor/TableEditor.tsx +926 -0
- package/src/components/editor/index.ts +18 -0
- package/src/components/layout/Header.tsx +190 -0
- package/src/components/layout/Sidebar.tsx +313 -0
- package/src/components/layout/TitleBar.tsx +190 -0
- package/src/components/navigation/CommandPalette.tsx +233 -0
- package/src/components/navigation/KeyboardShortcutsModal.tsx +173 -0
- package/src/components/sessions/ChangeItem.tsx +408 -0
- package/src/components/sessions/ChangeViewer.tsx +1155 -0
- package/src/components/sessions/DocumentComparisonModal.tsx +314 -0
- package/src/components/sessions/ProcessingOptions.tsx +297 -0
- package/src/components/sessions/ReplacementsTab.tsx +438 -0
- package/src/components/sessions/RevisionHandlingOptions.tsx +87 -0
- package/src/components/sessions/SessionManager.tsx +188 -0
- package/src/components/sessions/StylesEditor.tsx +1335 -0
- package/src/components/sessions/TabContainer.tsx +151 -0
- package/src/components/sessions/VirtualSessionList.tsx +157 -0
- package/src/components/sessions/sessionToProcessorManager.tsx +420 -0
- package/src/components/settings/CertificateManager.tsx +410 -0
- package/src/components/settings/SegmentedControl.tsx +88 -0
- package/src/components/settings/SettingRow.tsx +52 -0
- package/src/contexts/GlobalStatsContext.tsx +396 -0
- package/src/contexts/SessionContext.tsx +2129 -0
- package/src/contexts/ThemeContext.tsx +428 -0
- package/src/contexts/UserSettingsContext.tsx +290 -0
- package/src/contexts/__tests__/GlobalStatsContext.test.tsx +390 -0
- package/src/global.d.ts +273 -0
- package/src/hooks/useDocumentQueue.tsx +210 -0
- package/src/hooks/useToast.tsx +55 -0
- package/src/main.tsx +10 -0
- package/src/pages/Analytics.tsx +386 -0
- package/src/pages/CurrentSession.tsx +1174 -0
- package/src/pages/Dashboard.tsx +319 -0
- package/src/pages/Documents.tsx +317 -0
- package/src/pages/Projects.tsx +250 -0
- package/src/pages/Reporting.tsx +386 -0
- package/src/pages/Search.tsx +349 -0
- package/src/pages/Sessions.tsx +285 -0
- package/src/pages/Settings.tsx +2662 -0
- package/src/services/HyperlinkService.ts +1085 -0
- package/src/services/document/DocXMLaterProcessor.ts +617 -0
- package/src/services/document/DocumentProcessingComparison.ts +856 -0
- package/src/services/document/DocumentSnapshotService.ts +575 -0
- package/src/services/document/WordDocumentProcessor.ts +10509 -0
- package/src/services/document/__tests__/DocXMLaterProcessor.hyperlinks.test.md +311 -0
- package/src/services/document/__tests__/WordDocumentProcessor.integration.test.ts +515 -0
- package/src/services/document/__tests__/WordDocumentProcessor.test.ts +812 -0
- package/src/services/document/blanklines/BlankLineManager.ts +658 -0
- package/src/services/document/blanklines/__tests__/paragraphChecks.test.ts +281 -0
- package/src/services/document/blanklines/helpers/blankLineInsertion.ts +87 -0
- package/src/services/document/blanklines/helpers/blankLineSnapshot.ts +251 -0
- package/src/services/document/blanklines/helpers/clearCustom.ts +121 -0
- package/src/services/document/blanklines/helpers/contextChecks.ts +117 -0
- package/src/services/document/blanklines/helpers/imageChecks.ts +51 -0
- package/src/services/document/blanklines/helpers/paragraphChecks.ts +236 -0
- package/src/services/document/blanklines/helpers/removeBlanksBetweenListItems.ts +91 -0
- package/src/services/document/blanklines/helpers/removeTrailingBlanks.ts +35 -0
- package/src/services/document/blanklines/helpers/tableGuards.ts +21 -0
- package/src/services/document/blanklines/index.ts +67 -0
- package/src/services/document/blanklines/rules/additionRules.ts +337 -0
- package/src/services/document/blanklines/rules/indentationRules.ts +317 -0
- package/src/services/document/blanklines/rules/removalRules.ts +362 -0
- package/src/services/document/blanklines/rules/ruleTypes.ts +92 -0
- package/src/services/document/blanklines/types.ts +29 -0
- package/src/services/document/helpers/ImageBorderCropper.ts +377 -0
- package/src/services/document/helpers/__tests__/whitespace.test.ts +272 -0
- package/src/services/document/helpers/whitespace.ts +117 -0
- package/src/services/document/list/ListNormalizer.ts +947 -0
- package/src/services/document/list/index.ts +45 -0
- package/src/services/document/list/list-detection.ts +275 -0
- package/src/services/document/list/list-types.ts +162 -0
- package/src/services/document/processors/HyperlinkProcessor.ts +370 -0
- package/src/services/document/processors/ListProcessor.ts +257 -0
- package/src/services/document/processors/StructureProcessor.ts +176 -0
- package/src/services/document/processors/StyleProcessor.ts +389 -0
- package/src/services/document/processors/TableProcessor.ts +2238 -0
- package/src/services/document/processors/__tests__/HyperlinkProcessor.test.ts +314 -0
- package/src/services/document/processors/__tests__/ListProcessor.test.ts +291 -0
- package/src/services/document/processors/__tests__/StructureProcessor.test.ts +257 -0
- package/src/services/document/processors/__tests__/TableProcessor.hlp-tips-bullets.test.ts +459 -0
- package/src/services/document/processors/__tests__/TableProcessor.test.ts +1604 -0
- package/src/services/document/processors/index.ts +28 -0
- package/src/services/document/types/docx-processing.ts +310 -0
- package/src/services/editor/EditorActionHandlers.ts +901 -0
- package/src/services/editor/index.ts +13 -0
- package/src/setupTests.ts +47 -0
- package/src/styles/global.css +782 -0
- package/src/types/backup.ts +132 -0
- package/src/types/dictionary.ts +125 -0
- package/src/types/document-processing.ts +331 -0
- package/src/types/docxmlater-augments.d.ts +142 -0
- package/src/types/editor.ts +280 -0
- package/src/types/electron.ts +340 -0
- package/src/types/globalStats.ts +155 -0
- package/src/types/hyperlink.ts +471 -0
- package/src/types/operations.ts +354 -0
- package/src/types/session.ts +427 -0
- package/src/types/settings.ts +112 -0
- package/src/utils/MemoryMonitor.ts +248 -0
- package/src/utils/cn.ts +6 -0
- package/src/utils/colorConvert.ts +306 -0
- package/src/utils/diffUtils.ts +347 -0
- package/src/utils/documentUtils.ts +202 -0
- package/src/utils/electronGuard.ts +62 -0
- package/src/utils/indexedDB.ts +915 -0
- package/src/utils/logger.ts +717 -0
- package/src/utils/pathSecurity.ts +232 -0
- package/src/utils/pathValidator.ts +236 -0
- package/src/utils/processingTimeEstimator.ts +153 -0
- package/src/utils/safeJsonParse.ts +62 -0
- package/src/utils/textSanitizer.ts +162 -0
- package/src/utils/urlHelpers.ts +304 -0
- package/src/utils/urlPatterns.ts +198 -0
- package/src/utils/urlSanitizer.ts +152 -0
- package/src/vite-env.d.ts +11 -0
- package/tsconfig.electron.json +19 -0
- package/tsconfig.json +36 -0
- package/tsconfig.node.json +12 -0
- package/typedoc.json +45 -0
- package/vite.config.ts +152 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# Font Embedding in DOCX Documents
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide explains how to properly embed fonts in DOCX documents using the docxmlater framework's `FontManager` class. When fonts are embedded, they must be registered in `[Content_Types].xml` to ensure Office applications recognize them.
|
|
6
|
+
|
|
7
|
+
## Important: Content_Types.xml Registration
|
|
8
|
+
|
|
9
|
+
**CRITICAL:** When adding fonts to `/word/fonts/`, you **MUST** add corresponding entries to `[Content_Types].xml`. The `FontManager` class in docxmlater automatically handles this for you.
|
|
10
|
+
|
|
11
|
+
## Font Manager Architecture
|
|
12
|
+
|
|
13
|
+
### Font Structure in DOCX
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
document.docx (ZIP archive)
|
|
17
|
+
├── [Content_Types].xml ← Registers all file types including fonts
|
|
18
|
+
├── word/
|
|
19
|
+
│ ├── document.xml
|
|
20
|
+
│ ├── fontTable.xml ← Optional: Font substitution info
|
|
21
|
+
│ └── fonts/ ← Embedded font files
|
|
22
|
+
│ ├── arial_1.ttf
|
|
23
|
+
│ ├── times_2.otf
|
|
24
|
+
│ └── custom_3.woff
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Content_Types.xml Example
|
|
28
|
+
|
|
29
|
+
When fonts are added, `FontManager` generates entries like:
|
|
30
|
+
|
|
31
|
+
```xml
|
|
32
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
33
|
+
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
|
|
34
|
+
<!-- Font type registrations -->
|
|
35
|
+
<Default Extension="ttf" ContentType="application/x-font-ttf"/>
|
|
36
|
+
<Default Extension="otf" ContentType="application/x-font-opentype"/>
|
|
37
|
+
<Default Extension="woff" ContentType="application/font-woff"/>
|
|
38
|
+
<Default Extension="woff2" ContentType="font/woff2"/>
|
|
39
|
+
|
|
40
|
+
<!-- Other content types... -->
|
|
41
|
+
<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
|
|
42
|
+
</Types>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Using FontManager in docxmlater
|
|
46
|
+
|
|
47
|
+
### Basic Usage
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { Document } from 'docxmlater';
|
|
51
|
+
|
|
52
|
+
// Create or load document
|
|
53
|
+
const doc = await Document.load('input.docx');
|
|
54
|
+
|
|
55
|
+
// Access the document's FontManager
|
|
56
|
+
const fontManager = doc.getFontManager(); // Hypothetical API - needs verification
|
|
57
|
+
|
|
58
|
+
// Add a font from file
|
|
59
|
+
await fontManager.addFontFromFile('Arial', '/path/to/arial.ttf');
|
|
60
|
+
|
|
61
|
+
// Or add from buffer
|
|
62
|
+
const fontData = fs.readFileSync('/path/to/custom.ttf');
|
|
63
|
+
fontManager.addFont('CustomFont', fontData, 'ttf');
|
|
64
|
+
|
|
65
|
+
// Save document - Content_Types.xml is automatically updated
|
|
66
|
+
await doc.save('output.docx');
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Supported Font Formats
|
|
70
|
+
|
|
71
|
+
| Format | Extension | MIME Type | Description |
|
|
72
|
+
|--------|-----------|-----------|-------------|
|
|
73
|
+
| TrueType | `.ttf` | `application/x-font-ttf` | Standard TrueType fonts |
|
|
74
|
+
| OpenType | `.otf` | `application/x-font-opentype` | OpenType fonts |
|
|
75
|
+
| WOFF | `.woff` | `application/font-woff` | Web Open Font Format |
|
|
76
|
+
| WOFF2 | `.woff2` | `font/woff2` | WOFF 2.0 (compressed) |
|
|
77
|
+
|
|
78
|
+
### Font Manager Methods
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// Add font from buffer
|
|
82
|
+
addFont(fontFamily: string, data: Buffer, format: FontFormat): string
|
|
83
|
+
|
|
84
|
+
// Add font from file path
|
|
85
|
+
addFontFromFile(fontFamily: string, filePath: string, format?: FontFormat): Promise<string>
|
|
86
|
+
|
|
87
|
+
// Check if font exists
|
|
88
|
+
hasFont(fontFamily: string): boolean
|
|
89
|
+
|
|
90
|
+
// Get all registered fonts
|
|
91
|
+
getAllFonts(): FontEntry[]
|
|
92
|
+
|
|
93
|
+
// Get font count
|
|
94
|
+
getCount(): number
|
|
95
|
+
|
|
96
|
+
// Get font by family name
|
|
97
|
+
getFontByFamily(fontFamily: string): FontEntry | undefined
|
|
98
|
+
|
|
99
|
+
// Generate Content_Types.xml entries
|
|
100
|
+
generateContentTypeEntries(): string[]
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Font Entry Structure
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
interface FontEntry {
|
|
107
|
+
filename: string; // e.g., 'arial_1.ttf'
|
|
108
|
+
format: FontFormat; // 'ttf' | 'otf' | 'woff' | 'woff2'
|
|
109
|
+
fontFamily: string; // e.g., 'Arial'
|
|
110
|
+
data: Buffer; // Font file binary data
|
|
111
|
+
path: string; // e.g., 'word/fonts/arial_1.ttf'
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Implementation Details
|
|
116
|
+
|
|
117
|
+
### How FontManager Works
|
|
118
|
+
|
|
119
|
+
1. **Font Addition:**
|
|
120
|
+
- When `addFont()` is called, FontManager:
|
|
121
|
+
- Sanitizes the font family name for filename safety
|
|
122
|
+
- Generates a unique filename (e.g., `arial_1.ttf`)
|
|
123
|
+
- Stores font data in memory
|
|
124
|
+
- Returns the path: `word/fonts/filename.ext`
|
|
125
|
+
|
|
126
|
+
2. **Content_Types.xml Update:**
|
|
127
|
+
- When document is saved, FontManager:
|
|
128
|
+
- Detects all unique font extensions used
|
|
129
|
+
- Generates `<Default Extension="..." ContentType="..."/>` entries
|
|
130
|
+
- Injects entries into `[Content_Types].xml`
|
|
131
|
+
|
|
132
|
+
3. **ZIP Archive Creation:**
|
|
133
|
+
- Font files are added to `word/fonts/` directory
|
|
134
|
+
- Content_Types.xml is placed as first entry with STORE compression
|
|
135
|
+
- Maintains proper file ordering for Office compatibility
|
|
136
|
+
|
|
137
|
+
### Filename Sanitization
|
|
138
|
+
|
|
139
|
+
Font family names are sanitized for safe filenames:
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
// Input: "Times New Roman"
|
|
143
|
+
// Output: "times_new_roman_1.ttf"
|
|
144
|
+
|
|
145
|
+
// Input: "Source Sans Pro"
|
|
146
|
+
// Output: "source_sans_pro_2.ttf"
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Counter System
|
|
150
|
+
|
|
151
|
+
Each font gets a unique counter to prevent naming conflicts:
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
fontManager.addFont('Arial', data1, 'ttf'); // → 'arial_1.ttf'
|
|
155
|
+
fontManager.addFont('Arial', data2, 'ttf'); // → 'arial_2.ttf'
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Obfuscated Fonts (.odttf)
|
|
159
|
+
|
|
160
|
+
For copyright protection, fonts can be obfuscated:
|
|
161
|
+
|
|
162
|
+
### ODTTF Format
|
|
163
|
+
|
|
164
|
+
- **Extension:** `.odttf` (Obfuscated OpenType)
|
|
165
|
+
- **MIME Type:** `application/vnd.openxmlformats-officedocument.obfuscatedFont`
|
|
166
|
+
- **Obfuscation:** First 32 bytes XOR-encrypted with font GUID
|
|
167
|
+
|
|
168
|
+
### Content_Types.xml for ODTTF
|
|
169
|
+
|
|
170
|
+
```xml
|
|
171
|
+
<Default Extension="odttf" ContentType="application/vnd.openxmlformats-officedocument.obfuscatedFont"/>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Note:** docxmlater currently supports standard fonts (.ttf, .otf, .woff, .woff2). For .odttf support, custom implementation may be needed.
|
|
175
|
+
|
|
176
|
+
## Best Practices
|
|
177
|
+
|
|
178
|
+
### 1. Font Licensing
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// ✅ GOOD: Only embed fonts you have license to redistribute
|
|
182
|
+
fontManager.addFont('CustomBrandFont', brandFontData, 'ttf');
|
|
183
|
+
|
|
184
|
+
// ❌ BAD: Don't embed licensed fonts without permission
|
|
185
|
+
// fontManager.addFont('HelveticaNeue', data, 'ttf'); // License violation!
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 2. Font Subsetting
|
|
189
|
+
|
|
190
|
+
For production use, embed only glyphs actually used in the document:
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
// Future enhancement: Subset fonts to reduce file size
|
|
194
|
+
// const subset = await createFontSubset(fontData, usedCharacters);
|
|
195
|
+
// fontManager.addFont('Arial', subset, 'ttf');
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 3. Error Handling
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
try {
|
|
202
|
+
await fontManager.addFontFromFile('CustomFont', '/path/to/font.ttf');
|
|
203
|
+
} catch (error) {
|
|
204
|
+
console.error('Font embedding failed:', error);
|
|
205
|
+
// Fallback: Use system fonts
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 4. Verify Font Registration
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
// After adding fonts, verify they're registered
|
|
213
|
+
const fonts = fontManager.getAllFonts();
|
|
214
|
+
console.log(`Embedded ${fonts.length} fonts`);
|
|
215
|
+
|
|
216
|
+
fonts.forEach(font => {
|
|
217
|
+
console.log(`- ${font.fontFamily} (${font.format}) at ${font.path}`);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
// Verify Content_Types entries will be generated
|
|
221
|
+
const entries = fontManager.generateContentTypeEntries();
|
|
222
|
+
console.log('Content_Types.xml entries:', entries);
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Troubleshooting
|
|
226
|
+
|
|
227
|
+
### Issue: Fonts not displaying in Word
|
|
228
|
+
|
|
229
|
+
**Symptoms:** Document opens but custom fonts fall back to default
|
|
230
|
+
|
|
231
|
+
**Causes:**
|
|
232
|
+
1. Missing Content_Types.xml entries
|
|
233
|
+
2. Incorrect MIME types
|
|
234
|
+
3. Corrupted font files
|
|
235
|
+
4. Missing fontTable.xml references
|
|
236
|
+
|
|
237
|
+
**Solutions:**
|
|
238
|
+
```typescript
|
|
239
|
+
// Verify Content_Types.xml contains font entries
|
|
240
|
+
const entries = fontManager.generateContentTypeEntries();
|
|
241
|
+
if (entries.length === 0) {
|
|
242
|
+
console.error('No font Content-Type entries generated!');
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Check font was actually added
|
|
246
|
+
if (!fontManager.hasFont('CustomFont')) {
|
|
247
|
+
console.error('Font was not registered!');
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Verify font file is valid
|
|
251
|
+
const fontData = fs.readFileSync('/path/to/font.ttf');
|
|
252
|
+
if (fontData.length === 0) {
|
|
253
|
+
console.error('Font file is empty!');
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Issue: ZIP corruption after adding fonts
|
|
258
|
+
|
|
259
|
+
**Symptoms:** "File is corrupted" error when opening DOCX
|
|
260
|
+
|
|
261
|
+
**Cause:** Incorrect ZIP structure or Content_Types.xml placement
|
|
262
|
+
|
|
263
|
+
**Solution:** Ensure docxmlater handles ZIP creation:
|
|
264
|
+
```typescript
|
|
265
|
+
// ✅ GOOD: Let docxmlater handle everything
|
|
266
|
+
await doc.save('output.docx');
|
|
267
|
+
|
|
268
|
+
// ❌ BAD: Don't manually manipulate ZIP after adding fonts
|
|
269
|
+
// const buffer = await doc.toBuffer();
|
|
270
|
+
// // Manual ZIP manipulation can corrupt structure
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## Integration with WordDocumentProcessor
|
|
274
|
+
|
|
275
|
+
Our `WordDocumentProcessor` should expose font functionality:
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
// In WordDocumentProcessor.ts
|
|
279
|
+
export class WordDocumentProcessor {
|
|
280
|
+
/**
|
|
281
|
+
* Adds a custom font to the document
|
|
282
|
+
* Automatically updates Content_Types.xml
|
|
283
|
+
*/
|
|
284
|
+
async addCustomFont(fontFamily: string, fontPath: string): Promise<void> {
|
|
285
|
+
const doc = await this.loadDocument();
|
|
286
|
+
const fontManager = doc.getFontManager();
|
|
287
|
+
|
|
288
|
+
await fontManager.addFontFromFile(fontFamily, fontPath);
|
|
289
|
+
|
|
290
|
+
this.log.info(`Added font: ${fontFamily} from ${fontPath}`);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Gets all embedded fonts in the document
|
|
295
|
+
*/
|
|
296
|
+
getEmbeddedFonts(): FontEntry[] {
|
|
297
|
+
const doc = this.getCurrentDocument();
|
|
298
|
+
return doc.getFontManager().getAllFonts();
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## References
|
|
304
|
+
|
|
305
|
+
- [ECMA-376: Office Open XML File Formats](https://www.ecma-international.org/publications-and-standards/standards/ecma-376/)
|
|
306
|
+
- [Microsoft: Office Open XML Font Table](https://learn.microsoft.com/en-us/office/open-xml/word/how-to-set-the-font-for-a-text-run)
|
|
307
|
+
- [ODTTF Wikipedia](https://en.wikipedia.org/wiki/ODTTF)
|
|
308
|
+
- docxmlater FontManager source code (see implementation above)
|
|
309
|
+
|
|
310
|
+
## Version History
|
|
311
|
+
|
|
312
|
+
- **2025-10-19:** Initial documentation created
|
|
313
|
+
- Based on docxmlater v0.26.0 FontManager implementation
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
**Last Updated:** 2025-10-19
|
|
318
|
+
**Maintained By:** Documentation Hub Team
|