reamkit 1.2.0 → 1.3.0

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.
Files changed (37) hide show
  1. package/README.md +3 -2
  2. package/dist/esm/core/converter/ream.js +4 -3
  3. package/dist/esm/core/document-model/types.d.ts +2 -0
  4. package/dist/esm/core/drawingml/chart-geometry.d.ts +1 -1
  5. package/dist/esm/core/drawingml/chart-geometry.js +79 -117
  6. package/dist/esm/core/drawingml/chart-parser.d.ts +3 -0
  7. package/dist/esm/core/drawingml/chart-parser.js +28 -1
  8. package/dist/esm/core/numbering/apply.js +2 -1
  9. package/dist/esm/core/opc/index.d.ts +1 -0
  10. package/dist/esm/core/opc/package.js +3 -2
  11. package/dist/esm/core/opc/relationship-types.d.ts +1 -0
  12. package/dist/esm/core/opc/relationship-types.js +5 -2
  13. package/dist/esm/excel/print-model.d.ts +3 -0
  14. package/dist/esm/excel/print-model.js +4 -8
  15. package/dist/esm/excel/sheet-drawing.d.ts +9 -0
  16. package/dist/esm/excel/sheet-drawing.js +113 -0
  17. package/dist/esm/excel/worksheet-parser.d.ts +1 -0
  18. package/dist/esm/excel/worksheet-parser.js +4 -1
  19. package/dist/esm/excel/xlsx-reader.js +41 -0
  20. package/dist/esm/excel/xlsx-to-pdf.js +25 -18
  21. package/dist/esm/index.d.ts +1 -0
  22. package/dist/esm/layout/page-doc.d.ts +1 -0
  23. package/dist/esm/layout/styled-layout.d.ts +2 -0
  24. package/dist/esm/layout/styled-layout.js +321 -171
  25. package/dist/esm/pdf/encryption.d.ts +34 -0
  26. package/dist/esm/pdf/encryption.js +143 -0
  27. package/dist/esm/pdf/index.d.ts +2 -1
  28. package/dist/esm/pdf/styled-page-emitter.d.ts +2 -0
  29. package/dist/esm/pdf/styled-page-emitter.js +25 -7
  30. package/dist/esm/pdf/styled-page-renderer.d.ts +1 -0
  31. package/dist/esm/pdf/styled-page-renderer.js +17 -2
  32. package/dist/esm/pdf/writer.d.ts +2 -0
  33. package/dist/esm/pdf/writer.js +6 -1
  34. package/dist/esm/word/document-parser.js +4 -0
  35. package/dist/esm/word/docx-reader.js +7 -11
  36. package/dist/esm/word/docx-to-pdf.js +23 -13
  37. package/package.json +1 -1
@@ -1,8 +1,13 @@
1
+ import { pt } from "../core/ir/units.js";
1
2
  import { ResourceStore } from "../core/ir/resources.js";
2
3
  import { FEATURES } from "../core/ir/features.js";
3
4
  import { EMPTY_STYLE_SHEET, resolveBodyStyles } from "../core/style-cascade/resolver.js";
4
5
  import "../core/style-cascade/index.js";
5
6
  import { bytesInclude } from "../core/bytes.js";
7
+ import { DEFAULT_THEME_PALETTE, makeColorResolver } from "../core/drawingml/colors.js";
8
+ import { parseChart, withChartColorStyle } from "../core/drawingml/chart-parser.js";
9
+ import { parseTheme } from "../core/drawingml/theme-parser.js";
10
+ import { isOoxmlRel } from "../core/opc/relationship-types.js";
6
11
  import { OpcPackage } from "../core/opc/package.js";
7
12
  import { parseCoreProperties } from "../core/opc/core-properties.js";
8
13
  import "../core/opc/index.js";
@@ -12,6 +17,7 @@ import { parseWorksheet } from "./worksheet-parser.js";
12
17
  import { EMPTY_XLSX_STYLES, parseXlsxStyles } from "./styles-parser.js";
13
18
  import "./index.js";
14
19
  import { resolvePrintArea, resolvePrintTitleRows, sectionFromWorksheet, worksheetToBody } from "./print-model.js";
20
+ import { parseSheetDrawing } from "./sheet-drawing.js";
15
21
  //#region src/excel/xlsx-reader.ts
16
22
  var WORKBOOK_PART = "xl/workbook.xml";
17
23
  var SHARED_STRINGS_PART = "xl/sharedStrings.xml";
@@ -29,6 +35,8 @@ function readXlsx(xlsx) {
29
35
  const styles = stylesData ? parseXlsxStyles(stylesData) : EMPTY_XLSX_STYLES;
30
36
  const workbookRels = pkg.getPartRelationships(WORKBOOK_PART);
31
37
  const body = [];
38
+ const charts = /* @__PURE__ */ new Map();
39
+ const resolveColor = buildXlsxColorResolver(pkg, workbookRels);
32
40
  let firstSheetSection;
33
41
  for (let sheetIdx = 0; sheetIdx < sheets.length; sheetIdx++) {
34
42
  const sheet = sheets[sheetIdx];
@@ -53,6 +61,27 @@ function readXlsx(xlsx) {
53
61
  ...titleRows ? { titleRows } : {},
54
62
  gridLines
55
63
  }));
64
+ if (worksheet.drawingRelId) {
65
+ const drawingRel = pkg.getPartRelationships(resolved.path).find((r) => r.id === worksheet.drawingRelId);
66
+ const drawing = drawingRel ? pkg.resolveRelatedPart(resolved.path, drawingRel) : void 0;
67
+ if (drawing) for (const ref of parseSheetDrawing(drawing.data, drawing.path, pkg, worksheet)) {
68
+ if (!charts.has(ref.chartPartPath)) {
69
+ const chartData = pkg.getPart(ref.chartPartPath);
70
+ const parsed = chartData ? parseChart(chartData, resolveColor) : null;
71
+ if (!parsed) continue;
72
+ charts.set(ref.chartPartPath, withChartColorStyle(parsed, pkg, ref.chartPartPath, resolveColor));
73
+ }
74
+ body.push({
75
+ kind: "chart",
76
+ chart: {
77
+ chartRelId: ref.chartPartPath,
78
+ width: pt(ref.widthPt),
79
+ height: pt(ref.heightPt),
80
+ paragraphProperties: {}
81
+ }
82
+ });
83
+ }
84
+ }
56
85
  }
57
86
  const coreData = pkg.getPart(CORE_PROPS_PART);
58
87
  const info = infoFromCore(coreData ? parseCoreProperties(coreData) : void 0);
@@ -64,11 +93,23 @@ function readXlsx(xlsx) {
64
93
  ...firstSheetSection ? { section: firstSheetSection } : {},
65
94
  styles: EMPTY_STYLE_SHEET,
66
95
  resources: new ResourceStore(),
96
+ ...charts.size > 0 ? { charts } : {},
67
97
  ...info ? { info } : {}
68
98
  },
69
99
  losses: []
70
100
  };
71
101
  }
102
+ function buildXlsxColorResolver(pkg, workbookRels) {
103
+ const palette = new Map(DEFAULT_THEME_PALETTE);
104
+ for (const rel of workbookRels) {
105
+ if (!isOoxmlRel(rel.type, "theme")) continue;
106
+ const resolved = pkg.resolveRelatedPart(WORKBOOK_PART, rel);
107
+ if (!resolved) continue;
108
+ for (const [slot, hex] of parseTheme(resolved.data)) palette.set(slot, hex);
109
+ break;
110
+ }
111
+ return makeColorResolver(palette);
112
+ }
72
113
  var xlsxReader = {
73
114
  id: "xlsx",
74
115
  produces: "flow",
@@ -1,7 +1,7 @@
1
1
  import { fetchFontSet } from "../core/fonts/remote-fonts.js";
2
2
  import { FontRegistry } from "../core/font/font-registry.js";
3
3
  import { signPdf } from "../pdf/signature.js";
4
- import { renderStyledPdf } from "../pdf/styled-page-renderer.js";
4
+ import { renderStyledPdf, renderStyledPdfEncrypted } from "../pdf/styled-page-renderer.js";
5
5
  import "../pdf/index.js";
6
6
  import { readXlsx } from "./xlsx-reader.js";
7
7
  import { flowRenderOptions } from "../core/converter/project.js";
@@ -18,18 +18,18 @@ async function convertXlsxToPdf(xlsx, options = {}) {
18
18
  ...options,
19
19
  signaturePlaceholder: signature
20
20
  } : options;
21
- let pdf;
22
- if (renderOptions.fonts ?? renderOptions.fontBytes) pdf = convertXlsxToPdfSync(xlsx, renderOptions);
23
- else {
24
- const fonts = await fetchFontSet({
21
+ const withFonts = renderOptions.fonts ?? renderOptions.fontBytes ? renderOptions : {
22
+ ...renderOptions,
23
+ fonts: await fetchFontSet({
25
24
  ...options.fontFamily ? { family: options.fontFamily } : {},
26
25
  ...options.fontFetch ? { fetch: options.fontFetch } : {}
27
- });
28
- pdf = convertXlsxToPdfSync(xlsx, {
29
- ...renderOptions,
30
- fonts
31
- });
26
+ })
27
+ };
28
+ if (withFonts.encrypt) {
29
+ const args = prepareXlsxStyledRender(xlsx, withFonts);
30
+ return renderStyledPdfEncrypted(args.body, args.styled);
32
31
  }
32
+ const pdf = convertXlsxToPdfSync(xlsx, withFonts);
33
33
  return signature ? signPdf(pdf, signature) : pdf;
34
34
  }
35
35
  /**
@@ -38,6 +38,10 @@ async function convertXlsxToPdf(xlsx, options = {}) {
38
38
  * Internal since 1.0 — see the async variant above.
39
39
  */
40
40
  function convertXlsxToPdfSync(xlsx, options) {
41
+ const args = prepareXlsxStyledRender(xlsx, options);
42
+ return renderStyledPdf(args.body, args.styled);
43
+ }
44
+ function prepareXlsxStyledRender(xlsx, options) {
41
45
  const fonts = options.fonts ?? (options.fontBytes ? { regular: options.fontBytes } : void 0);
42
46
  if (!fonts) throw new Error("convertXlsxToPdfSync requires options.fonts or options.fontBytes");
43
47
  const registry = FontRegistry.fromBytes(fonts);
@@ -56,14 +60,17 @@ function convertXlsxToPdfSync(xlsx, options) {
56
60
  relationship: "Source",
57
61
  description: "Source Excel workbook"
58
62
  });
59
- return renderStyledPdf(flow.body, {
60
- registry,
61
- ...flowRenderOptions(flow),
62
- ...section ? { section } : {},
63
- ...info ? { info } : {},
64
- ...attachments.length > 0 ? { attachments } : {},
65
- ...renderOptions
66
- });
63
+ return {
64
+ body: flow.body,
65
+ styled: {
66
+ registry,
67
+ ...flowRenderOptions(flow),
68
+ ...section ? { section } : {},
69
+ ...info ? { info } : {},
70
+ ...attachments.length > 0 ? { attachments } : {},
71
+ ...renderOptions
72
+ }
73
+ };
67
74
  }
68
75
  //#endregion
69
76
  export { convertXlsxToPdf };
@@ -4,6 +4,7 @@ export { renderStyledPdf } from './pdf/index.js';
4
4
  export type { StyledRenderOptions, DocumentInfo } from './pdf/index.js';
5
5
  export { signPdf } from './pdf/index.js';
6
6
  export type { SignaturePlaceholder, SignerCredentials, SignatureOptions } from './pdf/index.js';
7
+ export type { PdfEncryptOptions, PdfPermissions } from './pdf/index.js';
7
8
  export { FontRegistry, parseTtf, subsetTtf } from './core/font/index.js';
8
9
  export type { FontBytesByVariant, FontVariant, ParsedTtf } from './core/font/index.js';
9
10
  export { getHyphenator, createLanguageHyphenator, createHyphenator, splitPatternBundle, } from './core/hyphenation/index.js';
@@ -16,6 +16,7 @@ export interface TextToken {
16
16
  readonly href?: string;
17
17
  readonly footnoteRef?: string;
18
18
  readonly anchor?: string;
19
+ readonly listMarker?: true;
19
20
  readonly resolvedRun: ResolvedRunProperties;
20
21
  readonly font: FontResource;
21
22
  readonly fontSizePt: number;
@@ -5,6 +5,7 @@ import { Hyphenator } from '../core/hyphenation/index.js';
5
5
  import { LaidOutDocument, PageItem } from './page-doc.js';
6
6
  import { AttachedFile } from '../pdf/embedded-file.js';
7
7
  import { SignaturePlaceholder } from '../pdf/signature.js';
8
+ import { PdfEncryptOptions } from '../pdf/encryption.js';
8
9
  import { ResourceStore } from '../core/ir/index.js';
9
10
  import { StructTreeBuilder } from '../pdf/struct-tree.js';
10
11
  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';
@@ -39,6 +40,7 @@ export interface StyledRenderOptions {
39
40
  readonly tagged?: boolean;
40
41
  readonly pdfUA?: boolean;
41
42
  readonly language?: string;
43
+ readonly encrypt?: PdfEncryptOptions;
42
44
  readonly attachments?: ReadonlyArray<AttachedFile>;
43
45
  readonly signaturePlaceholder?: SignaturePlaceholder;
44
46
  }