reamkit 1.15.1 → 1.15.3
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/dist/esm/core/arc-to-bezier.d.ts +23 -0
- package/dist/esm/core/arc-to-bezier.js +23 -0
- package/dist/esm/core/bidi/algorithm.d.ts +26 -0
- package/dist/esm/core/bidi/algorithm.js +21 -0
- package/dist/esm/core/bidi/char-types.d.ts +17 -0
- package/dist/esm/core/bidi/char-types.js +10 -0
- package/dist/esm/core/bidi/index.d.ts +42 -0
- package/dist/esm/core/bidi/index.js +27 -0
- package/dist/esm/core/bidi/segments.d.ts +22 -0
- package/dist/esm/core/bidi/segments.js +14 -0
- package/dist/esm/core/bytes.d.ts +20 -0
- package/dist/esm/core/bytes.js +24 -1
- package/dist/esm/core/converter/facade.d.ts +38 -1
- package/dist/esm/core/converter/facade.js +25 -0
- package/dist/esm/core/converter/project.d.ts +12 -0
- package/dist/esm/core/converter/project.js +11 -0
- package/dist/esm/core/converter/ream.d.ts +107 -0
- package/dist/esm/core/converter/ream.js +76 -0
- package/dist/esm/core/crypto/asn1.d.ts +77 -0
- package/dist/esm/core/crypto/asn1.js +65 -0
- package/dist/esm/core/crypto/cms.d.ts +25 -0
- package/dist/esm/core/crypto/cms.js +8 -0
- package/dist/esm/core/document-model/index.d.ts +7 -0
- package/dist/esm/core/document-model/types.d.ts +328 -0
- package/dist/esm/core/drawingml/chart-geometry.d.ts +125 -0
- package/dist/esm/core/drawingml/chart-geometry.js +96 -0
- package/dist/esm/core/drawingml/chart-parser.d.ts +34 -0
- package/dist/esm/core/drawingml/chart-parser.js +34 -0
- package/dist/esm/core/drawingml/chart-serializer.d.ts +12 -0
- package/dist/esm/core/drawingml/chart-serializer.js +12 -0
- package/dist/esm/core/drawingml/colors.d.ts +53 -0
- package/dist/esm/core/drawingml/colors.js +41 -0
- package/dist/esm/core/drawingml/preset-geometry.d.ts +30 -0
- package/dist/esm/core/drawingml/preset-geometry.js +30 -0
- package/dist/esm/core/drawingml/shape-render.d.ts +54 -0
- package/dist/esm/core/drawingml/shape-render.js +54 -0
- package/dist/esm/core/drawingml/sparkline-geometry.d.ts +15 -0
- package/dist/esm/core/drawingml/sparkline-geometry.js +13 -0
- package/dist/esm/core/drawingml/theme-parser.d.ts +11 -0
- package/dist/esm/core/drawingml/theme-parser.js +11 -0
- package/dist/esm/core/font/arabic-joining.d.ts +21 -0
- package/dist/esm/core/font/arabic-joining.js +16 -0
- package/dist/esm/core/font/binary-reader.d.ts +17 -0
- package/dist/esm/core/font/binary-reader.js +17 -0
- package/dist/esm/core/font/font-registry.d.ts +37 -0
- package/dist/esm/core/font/font-registry.js +31 -0
- package/dist/esm/core/font/measure.d.ts +20 -0
- package/dist/esm/core/font/measure.js +11 -0
- package/dist/esm/core/font/opentype-layout.d.ts +49 -0
- package/dist/esm/core/font/opentype-layout.js +37 -0
- package/dist/esm/core/font/ttf-parser.d.ts +32 -0
- package/dist/esm/core/font/ttf-parser.js +7 -0
- package/dist/esm/core/font/ttf-subset.d.ts +21 -0
- package/dist/esm/core/font/ttf-subset.js +21 -0
- package/dist/esm/core/fonts/provider.d.ts +8 -1
- package/dist/esm/core/fonts/provider.js +1 -0
- package/dist/esm/core/fonts/remote-fonts.d.ts +22 -0
- package/dist/esm/core/fonts/remote-fonts.js +16 -0
- package/dist/esm/core/hyphenation/index.d.ts +25 -0
- package/dist/esm/core/hyphenation/index.js +17 -0
- package/dist/esm/core/hyphenation/liang.d.ts +27 -0
- package/dist/esm/core/hyphenation/liang.js +14 -0
- package/dist/esm/core/images.d.ts +32 -0
- package/dist/esm/core/images.js +12 -0
- package/dist/esm/core/ir/adapters.d.ts +23 -0
- package/dist/esm/core/ir/features.d.ts +8 -0
- package/dist/esm/core/ir/features.js +1 -0
- package/dist/esm/core/ir/flow.d.ts +20 -0
- package/dist/esm/core/ir/index.d.ts +7 -0
- package/dist/esm/core/ir/loss.d.ts +12 -0
- package/dist/esm/core/ir/loss.js +8 -0
- package/dist/esm/core/ir/resources.d.ts +12 -0
- package/dist/esm/core/ir/resources.js +11 -0
- package/dist/esm/core/ir/sheet.d.ts +81 -0
- package/dist/esm/core/ir/units.d.ts +9 -0
- package/dist/esm/core/ir/units.js +2 -0
- package/dist/esm/core/line-breaker/cjk.d.ts +26 -0
- package/dist/esm/core/line-breaker/cjk.js +60 -0
- package/dist/esm/core/line-breaker/greedy.d.ts +14 -0
- package/dist/esm/core/line-breaker/greedy.js +14 -0
- package/dist/esm/core/line-breaker/index.d.ts +1 -0
- package/dist/esm/core/line-breaker/index.js +3 -0
- package/dist/esm/core/line-breaker/knuth-plass.d.ts +29 -5
- package/dist/esm/core/line-breaker/knuth-plass.js +10 -5
- package/dist/esm/core/numbering/apply.d.ts +19 -0
- package/dist/esm/core/numbering/apply.js +19 -0
- package/dist/esm/core/numbering/state.d.ts +15 -0
- package/dist/esm/core/numbering/state.js +15 -0
- package/dist/esm/core/ole/cfb.d.ts +19 -0
- package/dist/esm/core/ole/cfb.js +16 -0
- package/dist/esm/core/opc/core-properties.d.ts +12 -0
- package/dist/esm/core/opc/core-properties.js +5 -0
- package/dist/esm/core/opc/opc-writer.d.ts +24 -4
- package/dist/esm/core/opc/opc-writer.js +12 -0
- package/dist/esm/core/opc/package.d.ts +55 -0
- package/dist/esm/core/opc/package.js +49 -1
- package/dist/esm/core/opc/relationship-types.d.ts +8 -0
- package/dist/esm/core/opc/relationship-types.js +5 -0
- package/dist/esm/core/opc/relationships.d.ts +12 -0
- package/dist/esm/core/opc/relationships.js +7 -0
- package/dist/esm/core/po-helpers.d.ts +38 -0
- package/dist/esm/core/po-helpers.js +33 -0
- package/dist/esm/core/spreadsheet-model/types.d.ts +302 -0
- package/dist/esm/core/style-cascade/resolver.d.ts +31 -0
- package/dist/esm/core/style-cascade/resolver.js +31 -0
- package/dist/esm/core/style-cascade/table.d.ts +7 -0
- package/dist/esm/core/style-cascade/table.js +7 -0
- package/dist/esm/core/style-cascade/types.d.ts +27 -0
- package/dist/esm/core/style-cascade/types.js +2 -0
- package/dist/esm/core/vector.d.ts +67 -0
- package/dist/esm/core/vector.js +23 -0
- package/dist/esm/excel/activex-parser.d.ts +31 -0
- package/dist/esm/excel/activex-parser.js +24 -0
- package/dist/esm/excel/cell-reference.d.ts +14 -0
- package/dist/esm/excel/cell-reference.js +9 -0
- package/dist/esm/excel/column-bands.d.ts +29 -0
- package/dist/esm/excel/column-bands.js +27 -7
- package/dist/esm/excel/comments-parser.d.ts +19 -0
- package/dist/esm/excel/comments-parser.js +19 -0
- package/dist/esm/excel/conditional-format.d.ts +38 -0
- package/dist/esm/excel/conditional-format.js +25 -0
- package/dist/esm/excel/defined-name-ref.d.ts +21 -0
- package/dist/esm/excel/defined-name-ref.js +20 -0
- package/dist/esm/excel/form-control-parser.d.ts +13 -0
- package/dist/esm/excel/form-control-parser.js +5 -0
- package/dist/esm/excel/formula/context.d.ts +37 -0
- package/dist/esm/excel/formula/dates.d.ts +23 -0
- package/dist/esm/excel/formula/dates.js +20 -0
- package/dist/esm/excel/formula/eval.d.ts +21 -0
- package/dist/esm/excel/formula/eval.js +11 -0
- package/dist/esm/excel/formula/functions.d.ts +12 -0
- package/dist/esm/excel/formula/functions.js +12 -0
- package/dist/esm/excel/formula/index.d.ts +21 -0
- package/dist/esm/excel/formula/index.js +16 -0
- package/dist/esm/excel/formula/lexer.d.ts +12 -0
- package/dist/esm/excel/formula/lexer.js +10 -0
- package/dist/esm/excel/formula/parser.d.ts +20 -0
- package/dist/esm/excel/formula/parser.js +53 -0
- package/dist/esm/excel/formula/value.d.ts +53 -0
- package/dist/esm/excel/formula/value.js +30 -0
- package/dist/esm/excel/header-footer.d.ts +9 -0
- package/dist/esm/excel/header-footer.js +9 -0
- package/dist/esm/excel/number-format.d.ts +34 -0
- package/dist/esm/excel/number-format.js +34 -0
- package/dist/esm/excel/pivot-table-parser.d.ts +8 -0
- package/dist/esm/excel/pivot-table-parser.js +8 -0
- package/dist/esm/excel/print-model.d.ts +77 -1
- package/dist/esm/excel/print-model.js +230 -26
- package/dist/esm/excel/shared-strings-parser.d.ts +13 -0
- package/dist/esm/excel/shared-strings-parser.js +5 -0
- package/dist/esm/excel/sheet-drawing.d.ts +34 -0
- package/dist/esm/excel/sheet-drawing.js +21 -0
- package/dist/esm/excel/sheet-shape-parser.d.ts +12 -0
- package/dist/esm/excel/sheet-shape-parser.js +12 -0
- package/dist/esm/excel/sheet-to-flow.d.ts +29 -0
- package/dist/esm/excel/sheet-to-flow.js +24 -7
- package/dist/esm/excel/slicer-parser.d.ts +23 -0
- package/dist/esm/excel/slicer-parser.js +10 -0
- package/dist/esm/excel/styles-parser.d.ts +8 -0
- package/dist/esm/excel/styles-parser.js +8 -0
- package/dist/esm/excel/table-parser.d.ts +24 -0
- package/dist/esm/excel/table-parser.js +5 -0
- package/dist/esm/excel/workbook-parser.d.ts +17 -0
- package/dist/esm/excel/workbook-parser.js +5 -0
- package/dist/esm/excel/worksheet-parser.d.ts +9 -0
- package/dist/esm/excel/worksheet-parser.js +39 -6
- package/dist/esm/excel/xls/biff-chart.d.ts +10 -0
- package/dist/esm/excel/xls/biff-chart.js +10 -0
- package/dist/esm/excel/xls/biff-reader.d.ts +27 -0
- package/dist/esm/excel/xls/biff-reader.js +44 -0
- package/dist/esm/excel/xls/biff-styles.d.ts +20 -0
- package/dist/esm/excel/xls/biff-styles.js +20 -0
- package/dist/esm/excel/xls/escher.d.ts +27 -0
- package/dist/esm/excel/xls/escher.js +18 -0
- package/dist/esm/excel/xls/xls-reader.d.ts +6 -0
- package/dist/esm/excel/xls/xls-reader.js +6 -0
- package/dist/esm/excel/xlsx-reader.d.ts +30 -0
- package/dist/esm/excel/xlsx-reader.js +38 -4
- package/dist/esm/excel/xlsx-to-pdf.d.ts +27 -0
- package/dist/esm/excel/xlsx-writer.d.ts +14 -0
- package/dist/esm/excel/xlsx-writer.js +13 -0
- package/dist/esm/html/html-writer.d.ts +18 -0
- package/dist/esm/html/html-writer.js +18 -0
- package/dist/esm/index.d.ts +23 -0
- package/dist/esm/layout/math-layout.d.ts +39 -0
- package/dist/esm/layout/math-layout.js +18 -0
- package/dist/esm/layout/page-doc.d.ts +91 -0
- package/dist/esm/layout/styled-layout.d.ts +175 -0
- package/dist/esm/layout/styled-layout.js +136 -4
- package/dist/esm/pdf/builtin-fonts.d.ts +5 -0
- package/dist/esm/pdf/cid-font.d.ts +22 -0
- package/dist/esm/pdf/cid-font.js +10 -0
- package/dist/esm/pdf/embedded-file.d.ts +16 -0
- package/dist/esm/pdf/embedded-file.js +9 -0
- package/dist/esm/pdf/encryption.d.ts +59 -0
- package/dist/esm/pdf/encryption.js +37 -0
- package/dist/esm/pdf/icc-profile.d.ts +8 -0
- package/dist/esm/pdf/icc-profile.js +8 -0
- package/dist/esm/pdf/image-xobject.d.ts +19 -0
- package/dist/esm/pdf/image-xobject.js +9 -0
- package/dist/esm/pdf/objects.d.ts +40 -0
- package/dist/esm/pdf/objects.js +36 -0
- package/dist/esm/pdf/serialize.d.ts +18 -0
- package/dist/esm/pdf/serialize.js +18 -0
- package/dist/esm/pdf/shading.d.ts +16 -0
- package/dist/esm/pdf/shading.js +16 -0
- package/dist/esm/pdf/signature.d.ts +36 -0
- package/dist/esm/pdf/signature.js +22 -0
- package/dist/esm/pdf/struct-tree.d.ts +64 -0
- package/dist/esm/pdf/struct-tree.js +60 -0
- package/dist/esm/pdf/styled-page-emitter.d.ts +33 -0
- package/dist/esm/pdf/styled-page-emitter.js +21 -0
- package/dist/esm/pdf/styled-page-renderer.d.ts +18 -0
- package/dist/esm/pdf/styled-page-renderer.js +18 -0
- package/dist/esm/pdf/text-encoding.d.ts +16 -0
- package/dist/esm/pdf/text-page-renderer.d.ts +11 -0
- package/dist/esm/pdf/vector-graphics.d.ts +12 -0
- package/dist/esm/pdf/vector-graphics.js +12 -0
- package/dist/esm/pdf/writer.d.ts +39 -0
- package/dist/esm/pdf/writer.js +27 -0
- package/dist/esm/pdf/xmp.d.ts +16 -0
- package/dist/esm/pdf/xmp.js +9 -0
- package/dist/esm/pdf-reader/ccitt.d.ts +25 -0
- package/dist/esm/pdf-reader/ccitt.js +15 -0
- package/dist/esm/pdf-reader/cmap.d.ts +12 -0
- package/dist/esm/pdf-reader/cmap.js +9 -0
- package/dist/esm/pdf-reader/content.d.ts +69 -0
- package/dist/esm/pdf-reader/content.js +16 -0
- package/dist/esm/pdf-reader/crypto.d.ts +5 -0
- package/dist/esm/pdf-reader/crypto.js +5 -0
- package/dist/esm/pdf-reader/decrypt.d.ts +17 -0
- package/dist/esm/pdf-reader/decrypt.js +12 -0
- package/dist/esm/pdf-reader/document.d.ts +53 -0
- package/dist/esm/pdf-reader/document.js +50 -0
- package/dist/esm/pdf-reader/flow-build.d.ts +47 -0
- package/dist/esm/pdf-reader/flow-build.js +42 -0
- package/dist/esm/pdf-reader/font.d.ts +12 -0
- package/dist/esm/pdf-reader/font.js +12 -0
- package/dist/esm/pdf-reader/image-decode.d.ts +21 -0
- package/dist/esm/pdf-reader/image-decode.js +14 -0
- package/dist/esm/pdf-reader/images.d.ts +19 -0
- package/dist/esm/pdf-reader/images.js +9 -0
- package/dist/esm/pdf-reader/layout.d.ts +15 -0
- package/dist/esm/pdf-reader/layout.js +15 -0
- package/dist/esm/pdf-reader/lexer.d.ts +43 -0
- package/dist/esm/pdf-reader/lexer.js +38 -0
- package/dist/esm/pdf-reader/parser.d.ts +15 -0
- package/dist/esm/pdf-reader/parser.js +8 -0
- package/dist/esm/pdf-reader/png-encode.d.ts +9 -0
- package/dist/esm/pdf-reader/png-encode.js +8 -0
- package/dist/esm/pdf-reader/predictor.d.ts +9 -0
- package/dist/esm/pdf-reader/predictor.js +8 -0
- package/dist/esm/pdf-reader/reader.d.ts +16 -0
- package/dist/esm/pdf-reader/reader.js +16 -0
- package/dist/esm/pdf-reader/shading.d.ts +10 -0
- package/dist/esm/pdf-reader/shading.js +10 -0
- package/dist/esm/pdf-reader/struct-tree.d.ts +24 -0
- package/dist/esm/pdf-reader/struct-tree.js +12 -0
- package/dist/esm/pdf-reader/tagged.d.ts +13 -0
- package/dist/esm/pdf-reader/tagged.js +13 -0
- package/dist/esm/pdf-reader/text.d.ts +11 -0
- package/dist/esm/pdf-reader/text.js +11 -0
- package/dist/esm/pdf-reader/vector.d.ts +19 -0
- package/dist/esm/pdf-reader/vector.js +9 -0
- package/dist/esm/pptx/placeholder-cascade.d.ts +21 -0
- package/dist/esm/pptx/placeholder-cascade.js +10 -0
- package/dist/esm/pptx/ppt/ppt-reader.d.ts +16 -0
- package/dist/esm/pptx/ppt/ppt-reader.js +16 -0
- package/dist/esm/pptx/ppt/ppt-text.d.ts +55 -0
- package/dist/esm/pptx/ppt/ppt-text.js +14 -0
- package/dist/esm/pptx/pptx-reader.d.ts +21 -0
- package/dist/esm/pptx/pptx-reader.js +23 -2
- package/dist/esm/pptx/slide-parser.d.ts +102 -0
- package/dist/esm/pptx/slide-parser.js +78 -0
- package/dist/esm/pptx/sp-helpers.d.ts +28 -0
- package/dist/esm/pptx/sp-helpers.js +22 -0
- package/dist/esm/svg/svg-writer.d.ts +17 -0
- package/dist/esm/svg/svg-writer.js +16 -0
- package/dist/esm/word/doc/doc-reader.d.ts +16 -0
- package/dist/esm/word/doc/doc-reader.js +16 -0
- package/dist/esm/word/doc/doc-text.d.ts +77 -0
- package/dist/esm/word/doc/doc-text.js +13 -0
- package/dist/esm/word/document-parser.d.ts +134 -0
- package/dist/esm/word/document-parser.js +86 -0
- package/dist/esm/word/docx-reader.d.ts +16 -0
- package/dist/esm/word/docx-reader.js +18 -2
- package/dist/esm/word/docx-to-pdf.d.ts +52 -0
- package/dist/esm/word/docx-to-pdf.js +21 -0
- package/dist/esm/word/docx-writer.d.ts +17 -0
- package/dist/esm/word/docx-writer.js +17 -0
- package/dist/esm/word/drawing-parser.d.ts +88 -0
- package/dist/esm/word/drawing-parser.js +68 -0
- package/dist/esm/word/font-table.d.ts +24 -0
- package/dist/esm/word/font-table.js +24 -0
- package/dist/esm/word/numbering-parser.d.ts +11 -0
- package/dist/esm/word/numbering-parser.js +11 -0
- package/dist/esm/word/omml-parser.d.ts +15 -0
- package/dist/esm/word/omml-parser.js +15 -0
- package/dist/esm/word/omml-serializer.d.ts +9 -0
- package/dist/esm/word/omml-serializer.js +9 -0
- package/dist/esm/word/paragraph-properties.d.ts +10 -0
- package/dist/esm/word/paragraph-properties.js +10 -0
- package/dist/esm/word/po-to-flat.d.ts +11 -0
- package/dist/esm/word/po-to-flat.js +11 -0
- package/dist/esm/word/run-properties.d.ts +10 -0
- package/dist/esm/word/run-properties.js +10 -0
- package/dist/esm/word/settings-parser.d.ts +13 -0
- package/dist/esm/word/settings-parser.js +8 -0
- package/dist/esm/word/styles-parser.d.ts +10 -0
- package/dist/esm/word/styles-parser.js +10 -0
- package/dist/esm/word/table-parser.d.ts +11 -0
- package/dist/esm/word/table-parser.js +11 -0
- package/dist/esm/word/text-extractor.d.ts +9 -0
- package/dist/esm/word/xml-helpers.d.ts +44 -0
- package/dist/esm/word/xml-helpers.js +38 -0
- package/package.json +5 -2
|
@@ -8,29 +8,100 @@ import { SignaturePlaceholder } from '../pdf/signature.js';
|
|
|
8
8
|
import { PdfEncryptOptions } from '../pdf/encryption.js';
|
|
9
9
|
import { ResourceStore } from '../core/ir/index.js';
|
|
10
10
|
import { StructTreeBuilder } from '../pdf/struct-tree.js';
|
|
11
|
+
/**
|
|
12
|
+
* PDF/A conformance string: part 1 (ISO 19005-1, PDF 1.4) / 2 (ISO 19005-2) / 3
|
|
13
|
+
* (ISO 19005-3, both PDF 1.7); conformance level a (tagged) / b (visual) /
|
|
14
|
+
* u (Unicode — only 2/3).
|
|
15
|
+
*/
|
|
11
16
|
export type PdfALevel = 'PDF/A-1b' | 'PDF/A-1a' | 'PDF/A-2b' | 'PDF/A-2u' | 'PDF/A-2a' | 'PDF/A-3b' | 'PDF/A-3u' | 'PDF/A-3a';
|
|
17
|
+
/** A {@link PdfALevel} decomposed into the part, level, and the apparatus they imply. */
|
|
12
18
|
export interface PdfAProfile {
|
|
13
19
|
readonly part: 1 | 2 | 3;
|
|
14
20
|
readonly level: 'a' | 'b' | 'u';
|
|
21
|
+
/** Whether the level mandates a tagged PDF (level `a`). */
|
|
15
22
|
readonly tagged: boolean;
|
|
23
|
+
/** PDF version the part pins: part 1 → 1.4, else 1.7. */
|
|
16
24
|
readonly version: '1.4' | '1.7';
|
|
17
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* E-PARITY: renderer-compatibility profile for the line-height model.
|
|
28
|
+
* `'ream'` (default) — Ream's flat 1.2× leading; byte-identical to before.
|
|
29
|
+
* `'word'` — leading from the font's OS/2 usWin metrics (the GDI cell box).
|
|
30
|
+
* `'libreoffice'` — leading from hhea (or OS/2 typo when USE_TYPO_METRICS is set).
|
|
31
|
+
*
|
|
32
|
+
* Opt-in: a profile emulates that renderer's vertical rhythm for closer visual
|
|
33
|
+
* parity. It never changes default (`'ream'`) output.
|
|
34
|
+
*/
|
|
18
35
|
export type LayoutProfile = 'ream' | 'word' | 'libreoffice';
|
|
36
|
+
/**
|
|
37
|
+
* The full option set the layout engine and PDF emitter consume: the resolved
|
|
38
|
+
* font registry, the style/numbering tables, the section model and page
|
|
39
|
+
* geometry, the after-body apparatus (footnotes, endnotes, comments), and every
|
|
40
|
+
* PDF-output toggle (PDF/A, tagged, PDF/UA, encryption, attachments,
|
|
41
|
+
* signatures). Only `registry` and `styles` are required; everything else falls
|
|
42
|
+
* back to a sensible default.
|
|
43
|
+
*/
|
|
19
44
|
export interface StyledRenderOptions {
|
|
45
|
+
/** The resolved font set every run draws with (the guaranteed fallback registry). */
|
|
20
46
|
readonly registry: FontRegistry;
|
|
47
|
+
/** Renderer-compatibility profile for the line-height model (default `'ream'`). */
|
|
21
48
|
readonly layoutProfile?: LayoutProfile;
|
|
49
|
+
/**
|
|
50
|
+
* Per-run font resolution: when supplied, each text run picks the registry of
|
|
51
|
+
* its declared family (sans→arimo / serif→tinos / mono→cousine via the run's
|
|
52
|
+
* `w:ascii`) instead of always using `registry`. Absent ⇒ single-family (every
|
|
53
|
+
* run uses `registry`), byte-identical to before. `registry` remains the
|
|
54
|
+
* guaranteed fallback for math/chart/default glyphs and any missing family.
|
|
55
|
+
*/
|
|
22
56
|
readonly registriesByFamily?: ReadonlyMap<FamilyKey, FontRegistry>;
|
|
57
|
+
/**
|
|
58
|
+
* The document's OWN embedded fonts (`word/fonts/*.odttf`, de-obfuscated),
|
|
59
|
+
* keyed by normalized font name. A run whose `w:ascii` matches one renders with
|
|
60
|
+
* the real font — glyph-exact, no substitution. Highest priority.
|
|
61
|
+
*/
|
|
23
62
|
readonly embeddedFonts?: ReadonlyMap<string, FontRegistry>;
|
|
63
|
+
/** §18.8 / ECMA-376 style table the cascade resolves against. */
|
|
24
64
|
readonly styles: StyleSheet;
|
|
65
|
+
/** §17.9 numbering definitions; applied to list paragraphs before layout. */
|
|
25
66
|
readonly numbering?: Numbering;
|
|
67
|
+
/**
|
|
68
|
+
* Single-section legacy entry-point. If `sections` is set it takes precedence
|
|
69
|
+
* and `section` is ignored.
|
|
70
|
+
*/
|
|
26
71
|
readonly section?: SectionProperties;
|
|
72
|
+
/**
|
|
73
|
+
* ECMA-376 §17.6 — ordered list of sections. Each section's `endIndex` is the
|
|
74
|
+
* exclusive bound into the body array (section N covers
|
|
75
|
+
* `body[sections[N-1].endIndex..sections[N].endIndex)`).
|
|
76
|
+
*/
|
|
27
77
|
readonly sections?: ReadonlyArray<Section>;
|
|
78
|
+
/** Header/footer body content keyed by relationship id. */
|
|
28
79
|
readonly headersFooters?: ReadonlyMap<string, ReadonlyArray<BodyElement>>;
|
|
80
|
+
/**
|
|
81
|
+
* §17.11 notes content by id. Footnotes render in a reserved band at the
|
|
82
|
+
* bottom of the referencing page; endnotes flow after the body.
|
|
83
|
+
*/
|
|
29
84
|
readonly footnotes?: ReadonlyMap<string, ReadonlyArray<BodyElement>>;
|
|
30
85
|
readonly endnotes?: ReadonlyMap<string, ReadonlyArray<BodyElement>>;
|
|
86
|
+
/**
|
|
87
|
+
* §17.13.4 review comments by id; rendered as superscript markers in text and
|
|
88
|
+
* a list after the body (after endnotes), each with its author/date.
|
|
89
|
+
*/
|
|
31
90
|
readonly comments?: ReadonlyMap<string, Comment>;
|
|
91
|
+
/**
|
|
92
|
+
* CM2b — also emit each comment as a native PDF `/Text` (sticky-note)
|
|
93
|
+
* annotation at its marker. Opt-in and interactive-only: suppressed under
|
|
94
|
+
* PDF/A and tagged output (where it would need annotation/appearance
|
|
95
|
+
* conformance), since the clickable marker + Comments section already carry
|
|
96
|
+
* the content there.
|
|
97
|
+
*/
|
|
32
98
|
readonly commentAnnotations?: boolean;
|
|
99
|
+
/** Content-addressed binary store; image nodes reference it by {@link ResourceId}. */
|
|
33
100
|
readonly resources?: ResourceStore;
|
|
101
|
+
/**
|
|
102
|
+
* Parsed charts keyed by relationship id (`ChartBlock.chartRelId`). Supplied by
|
|
103
|
+
* the converter, which resolves the chart parts from the package.
|
|
104
|
+
*/
|
|
34
105
|
readonly charts?: ReadonlyMap<string, Chart>;
|
|
35
106
|
readonly pageWidth?: number;
|
|
36
107
|
readonly pageHeight?: number;
|
|
@@ -38,39 +109,130 @@ export interface StyledRenderOptions {
|
|
|
38
109
|
readonly marginRight?: number;
|
|
39
110
|
readonly marginTop?: number;
|
|
40
111
|
readonly marginBottom?: number;
|
|
112
|
+
/**
|
|
113
|
+
* Optional Liang hyphenator. When set, each word token is split at allowed
|
|
114
|
+
* hyphenation positions and offered to Knuth-Plass as potential break points
|
|
115
|
+
* (with a small disincentive). Improves justified paragraph rags.
|
|
116
|
+
*/
|
|
41
117
|
readonly hyphenator?: Hyphenator;
|
|
118
|
+
/**
|
|
119
|
+
* Optional `/Info` dictionary metadata (ISO 32000-1 §14.3.3). Unset fields are
|
|
120
|
+
* omitted; if any field is set a PDF `/Info` entry is emitted.
|
|
121
|
+
*/
|
|
42
122
|
readonly info?: DocumentInfo;
|
|
123
|
+
/**
|
|
124
|
+
* When set, emit a PDF/A-conformant file: an OutputIntent with an embedded
|
|
125
|
+
* sRGB ICC profile, document XMP `/Metadata` (the pdfaid identifier), `/ID`,
|
|
126
|
+
* and subset-tagged fonts with a `/CIDSet`. The profile picks the rest:
|
|
127
|
+
* part 1 → PDF 1.4 + flattened image alpha (no transparency);
|
|
128
|
+
* part 2/3 → PDF 1.7 + preserved transparency (image `/SMask` + page group);
|
|
129
|
+
* part 3 → may carry embedded associated files (see `attachments`);
|
|
130
|
+
* level a → tagged (logical structure); b → visual; u → b + Unicode mapping.
|
|
131
|
+
*/
|
|
43
132
|
readonly pdfA?: PdfALevel;
|
|
133
|
+
/**
|
|
134
|
+
* Emit a tagged PDF (ISO 32000-1 §14.8): a `/StructTreeRoot` describing reading
|
|
135
|
+
* order, marked content (BDC/EMC + MCID) on body text, and `/Artifact` marking
|
|
136
|
+
* of page decoration. Implied by `pdfA: 'PDF/A-1a'`. Independent of PDF/A
|
|
137
|
+
* otherwise (a plain tagged PDF is useful on its own).
|
|
138
|
+
*/
|
|
44
139
|
readonly tagged?: boolean;
|
|
140
|
+
/**
|
|
141
|
+
* PDF/UA-1 (ISO 14289-1): implies tagged; the XMP carries `pdfuaid:part=1` and
|
|
142
|
+
* the document always gets a title (AT announces it). Combines freely with
|
|
143
|
+
* `pdfA` level-a profiles.
|
|
144
|
+
*/
|
|
45
145
|
readonly pdfUA?: boolean;
|
|
146
|
+
/**
|
|
147
|
+
* Document natural language (BCP 47, e.g. `"en-US"`, `"ru-RU"`) for the
|
|
148
|
+
* tagged-PDF catalog `/Lang` (§14.9.2). Defaults to `"en-US"`. The docx
|
|
149
|
+
* converter fills this from the document's default `w:lang`.
|
|
150
|
+
*/
|
|
46
151
|
readonly language?: string;
|
|
152
|
+
/**
|
|
153
|
+
* §7.6 PDF encryption (AES-256, R6). Only honoured on the ASYNC conversion
|
|
154
|
+
* path (WebCrypto); mutually exclusive with `pdfA` (ISO 19005 forbids
|
|
155
|
+
* `/Encrypt`) and with signatures (v1).
|
|
156
|
+
*/
|
|
47
157
|
readonly encrypt?: PdfEncryptOptions;
|
|
158
|
+
/**
|
|
159
|
+
* Files to embed as associated files (catalog `/AF` + `/Names`
|
|
160
|
+
* `/EmbeddedFiles`). Only emitted for plain PDF and PDF/A-3 (PDF/A-1/2 forbid
|
|
161
|
+
* arbitrary embedded files); ignored for PDF/A-1/2. The docx/xlsx converters
|
|
162
|
+
* can embed the source document automatically via `embedSource`.
|
|
163
|
+
*/
|
|
48
164
|
readonly attachments?: ReadonlyArray<AttachedFile>;
|
|
165
|
+
/**
|
|
166
|
+
* Emit an (invisible) signature field + signature dictionary with placeholder
|
|
167
|
+
* `/ByteRange` and `/Contents` (ISO 32000 §12.8). The result is an UNSIGNED
|
|
168
|
+
* PDF; pass it to `signPdf()` to fill the placeholder with a real PKCS#7
|
|
169
|
+
* signature.
|
|
170
|
+
*/
|
|
49
171
|
readonly signaturePlaceholder?: SignaturePlaceholder;
|
|
50
172
|
}
|
|
51
173
|
export type { DocumentInfo } from '../core/document-model/index.js';
|
|
174
|
+
/** A4 page width in points (the page-geometry fallback). */
|
|
52
175
|
export declare const A4_WIDTH = 595;
|
|
176
|
+
/** A4 page height in points (the page-geometry fallback). */
|
|
53
177
|
export declare const A4_HEIGHT = 842;
|
|
178
|
+
/**
|
|
179
|
+
* §17.13.6.2 — a bookmark's GoTo destination: the page (0-based) and the y-up
|
|
180
|
+
* top of the anchoring paragraph's first line.
|
|
181
|
+
*/
|
|
54
182
|
export interface BookmarkPosition {
|
|
55
183
|
readonly pageIdx: number;
|
|
56
184
|
readonly yTopPt: number;
|
|
57
185
|
}
|
|
186
|
+
/** A comment's `/Text` annotation payload: the author and the flattened body (CM2b). */
|
|
58
187
|
export interface CommentNote {
|
|
59
188
|
readonly author?: string;
|
|
60
189
|
readonly contents: string;
|
|
61
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* PDF-only companion the same layout pass produces (oop-design A13): the
|
|
193
|
+
* logical-structure tree, per-section geometry (the emit fallback page), and the
|
|
194
|
+
* parsed PDF/A profile. Consumed only by `emitStyledPdf`; the SVG writer never
|
|
195
|
+
* sees it.
|
|
196
|
+
*/
|
|
62
197
|
export interface PdfLayoutAux {
|
|
63
198
|
readonly structBuilder: StructTreeBuilder | undefined;
|
|
64
199
|
readonly sectionCtxs: ReadonlyArray<SectionRenderCtx>;
|
|
65
200
|
readonly pdfaProfile: PdfAProfile | undefined;
|
|
66
201
|
readonly tagged: boolean;
|
|
67
202
|
readonly bookmarks: ReadonlyMap<string, BookmarkPosition>;
|
|
203
|
+
/**
|
|
204
|
+
* CM2b — comment marker anchor (`comment-${n}`) → the note the emitter attaches
|
|
205
|
+
* as a `/Text` annotation. Present only when `commentAnnotations` was requested.
|
|
206
|
+
*/
|
|
68
207
|
readonly commentNotes?: ReadonlyMap<string, CommentNote>;
|
|
69
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* What {@link layoutStyledDocument} actually returns: the PageDoc with the PDF
|
|
211
|
+
* companion riding on `pdf`. Assignable to the narrow `LaidOutDocument`, so
|
|
212
|
+
* PageDoc-only consumers (`writeSvg`) take it as-is.
|
|
213
|
+
*/
|
|
70
214
|
export interface LaidOutPdfDocument extends LaidOutDocument {
|
|
71
215
|
readonly pdf: PdfLayoutAux;
|
|
72
216
|
}
|
|
217
|
+
/**
|
|
218
|
+
* Layout phase (the FlowDoc→PageDoc transform of ir-design §7): body →
|
|
219
|
+
* positioned pages (PageItems), font/image resources, logical structure. Drives
|
|
220
|
+
* the whole pass — numbering and note numbering, per-section geometry, per-block
|
|
221
|
+
* layout, the footnote/endnote/comment tails, then pagination — and returns the
|
|
222
|
+
* {@link LaidOutPdfDocument} (the PageDoc plus its PDF companion).
|
|
223
|
+
*
|
|
224
|
+
* @param body The document body the section model partitions.
|
|
225
|
+
* @param options The resolved fonts, styles, section model, and PDF-output toggles.
|
|
226
|
+
* @returns The positioned pages plus the PDF-only {@link PdfLayoutAux} companion.
|
|
227
|
+
*/
|
|
73
228
|
export declare function layoutStyledDocument(body: ReadonlyArray<BodyElement>, options: StyledRenderOptions): LaidOutPdfDocument;
|
|
229
|
+
/**
|
|
230
|
+
* The resolved page box + header/footer offsets, in points. Priority for page
|
|
231
|
+
* geometry:
|
|
232
|
+
* 1. explicit value in {@link StyledRenderOptions} (test/library caller override)
|
|
233
|
+
* 2. value from section properties (`sectPr/pgSz/pgMar` from the docx)
|
|
234
|
+
* 3. A4 + 1-inch margins fallback
|
|
235
|
+
*/
|
|
74
236
|
export interface PageDimensions {
|
|
75
237
|
readonly pageWidth: number;
|
|
76
238
|
readonly pageHeight: number;
|
|
@@ -81,6 +243,13 @@ export interface PageDimensions {
|
|
|
81
243
|
readonly headerOffsetPt: number;
|
|
82
244
|
readonly footerOffsetPt: number;
|
|
83
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Per-section render context: the section's exclusive body `endIndex`, its
|
|
248
|
+
* resolved {@link PageDimensions} (flattened), the derived content box, the
|
|
249
|
+
* column geometry, the pre-laid header/footer bands, and the title-page /
|
|
250
|
+
* even-and-odd header toggles. Built once per section and threaded through both
|
|
251
|
+
* layout and pagination.
|
|
252
|
+
*/
|
|
84
253
|
export interface SectionRenderCtx {
|
|
85
254
|
readonly endIndex: number;
|
|
86
255
|
readonly properties: SectionProperties;
|
|
@@ -91,6 +260,12 @@ export interface SectionRenderCtx {
|
|
|
91
260
|
readonly marginBottom: number;
|
|
92
261
|
readonly contentWidth: number;
|
|
93
262
|
readonly pageContentHeight: number;
|
|
263
|
+
/**
|
|
264
|
+
* §17.6.4 multi-column sections: per-column x-offset (from `marginLeft`) and
|
|
265
|
+
* width. Absent for single-column sections. Body blocks are laid out at the
|
|
266
|
+
* FIRST column's width (explicit unequal widths degrade to flowing without
|
|
267
|
+
* re-wrap); headers/footers and footnotes keep the full content width.
|
|
268
|
+
*/
|
|
94
269
|
readonly columns?: ReadonlyArray<{
|
|
95
270
|
readonly xOffsetPt: number;
|
|
96
271
|
readonly widthPt: number;
|
|
@@ -8,6 +8,8 @@ import { segmentLevels } from "../core/bidi/segments.js";
|
|
|
8
8
|
import { analyzeString, hasBidiCharacters } from "../core/bidi/index.js";
|
|
9
9
|
import { FORCED_BREAK, breakLines } from "../core/line-breaker/knuth-plass.js";
|
|
10
10
|
import { greedyBreakLines } from "../core/line-breaker/greedy.js";
|
|
11
|
+
import { cjkBreakBetween, splitCjkSegment } from "../core/line-breaker/cjk.js";
|
|
12
|
+
import "../core/line-breaker/index.js";
|
|
11
13
|
import { applyNumbering, applyNumberingToHeadersFooters } from "../core/numbering/apply.js";
|
|
12
14
|
import { DEFAULT_RESOLVED_PARAGRAPH, DEFAULT_RESOLVED_RUN } from "../core/style-cascade/types.js";
|
|
13
15
|
import { resolveParagraphProperties, resolveRunProperties } from "../core/style-cascade/resolver.js";
|
|
@@ -242,6 +244,17 @@ function commentTailBlocks(comment, n, opts) {
|
|
|
242
244
|
}
|
|
243
245
|
}, ...comment.content];
|
|
244
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Layout phase (the FlowDoc→PageDoc transform of ir-design §7): body →
|
|
249
|
+
* positioned pages (PageItems), font/image resources, logical structure. Drives
|
|
250
|
+
* the whole pass — numbering and note numbering, per-section geometry, per-block
|
|
251
|
+
* layout, the footnote/endnote/comment tails, then pagination — and returns the
|
|
252
|
+
* {@link LaidOutPdfDocument} (the PageDoc plus its PDF companion).
|
|
253
|
+
*
|
|
254
|
+
* @param body The document body the section model partitions.
|
|
255
|
+
* @param options The resolved fonts, styles, section model, and PDF-output toggles.
|
|
256
|
+
* @returns The positioned pages plus the PDF-only {@link PdfLayoutAux} companion.
|
|
257
|
+
*/
|
|
245
258
|
function layoutStyledDocument(body, options) {
|
|
246
259
|
const sectionList = resolveSectionList(body, options);
|
|
247
260
|
const noteAssigned = assignNoteNumbers(applyNumbering(body, options.numbering), options.comments ? new Set(options.comments.keys()) : void 0);
|
|
@@ -1323,15 +1336,20 @@ function tokenizeText(text) {
|
|
|
1323
1336
|
text: m[1],
|
|
1324
1337
|
isSpace: true
|
|
1325
1338
|
});
|
|
1326
|
-
else if (m[2] !== void 0) out.push({
|
|
1327
|
-
text:
|
|
1339
|
+
else if (m[2] !== void 0) for (const piece of splitCjkSegment(m[2])) out.push({
|
|
1340
|
+
text: piece,
|
|
1328
1341
|
isSpace: false
|
|
1329
1342
|
});
|
|
1330
1343
|
return out;
|
|
1331
1344
|
}
|
|
1332
1345
|
var HYPHENATION_PENALTY = 50;
|
|
1346
|
+
function lastCodePoint(s) {
|
|
1347
|
+
const chars = [...s];
|
|
1348
|
+
return chars.length > 0 ? chars[chars.length - 1].codePointAt(0) : 0;
|
|
1349
|
+
}
|
|
1333
1350
|
function paragraphItemStream(tokens, hyphenator) {
|
|
1334
1351
|
const entries = [];
|
|
1352
|
+
let prevBoxEndCp = null;
|
|
1335
1353
|
for (const tok of tokens) {
|
|
1336
1354
|
if (tok.isSpace || tok.kind === "image" || tok.kind === "math") {
|
|
1337
1355
|
entries.push({
|
|
@@ -1346,8 +1364,20 @@ function paragraphItemStream(tokens, hyphenator) {
|
|
|
1346
1364
|
},
|
|
1347
1365
|
token: tok
|
|
1348
1366
|
});
|
|
1367
|
+
prevBoxEndCp = null;
|
|
1349
1368
|
continue;
|
|
1350
1369
|
}
|
|
1370
|
+
const startCp = tok.text.codePointAt(0) ?? 0;
|
|
1371
|
+
if (prevBoxEndCp !== null && cjkBreakBetween(prevBoxEndCp, startCp)) entries.push({
|
|
1372
|
+
item: {
|
|
1373
|
+
type: "penalty",
|
|
1374
|
+
width: 0,
|
|
1375
|
+
penalty: 0,
|
|
1376
|
+
flagged: false
|
|
1377
|
+
},
|
|
1378
|
+
token: null
|
|
1379
|
+
});
|
|
1380
|
+
prevBoxEndCp = lastCodePoint(tok.text);
|
|
1351
1381
|
const positions = hyphenator ? hyphenator.hyphenate(tok.text) : [];
|
|
1352
1382
|
if (positions.length === 0) {
|
|
1353
1383
|
entries.push({
|
|
@@ -1837,7 +1867,23 @@ function listItemParagraphNode(builder, stack, list, wantLbl) {
|
|
|
1837
1867
|
...lblId !== void 0 ? { lblId } : {}
|
|
1838
1868
|
};
|
|
1839
1869
|
}
|
|
1870
|
+
/**
|
|
1871
|
+
* A9 (oop-design §4.3): the page-assembly state machine, extracted verbatim from
|
|
1872
|
+
* `paginateSections`. One instance assembles all pages of a document: fields are
|
|
1873
|
+
* the former local state, methods the former closures — the block loop drives it.
|
|
1874
|
+
* Push order into `current`/`pages` IS the byte order of the emitted PDF, so the
|
|
1875
|
+
* bodies move unchanged.
|
|
1876
|
+
*/
|
|
1840
1877
|
var PageAssembler = class {
|
|
1878
|
+
/**
|
|
1879
|
+
* @param sectionCtxs The per-section render contexts, in order; assembly
|
|
1880
|
+
* starts on the first section's first page.
|
|
1881
|
+
* @param builder The tagged-PDF structure builder, or `undefined` for
|
|
1882
|
+
* untagged output.
|
|
1883
|
+
* @param notes The footnote plan (lazy per-section layout), or
|
|
1884
|
+
* `undefined` when there are none.
|
|
1885
|
+
* @param bookmarkPositions Out-param: bookmark name → its GoTo destination.
|
|
1886
|
+
*/
|
|
1841
1887
|
constructor(sectionCtxs, builder, notes, bookmarkPositions) {
|
|
1842
1888
|
this.sectionCtxs = sectionCtxs;
|
|
1843
1889
|
this.builder = builder;
|
|
@@ -1845,6 +1891,7 @@ var PageAssembler = class {
|
|
|
1845
1891
|
this.bookmarkPositions = bookmarkPositions;
|
|
1846
1892
|
this.ctx = sectionCtxs[0];
|
|
1847
1893
|
this.cursorY = this.ctx.pageHeight - this.ctx.marginTop;
|
|
1894
|
+
this.colStartY = this.cursorY;
|
|
1848
1895
|
}
|
|
1849
1896
|
pages = [];
|
|
1850
1897
|
ctx;
|
|
@@ -1854,21 +1901,56 @@ var PageAssembler = class {
|
|
|
1854
1901
|
current = [];
|
|
1855
1902
|
pendingPageBreak = false;
|
|
1856
1903
|
cursorY;
|
|
1904
|
+
/**
|
|
1905
|
+
* §17.6.4 multi-column flow: content fills column after column before the page
|
|
1906
|
+
* flushes. `colStartLen` marks where the current column's items begin in
|
|
1907
|
+
* `current` — the single-column "page has content" guard generalizes to "this
|
|
1908
|
+
* column has content" (identical when there is one column).
|
|
1909
|
+
*/
|
|
1857
1910
|
colIdx = 0;
|
|
1858
1911
|
colStartLen = 0;
|
|
1912
|
+
/** The cursor's y at the top of the current column — see {@link colHasContent}. */
|
|
1913
|
+
colStartY;
|
|
1914
|
+
/** The current column's left edge (`marginLeft` plus the column x-offset). */
|
|
1859
1915
|
colLeft = () => this.ctx.marginLeft + (this.ctx.columns?.[this.colIdx]?.xOffsetPt ?? 0);
|
|
1916
|
+
/** The current column's width (the section content width when single-column). */
|
|
1860
1917
|
colWidth = () => this.ctx.columns?.[this.colIdx]?.widthPt ?? this.ctx.contentWidth;
|
|
1861
|
-
|
|
1918
|
+
/**
|
|
1919
|
+
* Whether the current column is already in use.
|
|
1920
|
+
*
|
|
1921
|
+
* This gates every overflow break, so that a block too tall for an empty page
|
|
1922
|
+
* is placed rather than looping forever. It used to ask whether the column had
|
|
1923
|
+
* received any drawable ITEM, which is not the same question: a run of empty
|
|
1924
|
+
* table rows consumes vertical space and draws nothing, so the guard stayed
|
|
1925
|
+
* false, no break ever fired, and the rows marched off the bottom of the page.
|
|
1926
|
+
* A spreadsheet is full of such rows — the sheet in tdf171828.xlsx has 162 of
|
|
1927
|
+
* them — and they were silently costing whole pages of pagination.
|
|
1928
|
+
*
|
|
1929
|
+
* Consumed space counts as use, whether or not any ink went with it.
|
|
1930
|
+
*/
|
|
1931
|
+
colHasContent = () => this.current.length > this.colStartLen || this.cursorY < this.colStartY;
|
|
1932
|
+
/** Overflow step: next column on this page, or a fresh page after the last. */
|
|
1862
1933
|
advanceColumn = () => {
|
|
1863
1934
|
if (this.ctx.columns && this.colIdx + 1 < this.ctx.columns.length) {
|
|
1864
1935
|
this.colIdx++;
|
|
1865
1936
|
this.colStartLen = this.current.length;
|
|
1866
1937
|
this.cursorY = this.ctx.pageHeight - this.ctx.marginTop;
|
|
1938
|
+
this.colStartY = this.cursorY;
|
|
1867
1939
|
} else this.flushPage();
|
|
1868
1940
|
};
|
|
1941
|
+
/**
|
|
1942
|
+
* §20.4.2.3 out-of-flow drawings (wrap `'none'`): they render at their anchored
|
|
1943
|
+
* position without moving the cursor. `behindDoc` sinks below the body text,
|
|
1944
|
+
* everything else above it; both flush with the page.
|
|
1945
|
+
*/
|
|
1869
1946
|
floatsBehind = [];
|
|
1870
1947
|
floatsFront = [];
|
|
1948
|
+
/**
|
|
1949
|
+
* Side-wrapping floats (wrapSquare/tight/through): rectangles the body text
|
|
1950
|
+
* must flow around. Page-scoped, like the float graphics.
|
|
1951
|
+
*/
|
|
1871
1952
|
exclusions = [];
|
|
1953
|
+
/** The float's left edge on the page, resolved from its horizontal anchor. */
|
|
1872
1954
|
floatX = (f, widthPt) => {
|
|
1873
1955
|
const h = f.posH;
|
|
1874
1956
|
if (!h) return this.colLeft();
|
|
@@ -1878,6 +1960,10 @@ var PageAssembler = class {
|
|
|
1878
1960
|
if (h.align === "right") return base + span - widthPt;
|
|
1879
1961
|
return base + (h.offsetPt ?? 0);
|
|
1880
1962
|
};
|
|
1963
|
+
/**
|
|
1964
|
+
* The drawing's TOP in the y-up cursor frame. Paragraph/line-relative offsets
|
|
1965
|
+
* hang off the anchoring paragraph's current position.
|
|
1966
|
+
*/
|
|
1881
1967
|
floatTopYUp = (f) => {
|
|
1882
1968
|
const v = f.posV;
|
|
1883
1969
|
if (!v) return this.cursorY;
|
|
@@ -1885,11 +1971,26 @@ var PageAssembler = class {
|
|
|
1885
1971
|
if (v.relativeFrom === "margin") return this.ctx.pageHeight - this.ctx.marginTop - (v.offsetPt ?? 0);
|
|
1886
1972
|
return this.cursorY - (v.offsetPt ?? 0);
|
|
1887
1973
|
};
|
|
1974
|
+
/**
|
|
1975
|
+
* Tagged PDF: the stack of open list levels (for L/LI/LBody nesting). Cleared
|
|
1976
|
+
* whenever a non-list-item block interrupts the run of list paragraphs.
|
|
1977
|
+
*/
|
|
1888
1978
|
listStack = [];
|
|
1979
|
+
/**
|
|
1980
|
+
* §17.11 footnotes: `pageNotes` reserved for the CURRENT page (greedy — a line
|
|
1981
|
+
* carrying a reference pulls its note's height out of the page bottom, so the
|
|
1982
|
+
* line and its note land together). `placedNotes` is global: a note renders
|
|
1983
|
+
* once, on its first reference's page.
|
|
1984
|
+
*/
|
|
1889
1985
|
pageNotes = [];
|
|
1890
1986
|
noteReserve = 0;
|
|
1891
1987
|
placedNotes = /* @__PURE__ */ new Set();
|
|
1988
|
+
/** The page's usable bottom: the margin plus whatever the notes band has claimed so far. */
|
|
1892
1989
|
bottomLimit = () => this.ctx.marginBottom + this.noteReserve;
|
|
1990
|
+
/**
|
|
1991
|
+
* The first exclusion a line spanning `[yTop-h, yTop]` collides with in the
|
|
1992
|
+
* current column (x-overlap with the column required).
|
|
1993
|
+
*/
|
|
1893
1994
|
exclusionAt = (yTop, h) => {
|
|
1894
1995
|
const cl = this.colLeft();
|
|
1895
1996
|
const cr = cl + this.colWidth();
|
|
@@ -1899,6 +2000,10 @@ var PageAssembler = class {
|
|
|
1899
2000
|
return e;
|
|
1900
2001
|
}
|
|
1901
2002
|
};
|
|
2003
|
+
/**
|
|
2004
|
+
* Per-line geometry beside an exclusion: the narrowed width and the x shift.
|
|
2005
|
+
* Text goes on the WIDER side of the float (one side per line, v1).
|
|
2006
|
+
*/
|
|
1902
2007
|
lineGeometryAt = (yTop, h) => {
|
|
1903
2008
|
const full = this.colWidth();
|
|
1904
2009
|
const e = this.exclusionAt(yTop, h);
|
|
@@ -1921,6 +2026,12 @@ var PageAssembler = class {
|
|
|
1921
2026
|
xOffset: 0
|
|
1922
2027
|
};
|
|
1923
2028
|
};
|
|
2029
|
+
/**
|
|
2030
|
+
* Estimated per-line widths for a paragraph starting at `startY`: narrowed
|
|
2031
|
+
* while lines (estimated at the first line's height) overlap an exclusion, then
|
|
2032
|
+
* one full width Knuth-Plass reuses for the tail. `undefined` when nothing
|
|
2033
|
+
* overlaps — the caller keeps the original block.
|
|
2034
|
+
*/
|
|
1924
2035
|
lineWidthsFor = (block, startY) => {
|
|
1925
2036
|
if (this.exclusions.length === 0 || block.lines.length === 0) return void 0;
|
|
1926
2037
|
const h0 = computeLineHeight(block.lines[0], block.resolved);
|
|
@@ -1938,6 +2049,10 @@ var PageAssembler = class {
|
|
|
1938
2049
|
}
|
|
1939
2050
|
return narrowed ? widths : void 0;
|
|
1940
2051
|
};
|
|
2052
|
+
/**
|
|
2053
|
+
* New (unplaced) footnotes referenced by a line's tokens, with their layout at
|
|
2054
|
+
* the current section's width.
|
|
2055
|
+
*/
|
|
1941
2056
|
lineFootnotes = (line) => {
|
|
1942
2057
|
if (!this.notes) return [];
|
|
1943
2058
|
const out = [];
|
|
@@ -1957,6 +2072,10 @@ var PageAssembler = class {
|
|
|
1957
2072
|
}
|
|
1958
2073
|
return out;
|
|
1959
2074
|
};
|
|
2075
|
+
/**
|
|
2076
|
+
* The notes band for the flushing page: separator rule + each note's blocks
|
|
2077
|
+
* stacked inside the reserved area. Tagged: each note is a Note→P element.
|
|
2078
|
+
*/
|
|
1960
2079
|
renderNotesBand = () => {
|
|
1961
2080
|
if (this.pageNotes.length === 0) return [];
|
|
1962
2081
|
const out = [];
|
|
@@ -1981,9 +2100,21 @@ var PageAssembler = class {
|
|
|
1981
2100
|
}
|
|
1982
2101
|
return out;
|
|
1983
2102
|
};
|
|
2103
|
+
/**
|
|
2104
|
+
* Dynamic PAGE/NUMPAGES bands re-render after pagination (both numbers are
|
|
2105
|
+
* known only then); each use records where its commands must be spliced.
|
|
2106
|
+
*/
|
|
1984
2107
|
dynBands = [];
|
|
2108
|
+
/**
|
|
2109
|
+
* Finish the in-progress page: pick the header/footer band, queue any dynamic
|
|
2110
|
+
* band, push the assembled commands as a page, then reset all per-page state
|
|
2111
|
+
* (cursor, floats, exclusions, notes, columns) for the next one.
|
|
2112
|
+
*
|
|
2113
|
+
* @param force Emit a page even when no body content was placed (used to
|
|
2114
|
+
* guarantee one page for a header/footer-only document).
|
|
2115
|
+
*/
|
|
1985
2116
|
flushPage = (force = false) => {
|
|
1986
|
-
if (this.current.length === 0 && !force) return;
|
|
2117
|
+
if (this.current.length === 0 && this.cursorY >= this.colStartY && !force) return;
|
|
1987
2118
|
const band = bandForPage(this.pageInSection, this.globalPageIdx, this.ctx.titlePg, this.ctx.evenAndOddHeaders);
|
|
1988
2119
|
const header = pickBand(this.ctx.headerSet, band);
|
|
1989
2120
|
const footer = pickBand(this.ctx.footerSet, band);
|
|
@@ -2022,6 +2153,7 @@ var PageAssembler = class {
|
|
|
2022
2153
|
this.pageInSection++;
|
|
2023
2154
|
this.globalPageIdx++;
|
|
2024
2155
|
this.cursorY = this.ctx.pageHeight - this.ctx.marginTop;
|
|
2156
|
+
this.colStartY = this.cursorY;
|
|
2025
2157
|
};
|
|
2026
2158
|
};
|
|
2027
2159
|
function paginateSections(blocks, sectionCtxs, builder, defaultLang = "en-US", notes, bookmarkPositions, reflowParagraph) {
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
/** One of the 14 Standard Type 1 font names (ISO 32000-1 §9.6.2.2). */
|
|
1
2
|
export type BuiltinFontName = 'Helvetica' | 'Helvetica-Bold' | 'Helvetica-Oblique' | 'Helvetica-BoldOblique' | 'Times-Roman' | 'Times-Bold' | 'Times-Italic' | 'Times-BoldItalic' | 'Courier' | 'Courier-Bold' | 'Courier-Oblique' | 'Courier-BoldOblique' | 'Symbol' | 'ZapfDingbats';
|
|
3
|
+
/**
|
|
4
|
+
* The 14 Standard Type 1 fonts, guaranteed available in every conforming PDF
|
|
5
|
+
* reader and never embedded.
|
|
6
|
+
*/
|
|
2
7
|
export declare const BUILTIN_FONTS: ReadonlyArray<BuiltinFontName>;
|
|
@@ -1,15 +1,37 @@
|
|
|
1
1
|
import { ParsedTtf } from '../core/font/index.js';
|
|
2
2
|
import { PdfRef } from './objects.js';
|
|
3
3
|
import { PdfDocument } from './writer.js';
|
|
4
|
+
/** Options for {@link embedTtfFont}. */
|
|
4
5
|
export interface EmbedTtfOptions {
|
|
6
|
+
/** The glyph ids actually used; given, the font is subset to just these (plus their closure). */
|
|
5
7
|
readonly usedGids?: Iterable<number>;
|
|
8
|
+
/**
|
|
9
|
+
* Emit a `/CIDSet` in the font descriptor (required by PDF/A-1; omitted
|
|
10
|
+
* otherwise, since PDF/A-2/3 only constrain it when present).
|
|
11
|
+
*/
|
|
6
12
|
readonly cidSet?: boolean;
|
|
7
13
|
}
|
|
14
|
+
/** The result of {@link embedTtfFont}: the Type 0 font reference plus measurement/encoding helpers. */
|
|
8
15
|
export interface EmbeddedFont {
|
|
16
|
+
/** Indirect reference to the `/Type0` font dictionary, for page resource `/Font` entries. */
|
|
9
17
|
readonly fontRef: PdfRef;
|
|
18
|
+
/** The parsed source font. */
|
|
10
19
|
readonly parsed: ParsedTtf;
|
|
20
|
+
/** Glyph advance width in PDF text-space units (1000/em) for a given glyph id. */
|
|
11
21
|
readonly pdfWidthForGid: (gid: number) => number;
|
|
22
|
+
/** Measured width of `text` at `fontSize`, in points. */
|
|
12
23
|
readonly textWidthPt: (text: string, fontSize: number) => number;
|
|
24
|
+
/** Encode `text` as the hex CID string used inside a `Tj`/`TJ` show operator (Identity-H). */
|
|
13
25
|
readonly encodeTextAsCidHex: (text: string) => string;
|
|
14
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Embed a TrueType font as a composite (Type 0) font with a CIDFontType2
|
|
29
|
+
* descendant (ISO 32000-1 §9.7), optionally subsetting it to the used glyphs.
|
|
30
|
+
* Adds the `/FontFile2`, `/FontDescriptor`, `/CIDFontType2` and `/Type0` objects
|
|
31
|
+
* (plus a `/ToUnicode` CMap and an optional `/CIDSet`) to `doc`.
|
|
32
|
+
*
|
|
33
|
+
* @param parsed The parsed TrueType font.
|
|
34
|
+
* @param options Subset glyph set and/or PDF/A-1 `/CIDSet` emission.
|
|
35
|
+
* @returns The font reference and measurement/encoding helpers ({@link EmbeddedFont}).
|
|
36
|
+
*/
|
|
15
37
|
export declare function embedTtfFont(doc: PdfDocument, parsed: ParsedTtf, options?: EmbedTtfOptions): EmbeddedFont;
|
package/dist/esm/pdf/cid-font.js
CHANGED
|
@@ -3,6 +3,16 @@ import { createFontMeasure } from "../core/font/measure.js";
|
|
|
3
3
|
import { dict, name, ref, stream } from "./objects.js";
|
|
4
4
|
//#region src/pdf/cid-font.ts
|
|
5
5
|
var encoder = new TextEncoder();
|
|
6
|
+
/**
|
|
7
|
+
* Embed a TrueType font as a composite (Type 0) font with a CIDFontType2
|
|
8
|
+
* descendant (ISO 32000-1 §9.7), optionally subsetting it to the used glyphs.
|
|
9
|
+
* Adds the `/FontFile2`, `/FontDescriptor`, `/CIDFontType2` and `/Type0` objects
|
|
10
|
+
* (plus a `/ToUnicode` CMap and an optional `/CIDSet`) to `doc`.
|
|
11
|
+
*
|
|
12
|
+
* @param parsed The parsed TrueType font.
|
|
13
|
+
* @param options Subset glyph set and/or PDF/A-1 `/CIDSet` emission.
|
|
14
|
+
* @returns The font reference and measurement/encoding helpers ({@link EmbeddedFont}).
|
|
15
|
+
*/
|
|
6
16
|
function embedTtfFont(doc, parsed, options = {}) {
|
|
7
17
|
const scale = 1e3 / parsed.unitsPerEm;
|
|
8
18
|
const toPdfUnits = (v) => Math.round(v * scale);
|
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
import { PdfRef } from './objects.js';
|
|
2
2
|
import { PdfDocument } from './writer.js';
|
|
3
|
+
/** How an embedded file relates to the document (`/AFRelationship`, ISO 32000-2 §14.13). */
|
|
3
4
|
export type AFRelationship = 'Source' | 'Data' | 'Alternative' | 'Supplement' | 'Unspecified';
|
|
5
|
+
/** One file to embed as a PDF/A-3 associated file (see {@link embedAssociatedFile}). */
|
|
4
6
|
export interface AttachedFile {
|
|
7
|
+
/** File name as shown to the user, e.g. `"source.docx"`. ASCII recommended. */
|
|
5
8
|
readonly name: string;
|
|
6
9
|
readonly bytes: Uint8Array;
|
|
10
|
+
/**
|
|
11
|
+
* MIME type for the `/EmbeddedFile` `/Subtype`, e.g.
|
|
12
|
+
* `"application/vnd.openxmlformats-officedocument.wordprocessingml.document"`.
|
|
13
|
+
*/
|
|
7
14
|
readonly mimeType: string;
|
|
8
15
|
readonly relationship?: AFRelationship;
|
|
9
16
|
readonly description?: string;
|
|
10
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Embed `file` as an `/EmbeddedFile` stream wrapped in a `/Filespec` (ISO 32000-1
|
|
20
|
+
* §7.11, ISO 19005-3 §6.8). The MIME type becomes a `Name` (the serializer
|
|
21
|
+
* hex-escapes the `/`), which readers decode back.
|
|
22
|
+
*
|
|
23
|
+
* @param file The file bytes plus its name, MIME type and relationship.
|
|
24
|
+
* @returns A reference to the `/Filespec`, to place in the catalog `/AF` array
|
|
25
|
+
* and the `/Names` `/EmbeddedFiles` name tree.
|
|
26
|
+
*/
|
|
11
27
|
export declare function embedAssociatedFile(doc: PdfDocument, file: AttachedFile): PdfRef;
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { dict, name, ref, stream, unicodeString } from "./objects.js";
|
|
2
2
|
//#region src/pdf/embedded-file.ts
|
|
3
|
+
/**
|
|
4
|
+
* Embed `file` as an `/EmbeddedFile` stream wrapped in a `/Filespec` (ISO 32000-1
|
|
5
|
+
* §7.11, ISO 19005-3 §6.8). The MIME type becomes a `Name` (the serializer
|
|
6
|
+
* hex-escapes the `/`), which readers decode back.
|
|
7
|
+
*
|
|
8
|
+
* @param file The file bytes plus its name, MIME type and relationship.
|
|
9
|
+
* @returns A reference to the `/Filespec`, to place in the catalog `/AF` array
|
|
10
|
+
* and the `/Names` `/EmbeddedFiles` name tree.
|
|
11
|
+
*/
|
|
3
12
|
function embedAssociatedFile(doc, file) {
|
|
4
13
|
const efRef = doc.add(stream({
|
|
5
14
|
Type: name("EmbeddedFile"),
|