@sme.up/doc-alchemist 1.2.0 → 1.3.0-20250915074720
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.
|
@@ -4,7 +4,7 @@ export const getAutoTableOptions = (visibleHeaders, data, optimalFontSize, cellS
|
|
|
4
4
|
return {
|
|
5
5
|
head: [visibleHeaders],
|
|
6
6
|
body: data.map(row => row.map(cell => cell.text)),
|
|
7
|
-
startY:
|
|
7
|
+
startY: 27,
|
|
8
8
|
margin: { left: 5, right: 5, top: 20, bottom: 10 },
|
|
9
9
|
styles,
|
|
10
10
|
columnStyles,
|
|
@@ -53,6 +53,7 @@ const didParseCellHandler = (dataArg, cellStyles) => {
|
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
55
|
const didDrawPageHandler = (dataArg, context) => {
|
|
56
|
+
let rightOffset = 0;
|
|
56
57
|
const pageWidth = dataArg.doc.internal.pageSize.getWidth();
|
|
57
58
|
// Add the logo on each page
|
|
58
59
|
if (context?.logoBase64) {
|
|
@@ -63,21 +64,31 @@ const didDrawPageHandler = (dataArg, context) => {
|
|
|
63
64
|
catch (error) {
|
|
64
65
|
console.warn("Error adding logo:", error);
|
|
65
66
|
}
|
|
67
|
+
rightOffset = logoWidth;
|
|
66
68
|
}
|
|
67
|
-
|
|
69
|
+
let textFontSize = 11;
|
|
68
70
|
const textX = 5;
|
|
69
71
|
let textY = 10;
|
|
70
|
-
//
|
|
72
|
+
// split on two lines at most
|
|
73
|
+
// remember to set measure before calling splitTextToSize otherwise it will not work!
|
|
71
74
|
if (context?.title) {
|
|
72
|
-
const title = dataArg.doc.splitTextToSize(context.title, pageWidth * 0.65)[0];
|
|
73
75
|
dataArg.doc.setFontSize(textFontSize);
|
|
74
76
|
dataArg.doc.setFont("helvetica", "normal");
|
|
75
|
-
dataArg.doc.
|
|
77
|
+
const title = dataArg.doc.splitTextToSize(context.title, pageWidth - rightOffset - textX * 2 - 10);
|
|
78
|
+
dataArg.doc.text(title[0], textX, textY, { align: "left" });
|
|
79
|
+
if (title[1]) {
|
|
80
|
+
textY += textFontSize / 2;
|
|
81
|
+
dataArg.doc.text(title[1], textX, textY, { align: "left" });
|
|
82
|
+
}
|
|
76
83
|
}
|
|
84
|
+
// since the limited vertical space, if subtitle is too long to be fit into one line, it should be trimmed (first element of split is taken into account)`
|
|
77
85
|
if (context?.subtitle) {
|
|
86
|
+
textFontSize -= 2;
|
|
78
87
|
textY += textFontSize / 2;
|
|
79
|
-
|
|
80
|
-
dataArg.doc.
|
|
88
|
+
dataArg.doc.setFontSize(textFontSize);
|
|
89
|
+
dataArg.doc.setFont("helvetica", "normal");
|
|
90
|
+
const subtitle = dataArg.doc.splitTextToSize(context.subtitle, pageWidth - rightOffset - textX * 2 - 10);
|
|
91
|
+
dataArg.doc.text(subtitle[0], textX, textY, { align: "left" });
|
|
81
92
|
}
|
|
82
93
|
};
|
|
83
94
|
//# sourceMappingURL=autotable-renderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autotable-renderer.js","sourceRoot":"","sources":["../../../src/converters/pdf/autotable-renderer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"autotable-renderer.js","sourceRoot":"","sources":["../../../src/converters/pdf/autotable-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { UserOptions } from \"jspdf-autotable\";\nimport { CellStyleData, CellValueProps } from \"./pdf-converter.types.js\";\nimport type {\n Styles,\n OverflowType,\n FontStyle,\n CellHookData,\n HookData,\n} from \"jspdf-autotable\";\nimport { getLogoPositionAndDimension } from \"../../utils/image-utils.js\";\nimport { ConverterContext } from \"../../types/converter.js\";\n\ntype TableStyles = {\n styles: Partial<Styles>;\n columnStyles: Record<string, Partial<Styles>>;\n headStyles: Partial<Styles>;\n};\n\nexport const getAutoTableOptions = (\n visibleHeaders: string[],\n data: CellValueProps[][],\n optimalFontSize: number,\n cellStyles: CellStyleData[][],\n context: ConverterContext,\n): UserOptions => {\n const { styles, columnStyles, headStyles } = getTableStyles(\n visibleHeaders,\n optimalFontSize,\n );\n return {\n head: [visibleHeaders],\n body: data.map(row => row.map(cell => cell.text)),\n startY: 27,\n margin: { left: 5, right: 5, top: 20, bottom: 10 },\n styles,\n columnStyles,\n headStyles,\n didDrawPage: dataArg => didDrawPageHandler(dataArg, context),\n didParseCell: dataArg => didParseCellHandler(dataArg, cellStyles),\n };\n};\n\nconst getTableStyles = (\n visibleHeaders: string[],\n optimalFontSize: number,\n): TableStyles => {\n const styles: Partial<Styles> = {\n font: \"helvetica\",\n fontSize: optimalFontSize + 1,\n cellPadding: 1,\n overflow: \"linebreak\" as OverflowType,\n cellWidth: \"auto\",\n minCellWidth: 5,\n };\n\n const columnStyles: { [key: string]: Partial<Styles> } = {\n ...Object.fromEntries(\n visibleHeaders.map((_, index) => [\n index,\n {\n cellWidth: \"auto\",\n halign: \"left\",\n overflow: \"linebreak\" as OverflowType,\n cellPadding: { top: 1, right: 1, bottom: 1, left: 1 },\n },\n ]),\n ),\n };\n\n const headStyles: Partial<Styles> = {\n fillColor: [255, 0, 0],\n textColor: [255, 255, 255],\n fontStyle: \"bold\" as FontStyle,\n halign: \"center\",\n };\n\n return { styles, columnStyles, headStyles };\n};\n\nconst didParseCellHandler = (\n dataArg: CellHookData,\n cellStyles: CellStyleData[][],\n) => {\n if (dataArg.section === \"body\") {\n const rowIndex = dataArg.row.index;\n const colIndex = dataArg.column.index;\n const cellStyle = cellStyles[rowIndex]?.[colIndex];\n\n if (cellStyle) {\n // Apply styles from the Excel cell\n Object.assign(dataArg.cell.styles, cellStyle);\n }\n }\n};\n\nconst didDrawPageHandler = (dataArg: HookData, context: ConverterContext) => {\n let rightOffset = 0;\n const pageWidth = dataArg.doc.internal.pageSize.getWidth();\n\n // Add the logo on each page\n if (context?.logoBase64) {\n const { logoWidth, logoHeight, logoX, logoY } = getLogoPositionAndDimension(\n dataArg.doc,\n context.logoBase64,\n );\n\n try {\n dataArg.doc.addImage(\n context.logoBase64,\n \"PNG\",\n logoX,\n logoY,\n logoWidth,\n logoHeight,\n );\n } catch (error) {\n console.warn(\"Error adding logo:\", error);\n }\n\n rightOffset = logoWidth;\n }\n\n let textFontSize = 11;\n const textX = 5;\n let textY = 10;\n\n // split on two lines at most\n // remember to set measure before calling splitTextToSize otherwise it will not work!\n\n if (context?.title) {\n dataArg.doc.setFontSize(textFontSize);\n dataArg.doc.setFont(\"helvetica\", \"normal\");\n const title = dataArg.doc.splitTextToSize(\n context.title,\n pageWidth - rightOffset - textX * 2 - 10,\n );\n dataArg.doc.text(title[0], textX, textY, { align: \"left\" });\n if (title[1]) {\n textY += textFontSize / 2;\n dataArg.doc.text(title[1], textX, textY, { align: \"left\" });\n }\n }\n\n // since the limited vertical space, if subtitle is too long to be fit into one line, it should be trimmed (first element of split is taken into account)`\n\n if (context?.subtitle) {\n textFontSize -= 2;\n textY += textFontSize / 2;\n dataArg.doc.setFontSize(textFontSize);\n dataArg.doc.setFont(\"helvetica\", \"normal\");\n const subtitle = dataArg.doc.splitTextToSize(\n context.subtitle,\n pageWidth - rightOffset - textX * 2 - 10,\n );\n dataArg.doc.text(subtitle[0], textX, textY, { align: \"left\" });\n }\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sme.up/doc-alchemist",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0-20250915074720",
|
|
4
4
|
"description": "Library for generating documents in various formats, including Excel and PDF.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Smeup LAB <info@smeup.com> (https://www.smeup.com/)",
|