av6-pdf-engine 1.1.0 → 2.0.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.
- package/dist/index.d.mts +41 -3
- package/dist/index.d.ts +41 -3
- package/dist/index.js +416 -83
- package/dist/index.mjs +415 -83
- package/package.json +1 -1
- package/tmp/border-showcase.pdf +0 -0
- package/tmp/quote-details.pdf +0 -0
package/dist/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __export(index_exports, {
|
|
|
34
34
|
PdfEngineError: () => PdfEngineError,
|
|
35
35
|
PdfEngineErrorCode: () => PdfEngineErrorCode,
|
|
36
36
|
QR_ERROR_LEVEL: () => QR_ERROR_LEVEL,
|
|
37
|
+
images: () => images,
|
|
37
38
|
isPdfEngineError: () => isPdfEngineError,
|
|
38
39
|
renderCustomPdf: () => renderCustomPdf,
|
|
39
40
|
renderCustomPdfToBuffer: () => renderCustomPdfToBuffer,
|
|
@@ -73,6 +74,11 @@ function toPdfEngineError(cause, fallback) {
|
|
|
73
74
|
});
|
|
74
75
|
}
|
|
75
76
|
|
|
77
|
+
// src/images/index.ts
|
|
78
|
+
var images = {
|
|
79
|
+
default: "data:image/png;base64,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"
|
|
80
|
+
};
|
|
81
|
+
|
|
76
82
|
// src/renderer-engine/index.ts
|
|
77
83
|
var import_fs = __toESM(require("fs"));
|
|
78
84
|
var import_pdfkit = __toESM(require("pdfkit"));
|
|
@@ -251,7 +257,7 @@ var drawRotatedImage = (doc, src, x, y, width, height, rotationDeg) => {
|
|
|
251
257
|
doc.image(src, x, y, { width, height });
|
|
252
258
|
doc.restore();
|
|
253
259
|
};
|
|
254
|
-
var processImageBlock = (doc, ctx, block, y, env, ensureSpaceFor) => {
|
|
260
|
+
var processImageBlock = (doc, ctx, block, y, env, ensureSpaceFor, defaultImage) => {
|
|
255
261
|
const imgSource = block.src;
|
|
256
262
|
const imgWidth = block.width ?? 80;
|
|
257
263
|
const imgHeight = block.height ?? 50;
|
|
@@ -279,7 +285,18 @@ var processImageBlock = (doc, ctx, block, y, env, ensureSpaceFor) => {
|
|
|
279
285
|
height: imgHeight
|
|
280
286
|
});
|
|
281
287
|
} catch (e) {
|
|
282
|
-
|
|
288
|
+
if (defaultImage !== void 0) {
|
|
289
|
+
try {
|
|
290
|
+
doc.image(defaultImage, x, startY, {
|
|
291
|
+
width: imgWidth,
|
|
292
|
+
height: imgHeight
|
|
293
|
+
});
|
|
294
|
+
} catch {
|
|
295
|
+
console.warn("Failed to render default image fallback:", e);
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
console.warn("Failed to load image:", e);
|
|
299
|
+
}
|
|
283
300
|
}
|
|
284
301
|
const newY = startY + imgHeight + mb;
|
|
285
302
|
if (y === null) ctx.currentY = newY;
|
|
@@ -576,17 +593,110 @@ var getPlacedCellWidth = (colWidths, startCol, colSpan) => {
|
|
|
576
593
|
var getRowSpanGroupHeight = (rowHeights, rowIndex, rowSpan) => {
|
|
577
594
|
return sum(rowHeights.slice(rowIndex, rowIndex + rowSpan));
|
|
578
595
|
};
|
|
579
|
-
var
|
|
596
|
+
var isTableBodyIterableEntry = (entry) => {
|
|
597
|
+
if (!entry || typeof entry !== "object") return false;
|
|
598
|
+
const row = entry;
|
|
599
|
+
return typeof row.isIterable === "boolean" && typeof row.iterableKey === "string" && Array.isArray(row.content);
|
|
600
|
+
};
|
|
601
|
+
var isTableCellInput = (rawBlock) => !("type" in rawBlock);
|
|
602
|
+
var toTableCell = (rawBlock) => {
|
|
603
|
+
if ("type" in rawBlock && rawBlock.type !== "text") {
|
|
604
|
+
return null;
|
|
605
|
+
}
|
|
606
|
+
const tableCellInput = isTableCellInput(rawBlock) ? rawBlock : void 0;
|
|
607
|
+
return {
|
|
608
|
+
text: rawBlock.text,
|
|
609
|
+
blocks: tableCellInput?.blocks,
|
|
610
|
+
italic: rawBlock.italic,
|
|
611
|
+
underline: rawBlock.underline,
|
|
612
|
+
link: rawBlock.link,
|
|
613
|
+
strike: rawBlock.strike,
|
|
614
|
+
bold: rawBlock.bold,
|
|
615
|
+
fontSize: rawBlock.fontSize,
|
|
616
|
+
font: rawBlock.font,
|
|
617
|
+
align: rawBlock.align,
|
|
618
|
+
color: rawBlock.color,
|
|
619
|
+
fillColor: tableCellInput?.fillColor,
|
|
620
|
+
style: rawBlock.style,
|
|
621
|
+
colSpan: tableCellInput?.colSpan,
|
|
622
|
+
rowSpan: tableCellInput?.rowSpan,
|
|
623
|
+
paddingTop: tableCellInput?.paddingTop,
|
|
624
|
+
paddingRight: tableCellInput?.paddingRight,
|
|
625
|
+
paddingBottom: tableCellInput?.paddingBottom,
|
|
626
|
+
paddingLeft: tableCellInput?.paddingLeft,
|
|
627
|
+
border: tableCellInput?.border
|
|
628
|
+
};
|
|
629
|
+
};
|
|
630
|
+
var resolvePathValue = (obj, dottedPath) => {
|
|
631
|
+
if (!obj || typeof obj !== "object") return void 0;
|
|
632
|
+
return dottedPath.split(".").reduce((acc, key) => {
|
|
633
|
+
if (!acc || typeof acc !== "object") return void 0;
|
|
634
|
+
return acc[key];
|
|
635
|
+
}, obj);
|
|
636
|
+
};
|
|
637
|
+
var interpolateCellText = (text, item, rowIndex) => {
|
|
638
|
+
return text.replace(/\{\{\s*([^}]+)\s*\}\}/g, (_match, tokenRaw) => {
|
|
639
|
+
const token = tokenRaw.trim();
|
|
640
|
+
if (!token) return "";
|
|
641
|
+
if (token === "index") return String(rowIndex + 1);
|
|
642
|
+
const normalizedPath = token.startsWith("item.") ? token.slice(5) : token;
|
|
643
|
+
const value = resolvePathValue(item, normalizedPath);
|
|
644
|
+
if (value === void 0 || value === null) return "";
|
|
645
|
+
return typeof value === "string" ? value : String(value);
|
|
646
|
+
});
|
|
647
|
+
};
|
|
648
|
+
var applyIterableData = (cell, item, rowIndex) => ({
|
|
649
|
+
...cell,
|
|
650
|
+
text: cell.text !== void 0 ? interpolateCellText(cell.text, item, rowIndex) : void 0
|
|
651
|
+
});
|
|
652
|
+
var expandIterableRow = (table, bodyDef) => {
|
|
653
|
+
const templateRow = bodyDef.content.map(toTableCell).filter((cell) => cell !== null);
|
|
654
|
+
if (!templateRow.length) {
|
|
655
|
+
return [];
|
|
656
|
+
}
|
|
657
|
+
if (!bodyDef.isIterable) {
|
|
658
|
+
return [templateRow];
|
|
659
|
+
}
|
|
660
|
+
const iterableSource = table[bodyDef.iterableKey];
|
|
661
|
+
if (!Array.isArray(iterableSource) || !iterableSource.length) {
|
|
662
|
+
return [templateRow];
|
|
663
|
+
}
|
|
664
|
+
return iterableSource.map((item, rowIndex) => templateRow.map((cell) => applyIterableData(cell, item, rowIndex)));
|
|
665
|
+
};
|
|
666
|
+
var normalizeTableRows = (table) => {
|
|
667
|
+
if (!Array.isArray(table.body)) return [];
|
|
668
|
+
const rows = [];
|
|
669
|
+
for (const entry of table.body) {
|
|
670
|
+
if (Array.isArray(entry)) {
|
|
671
|
+
rows.push(entry);
|
|
672
|
+
continue;
|
|
673
|
+
}
|
|
674
|
+
if (isTableBodyIterableEntry(entry)) {
|
|
675
|
+
rows.push(...expandIterableRow(table, entry));
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
return rows;
|
|
679
|
+
};
|
|
680
|
+
var measureCellHeight = (doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn) => {
|
|
681
|
+
if (cell.blocks?.length && measureBlockHeightFn) {
|
|
682
|
+
const cellEnv = { marginLeft: 0, innerWidth: textWidth, allowPageBreak: false };
|
|
683
|
+
const contentH = cell.blocks.filter((b) => b.visible !== false).reduce((acc, b) => acc + measureBlockHeightFn(b, cellEnv), 0);
|
|
684
|
+
return contentH + paddingTop + paddingBottom;
|
|
685
|
+
}
|
|
686
|
+
return doc.heightOfString(cell.text ?? "", { width: textWidth }) + paddingTop + paddingBottom;
|
|
687
|
+
};
|
|
688
|
+
var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2, measureBlockHeightFn) => {
|
|
580
689
|
const localLeft = table.marginLeft ?? 0;
|
|
581
690
|
const localRight = table.marginRight ?? 0;
|
|
582
691
|
const width = Math.max(env.innerWidth - localLeft - localRight, 1);
|
|
692
|
+
const rows = normalizeTableRows(table);
|
|
583
693
|
const totalCols = table.widths.length;
|
|
584
694
|
const colWidths = computeColumnPixelWidths2(table.widths, width);
|
|
585
695
|
const rowHeights = [];
|
|
586
696
|
const activeRowSpans = Array(totalCols).fill(0);
|
|
587
697
|
const placedRows = [];
|
|
588
|
-
for (let rowIndex = 0; rowIndex <
|
|
589
|
-
const row =
|
|
698
|
+
for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
|
|
699
|
+
const row = rows[rowIndex];
|
|
590
700
|
const placedRow = buildPlacedRow(row, totalCols, activeRowSpans);
|
|
591
701
|
placedRows.push(placedRow);
|
|
592
702
|
let rowHeight = 12;
|
|
@@ -598,9 +708,11 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
|
|
|
598
708
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
599
709
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
600
710
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
711
|
+
if (!cell.blocks?.length) {
|
|
712
|
+
doc.font(getCellFontName(cell));
|
|
713
|
+
doc.fontSize(cell.fontSize ?? 10);
|
|
714
|
+
}
|
|
715
|
+
const h = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
|
|
604
716
|
rowHeight = Math.max(rowHeight, h);
|
|
605
717
|
});
|
|
606
718
|
rowHeights.push(rowHeight);
|
|
@@ -617,9 +729,11 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
|
|
|
617
729
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
618
730
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
619
731
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
732
|
+
if (!cell.blocks?.length) {
|
|
733
|
+
doc.font(getCellFontName(cell));
|
|
734
|
+
doc.fontSize(cell.fontSize ?? 10);
|
|
735
|
+
}
|
|
736
|
+
const neededHeight = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
|
|
623
737
|
const currentGroupHeight = getRowSpanGroupHeight(rowHeights, rowIndex, rowSpan);
|
|
624
738
|
if (neededHeight > currentGroupHeight) {
|
|
625
739
|
const deficit = neededHeight - currentGroupHeight;
|
|
@@ -634,7 +748,7 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
|
|
|
634
748
|
totalHeight += table.marginBottom ?? 0;
|
|
635
749
|
return totalHeight;
|
|
636
750
|
};
|
|
637
|
-
var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidths2, bottomLimitForContent, finishPage2) => {
|
|
751
|
+
var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidths2, bottomLimitForContent, finishPage2, renderBlockFn, measureBlockHeightFn) => {
|
|
638
752
|
const localLeft = table.marginLeft ?? 0;
|
|
639
753
|
const localRight = table.marginRight ?? 0;
|
|
640
754
|
const baseLeft = env.marginLeft + localLeft;
|
|
@@ -650,14 +764,14 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
650
764
|
hLineColor: "#ccc",
|
|
651
765
|
vLineColor: "#ccc"
|
|
652
766
|
};
|
|
653
|
-
const borderAll = layout.border !== "none";
|
|
654
767
|
const headerRows = table.headerRows ?? 0;
|
|
655
|
-
const
|
|
768
|
+
const rows = normalizeTableRows(table);
|
|
769
|
+
const buildPlacementAndHeights = (rows2) => {
|
|
656
770
|
const placedRows = [];
|
|
657
771
|
const rowHeights = [];
|
|
658
772
|
const activeRowSpans = Array(totalCols).fill(0);
|
|
659
|
-
for (let rowIndex = 0; rowIndex <
|
|
660
|
-
const row =
|
|
773
|
+
for (let rowIndex = 0; rowIndex < rows2.length; rowIndex++) {
|
|
774
|
+
const row = rows2[rowIndex];
|
|
661
775
|
const placedRow = buildPlacedRow(row, totalCols, activeRowSpans);
|
|
662
776
|
placedRows.push(placedRow);
|
|
663
777
|
let rowHeight = 12;
|
|
@@ -669,9 +783,11 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
669
783
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
670
784
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
671
785
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
786
|
+
if (!cell.blocks?.length) {
|
|
787
|
+
doc.font(getCellFontName(cell));
|
|
788
|
+
doc.fontSize(cell.fontSize ?? 10);
|
|
789
|
+
}
|
|
790
|
+
const h = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
|
|
675
791
|
rowHeight = Math.max(rowHeight, h);
|
|
676
792
|
});
|
|
677
793
|
rowHeights.push(rowHeight);
|
|
@@ -688,9 +804,11 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
688
804
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
689
805
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
690
806
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
807
|
+
if (!cell.blocks?.length) {
|
|
808
|
+
doc.font(getCellFontName(cell));
|
|
809
|
+
doc.fontSize(cell.fontSize ?? 10);
|
|
810
|
+
}
|
|
811
|
+
const neededHeight = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
|
|
694
812
|
const currentGroupHeight = getRowSpanGroupHeight(rowHeights, rowIndex, rowSpan);
|
|
695
813
|
if (neededHeight > currentGroupHeight) {
|
|
696
814
|
const deficit = neededHeight - currentGroupHeight;
|
|
@@ -700,7 +818,7 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
700
818
|
}
|
|
701
819
|
return { placedRows, rowHeights };
|
|
702
820
|
};
|
|
703
|
-
const allLayout = buildPlacementAndHeights(
|
|
821
|
+
const allLayout = buildPlacementAndHeights(rows);
|
|
704
822
|
const drawPlacedRow = (placedRow, rowTop2, rowHeight, rowIndex, rowHeights, isHeaderRow, drawTopBorder) => {
|
|
705
823
|
placedRow.forEach(({ cell: rawCell, startCol, colSpan, rowSpan }) => {
|
|
706
824
|
const cell = resolveTableCell(styles, rawCell);
|
|
@@ -713,51 +831,64 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
713
831
|
const paddingTop = cell.paddingTop ?? 2;
|
|
714
832
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
715
833
|
doc.save();
|
|
716
|
-
|
|
717
|
-
|
|
834
|
+
const columnStyle = table.layout?.columnStyles?.[startCol];
|
|
835
|
+
const rowStyle = table.layout?.rowStyles?.[rowIndex];
|
|
836
|
+
const fillColor = cell.fillColor ?? rowStyle?.fillColor ?? columnStyle?.fillColor;
|
|
837
|
+
if (fillColor) {
|
|
838
|
+
doc.rect(x, rowTop2, colW, drawHeight).fillOpacity(1).fill(fillColor);
|
|
718
839
|
doc.fillOpacity(1);
|
|
719
840
|
}
|
|
720
|
-
doc.font(getCellFontName(cell));
|
|
721
|
-
doc.fontSize(fontSize);
|
|
722
|
-
doc.fillColor(cell.color ?? "black");
|
|
723
|
-
const align = cell.align ?? "left";
|
|
724
841
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
725
|
-
const
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
842
|
+
const textY = rowTop2 + paddingTop;
|
|
843
|
+
if (cell.blocks?.length && renderBlockFn) {
|
|
844
|
+
const cellEnv = {
|
|
845
|
+
marginLeft: x + paddingLeft,
|
|
846
|
+
innerWidth: textWidth,
|
|
847
|
+
allowPageBreak: false
|
|
848
|
+
};
|
|
849
|
+
const savedY = ctx.currentY;
|
|
850
|
+
let contentY = textY;
|
|
851
|
+
for (const block of cell.blocks) {
|
|
852
|
+
if (!block || block.visible === false) continue;
|
|
853
|
+
if (block.type === "signature" || block.type === "pageBreak") continue;
|
|
854
|
+
contentY = renderBlockFn(block, contentY, cellEnv);
|
|
855
|
+
}
|
|
856
|
+
ctx.currentY = savedY;
|
|
857
|
+
} else {
|
|
858
|
+
doc.font(getCellFontName(cell));
|
|
859
|
+
doc.fontSize(fontSize);
|
|
860
|
+
doc.fillColor(cell.color ?? "black");
|
|
861
|
+
const align = cell.align ?? "left";
|
|
862
|
+
const textHeight = doc.heightOfString(cell.text ?? "", { width: textWidth });
|
|
863
|
+
let paintY = textY;
|
|
864
|
+
if (isHeaderRow) {
|
|
865
|
+
const available = Math.max(drawHeight - paddingTop - paddingBottom, 0);
|
|
866
|
+
const offset = Math.max((available - textHeight) / 2, 0);
|
|
867
|
+
paintY = rowTop2 + paddingTop + offset;
|
|
868
|
+
}
|
|
869
|
+
doc.text(cell.text ?? "", x + paddingLeft, paintY, {
|
|
870
|
+
width: textWidth,
|
|
871
|
+
align,
|
|
872
|
+
underline: !!cell.underline,
|
|
873
|
+
strike: !!cell.strike,
|
|
874
|
+
link: cell.link
|
|
875
|
+
});
|
|
731
876
|
}
|
|
732
|
-
doc.text(cell.text, x + paddingLeft, textY, {
|
|
733
|
-
width: textWidth,
|
|
734
|
-
align,
|
|
735
|
-
underline: !!cell.underline,
|
|
736
|
-
strike: !!cell.strike,
|
|
737
|
-
link: cell.link
|
|
738
|
-
});
|
|
739
877
|
doc.restore();
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
doc.moveTo(x, bottomY).lineTo(x + colW, bottomY).stroke();
|
|
749
|
-
doc.restore();
|
|
750
|
-
doc.save();
|
|
751
|
-
doc.lineWidth(0.5);
|
|
752
|
-
doc.strokeColor(layout.vLineColor ?? "#ccc");
|
|
753
|
-
doc.moveTo(x, rowTop2).lineTo(x, bottomY).stroke();
|
|
754
|
-
doc.moveTo(x + colW, rowTop2).lineTo(x + colW, bottomY).stroke();
|
|
755
|
-
doc.restore();
|
|
878
|
+
const effectiveBorder = getEffectiveCellBorder({
|
|
879
|
+
table,
|
|
880
|
+
cell,
|
|
881
|
+
rowIndex,
|
|
882
|
+
startCol
|
|
883
|
+
});
|
|
884
|
+
if (!drawTopBorder) {
|
|
885
|
+
effectiveBorder.top.visible = false;
|
|
756
886
|
}
|
|
887
|
+
drawCellBorder(doc, effectiveBorder, x, rowTop2, colW, drawHeight);
|
|
757
888
|
});
|
|
758
889
|
return rowTop2 + rowHeight;
|
|
759
890
|
};
|
|
760
|
-
const headerRowsSource =
|
|
891
|
+
const headerRowsSource = rows.slice(0, headerRows);
|
|
761
892
|
const drawHeaderRowsOnNewPage = () => {
|
|
762
893
|
if (!headerRows) return doc.page.margins.top + mt;
|
|
763
894
|
const headerLayout = buildPlacementAndHeights(headerRowsSource);
|
|
@@ -776,7 +907,7 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
776
907
|
return rowTop2;
|
|
777
908
|
};
|
|
778
909
|
let rowTop = startY;
|
|
779
|
-
for (let rowIndex = 0; rowIndex <
|
|
910
|
+
for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
|
|
780
911
|
const isHeaderRow = rowIndex < headerRows;
|
|
781
912
|
const placedRow = allLayout.placedRows[rowIndex];
|
|
782
913
|
const rowHeight = allLayout.rowHeights[rowIndex];
|
|
@@ -793,6 +924,123 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
793
924
|
if (y === null) ctx.currentY = newY;
|
|
794
925
|
return newY;
|
|
795
926
|
};
|
|
927
|
+
var SIDES = ["top", "right", "bottom", "left"];
|
|
928
|
+
var DEFAULT_BORDER_COLOR = "#ccc";
|
|
929
|
+
var DEFAULT_BORDER_WIDTH = 0.5;
|
|
930
|
+
var isBorderStyleObject = (value) => {
|
|
931
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
932
|
+
};
|
|
933
|
+
var normalizeOneSideBorder = (value, fallback) => {
|
|
934
|
+
if (value === void 0) return fallback;
|
|
935
|
+
if (typeof value === "boolean") {
|
|
936
|
+
return {
|
|
937
|
+
...fallback,
|
|
938
|
+
visible: value
|
|
939
|
+
};
|
|
940
|
+
}
|
|
941
|
+
return {
|
|
942
|
+
visible: value.visible ?? fallback.visible,
|
|
943
|
+
color: value.color ?? fallback.color,
|
|
944
|
+
width: value.width ?? fallback.width,
|
|
945
|
+
dash: value.dash ?? fallback.dash
|
|
946
|
+
};
|
|
947
|
+
};
|
|
948
|
+
var normalizeCellBorder = (input, fallback) => {
|
|
949
|
+
if (input === void 0) return fallback;
|
|
950
|
+
if (typeof input === "boolean") {
|
|
951
|
+
return SIDES.reduce((acc, side) => {
|
|
952
|
+
acc[side] = {
|
|
953
|
+
...fallback[side],
|
|
954
|
+
visible: input
|
|
955
|
+
};
|
|
956
|
+
return acc;
|
|
957
|
+
}, {});
|
|
958
|
+
}
|
|
959
|
+
if (isBorderStyleObject(input) && ("visible" in input || "color" in input || "width" in input || "dash" in input)) {
|
|
960
|
+
return SIDES.reduce((acc, side) => {
|
|
961
|
+
acc[side] = normalizeOneSideBorder(input, fallback[side]);
|
|
962
|
+
return acc;
|
|
963
|
+
}, {});
|
|
964
|
+
}
|
|
965
|
+
const sideInput = input;
|
|
966
|
+
return SIDES.reduce((acc, side) => {
|
|
967
|
+
acc[side] = normalizeOneSideBorder(sideInput[side], fallback[side]);
|
|
968
|
+
return acc;
|
|
969
|
+
}, {});
|
|
970
|
+
};
|
|
971
|
+
var createDefaultTableBorder = (layout) => {
|
|
972
|
+
const visible = layout?.border !== "none";
|
|
973
|
+
const hColor = layout?.hLineColor ?? layout?.borderColor ?? DEFAULT_BORDER_COLOR;
|
|
974
|
+
const vColor = layout?.vLineColor ?? layout?.borderColor ?? DEFAULT_BORDER_COLOR;
|
|
975
|
+
const width = layout?.borderWidth ?? DEFAULT_BORDER_WIDTH;
|
|
976
|
+
return {
|
|
977
|
+
top: {
|
|
978
|
+
visible,
|
|
979
|
+
color: hColor,
|
|
980
|
+
width,
|
|
981
|
+
dash: layout?.borderDash
|
|
982
|
+
},
|
|
983
|
+
bottom: {
|
|
984
|
+
visible,
|
|
985
|
+
color: hColor,
|
|
986
|
+
width,
|
|
987
|
+
dash: layout?.borderDash
|
|
988
|
+
},
|
|
989
|
+
left: {
|
|
990
|
+
visible,
|
|
991
|
+
color: vColor,
|
|
992
|
+
width,
|
|
993
|
+
dash: layout?.borderDash
|
|
994
|
+
},
|
|
995
|
+
right: {
|
|
996
|
+
visible,
|
|
997
|
+
color: vColor,
|
|
998
|
+
width,
|
|
999
|
+
dash: layout?.borderDash
|
|
1000
|
+
}
|
|
1001
|
+
};
|
|
1002
|
+
};
|
|
1003
|
+
var getEffectiveCellBorder = (args) => {
|
|
1004
|
+
const { table, cell, rowIndex, startCol } = args;
|
|
1005
|
+
const tableBorder = createDefaultTableBorder(table.layout);
|
|
1006
|
+
const columnBorder = normalizeCellBorder(table.layout?.columnStyles?.[startCol]?.border, tableBorder);
|
|
1007
|
+
const rowBorder = normalizeCellBorder(table.layout?.rowStyles?.[rowIndex]?.border, columnBorder);
|
|
1008
|
+
return normalizeCellBorder(cell.border, rowBorder);
|
|
1009
|
+
};
|
|
1010
|
+
var drawBorderSide = (doc, side, border, x, y, width, height) => {
|
|
1011
|
+
if (!border.visible || border.width <= 0) return;
|
|
1012
|
+
doc.save();
|
|
1013
|
+
doc.lineWidth(border.width);
|
|
1014
|
+
doc.strokeColor(border.color);
|
|
1015
|
+
if (border.dash?.length) {
|
|
1016
|
+
doc.dash(border.dash[0], {
|
|
1017
|
+
space: border.dash[1] ?? border.dash[0]
|
|
1018
|
+
});
|
|
1019
|
+
} else {
|
|
1020
|
+
doc.undash();
|
|
1021
|
+
}
|
|
1022
|
+
switch (side) {
|
|
1023
|
+
case "top":
|
|
1024
|
+
doc.moveTo(x, y).lineTo(x + width, y).stroke();
|
|
1025
|
+
break;
|
|
1026
|
+
case "right":
|
|
1027
|
+
doc.moveTo(x + width, y).lineTo(x + width, y + height).stroke();
|
|
1028
|
+
break;
|
|
1029
|
+
case "bottom":
|
|
1030
|
+
doc.moveTo(x, y + height).lineTo(x + width, y + height).stroke();
|
|
1031
|
+
break;
|
|
1032
|
+
case "left":
|
|
1033
|
+
doc.moveTo(x, y).lineTo(x, y + height).stroke();
|
|
1034
|
+
break;
|
|
1035
|
+
}
|
|
1036
|
+
doc.restore();
|
|
1037
|
+
};
|
|
1038
|
+
var drawCellBorder = (doc, border, x, y, width, height) => {
|
|
1039
|
+
drawBorderSide(doc, "top", border.top, x, y, width, height);
|
|
1040
|
+
drawBorderSide(doc, "right", border.right, x, y, width, height);
|
|
1041
|
+
drawBorderSide(doc, "bottom", border.bottom, x, y, width, height);
|
|
1042
|
+
drawBorderSide(doc, "left", border.left, x, y, width, height);
|
|
1043
|
+
};
|
|
796
1044
|
|
|
797
1045
|
// src/renderer-engine/blocks/text.ts
|
|
798
1046
|
var processTextBlock = (doc, ctx, styles, block, y, env, ensureSpaceFor) => {
|
|
@@ -836,7 +1084,7 @@ var processTextBlock = (doc, ctx, styles, block, y, env, ensureSpaceFor) => {
|
|
|
836
1084
|
|
|
837
1085
|
// src/renderer-engine/utils/block-renderer.ts
|
|
838
1086
|
function createBlockRenderer(deps) {
|
|
839
|
-
const { doc, ctx, styles, computeColumnPixelWidths: computeColumnPixelWidths2, finishPage: finishPage2, processSignatureBlock } = deps;
|
|
1087
|
+
const { doc, ctx, styles, computeColumnPixelWidths: computeColumnPixelWidths2, finishPage: finishPage2, processSignatureBlock, defaultImage } = deps;
|
|
840
1088
|
const bottomLimitForContent = createBottomLimitForContent(doc, ctx);
|
|
841
1089
|
const ensureSpaceFor = createEnsureSpaceFor(ctx, bottomLimitForContent, finishPage2);
|
|
842
1090
|
const measureBlockHeight = createMeasureBlockHeight({
|
|
@@ -848,11 +1096,31 @@ function createBlockRenderer(deps) {
|
|
|
848
1096
|
if (block.visible === false) {
|
|
849
1097
|
return y ?? ctx.currentY;
|
|
850
1098
|
}
|
|
1099
|
+
if ((block.backgroundColor || block.backgroundImage) && block.type !== "pageBreak" && block.type !== "signature") {
|
|
1100
|
+
const startY = y ?? ctx.currentY;
|
|
1101
|
+
const blockHeight = measureBlockHeight(block, env);
|
|
1102
|
+
const opacity = block.backgroundOpacity ?? 1;
|
|
1103
|
+
doc.save();
|
|
1104
|
+
if (block.backgroundColor) {
|
|
1105
|
+
doc.fillOpacity(opacity).rect(env.marginLeft, startY, env.innerWidth, blockHeight).fill(block.backgroundColor);
|
|
1106
|
+
doc.fillOpacity(1);
|
|
1107
|
+
}
|
|
1108
|
+
if (block.backgroundImage) {
|
|
1109
|
+
try {
|
|
1110
|
+
doc.image(block.backgroundImage, env.marginLeft, startY, {
|
|
1111
|
+
width: env.innerWidth,
|
|
1112
|
+
height: blockHeight
|
|
1113
|
+
});
|
|
1114
|
+
} catch (_) {
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
doc.restore();
|
|
1118
|
+
}
|
|
851
1119
|
switch (block.type) {
|
|
852
1120
|
case "text":
|
|
853
1121
|
return processTextBlock(doc, ctx, styles, block, y, env, ensureSpaceFor);
|
|
854
1122
|
case "image":
|
|
855
|
-
return processImageBlock(doc, ctx, block, y, env, ensureSpaceFor);
|
|
1123
|
+
return processImageBlock(doc, ctx, block, y, env, ensureSpaceFor, defaultImage);
|
|
856
1124
|
case "qr": {
|
|
857
1125
|
const qb = block;
|
|
858
1126
|
const imageLike = {
|
|
@@ -866,7 +1134,7 @@ function createBlockRenderer(deps) {
|
|
|
866
1134
|
marginLeft: qb.marginLeft,
|
|
867
1135
|
marginRight: qb.marginRight
|
|
868
1136
|
};
|
|
869
|
-
return processImageBlock(doc, ctx, imageLike, y, env, ensureSpaceFor);
|
|
1137
|
+
return processImageBlock(doc, ctx, imageLike, y, env, ensureSpaceFor, defaultImage);
|
|
870
1138
|
}
|
|
871
1139
|
case "barcode":
|
|
872
1140
|
return processBarcodeBlock(doc, ctx, block, y, env, ensureSpaceFor);
|
|
@@ -882,7 +1150,9 @@ function createBlockRenderer(deps) {
|
|
|
882
1150
|
env,
|
|
883
1151
|
computeColumnPixelWidths2,
|
|
884
1152
|
bottomLimitForContent,
|
|
885
|
-
finishPage2
|
|
1153
|
+
finishPage2,
|
|
1154
|
+
(b, blockY, blockEnv) => renderBlock(b, blockY, blockEnv),
|
|
1155
|
+
measureBlockHeight
|
|
886
1156
|
);
|
|
887
1157
|
case "columns":
|
|
888
1158
|
return processColumnsBlock(
|
|
@@ -1125,14 +1395,24 @@ function drawHeader(doc, def, headerBandHeight, header, renderBlockArray) {
|
|
|
1125
1395
|
|
|
1126
1396
|
// src/renderer-engine/utils/image-loader.ts
|
|
1127
1397
|
var import_axios = __toESM(require("axios"));
|
|
1128
|
-
async function normalizeImageSrc(src) {
|
|
1129
|
-
if (!src) return src;
|
|
1398
|
+
async function normalizeImageSrc(src, fallback) {
|
|
1399
|
+
if (!src) return fallback ?? src;
|
|
1130
1400
|
if (Buffer.isBuffer(src)) return src;
|
|
1401
|
+
if (src.startsWith("data:")) {
|
|
1402
|
+
const commaIdx = src.indexOf(",");
|
|
1403
|
+
if (commaIdx !== -1) {
|
|
1404
|
+
return Buffer.from(src.slice(commaIdx + 1), "base64");
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1131
1407
|
if (src.startsWith("http://") || src.startsWith("https://")) {
|
|
1132
1408
|
try {
|
|
1133
1409
|
const res = await import_axios.default.get(src, { responseType: "arraybuffer" });
|
|
1134
1410
|
return Buffer.from(res.data);
|
|
1135
1411
|
} catch (e) {
|
|
1412
|
+
if (fallback !== void 0) {
|
|
1413
|
+
console.warn(`Failed to fetch remote image "${src}", using default image.`);
|
|
1414
|
+
return fallback;
|
|
1415
|
+
}
|
|
1136
1416
|
throw toPdfEngineError(e, {
|
|
1137
1417
|
code: "PDF_ERROR_IMAGE_FETCH_FAILED" /* PDF_ERROR_IMAGE_FETCH_FAILED */,
|
|
1138
1418
|
message: "Failed to fetch remote image for PDF.",
|
|
@@ -1144,23 +1424,47 @@ async function normalizeImageSrc(src) {
|
|
|
1144
1424
|
}
|
|
1145
1425
|
return src;
|
|
1146
1426
|
}
|
|
1147
|
-
async function materializeImagesInBlocks(blocks) {
|
|
1427
|
+
async function materializeImagesInBlocks(blocks, fallback) {
|
|
1148
1428
|
const out = [];
|
|
1149
1429
|
for (const block of blocks) {
|
|
1430
|
+
const blockAny = block;
|
|
1431
|
+
if (blockAny.backgroundImage) {
|
|
1432
|
+
blockAny.backgroundImage = await normalizeImageSrc(blockAny.backgroundImage, fallback);
|
|
1433
|
+
}
|
|
1150
1434
|
if (block.type === "image") {
|
|
1151
1435
|
const img = { ...block };
|
|
1152
|
-
img.src = await normalizeImageSrc(img.src);
|
|
1436
|
+
img.src = await normalizeImageSrc(img.src, fallback);
|
|
1153
1437
|
out.push(img);
|
|
1154
1438
|
} else if (block.type === "columns") {
|
|
1155
1439
|
out.push({
|
|
1156
1440
|
...block,
|
|
1157
|
-
columns: await Promise.all(block.columns.map((col) => materializeImagesInBlocks(col)))
|
|
1441
|
+
columns: await Promise.all(block.columns.map((col) => materializeImagesInBlocks(col, fallback)))
|
|
1158
1442
|
});
|
|
1159
1443
|
} else if (block.type === "signature" && block.blocks) {
|
|
1160
1444
|
out.push({
|
|
1161
1445
|
...block,
|
|
1162
|
-
blocks: await materializeImagesInBlocks(block.blocks)
|
|
1446
|
+
blocks: await materializeImagesInBlocks(block.blocks, fallback)
|
|
1163
1447
|
});
|
|
1448
|
+
} else if (block.type === "table") {
|
|
1449
|
+
const tb = block;
|
|
1450
|
+
const newBody = await Promise.all(
|
|
1451
|
+
tb.body.map(
|
|
1452
|
+
async (entry) => {
|
|
1453
|
+
const materializeCell = async (cell) => {
|
|
1454
|
+
if (!cell.blocks?.length) return cell;
|
|
1455
|
+
return { ...cell, blocks: await materializeImagesInBlocks(cell.blocks, fallback) };
|
|
1456
|
+
};
|
|
1457
|
+
if (Array.isArray(entry)) {
|
|
1458
|
+
return await Promise.all(entry.map(materializeCell));
|
|
1459
|
+
}
|
|
1460
|
+
if (entry && typeof entry === "object" && "content" in entry && Array.isArray(entry.content)) {
|
|
1461
|
+
return { ...entry, content: await Promise.all(entry.content.map(materializeCell)) };
|
|
1462
|
+
}
|
|
1463
|
+
return entry;
|
|
1464
|
+
}
|
|
1465
|
+
)
|
|
1466
|
+
);
|
|
1467
|
+
out.push({ ...tb, body: newBody });
|
|
1164
1468
|
} else {
|
|
1165
1469
|
out.push(block);
|
|
1166
1470
|
}
|
|
@@ -1314,7 +1618,7 @@ function createMeasureBlockHeight(deps) {
|
|
|
1314
1618
|
innerWidth,
|
|
1315
1619
|
allowPageBreak: false
|
|
1316
1620
|
};
|
|
1317
|
-
const h = measureTableHeight(doc, b, fakeEnv, styles, computeColumnPixelWidths2);
|
|
1621
|
+
const h = measureTableHeight(doc, b, fakeEnv, styles, computeColumnPixelWidths2, measure);
|
|
1318
1622
|
return mt + h + mb;
|
|
1319
1623
|
};
|
|
1320
1624
|
const measureColumns = (b, env) => {
|
|
@@ -1628,6 +1932,26 @@ async function materializeQrAndBarcodesInBlocks(blocks) {
|
|
|
1628
1932
|
bb.src = buf;
|
|
1629
1933
|
}
|
|
1630
1934
|
out.push(bb);
|
|
1935
|
+
} else if (block.type === "table") {
|
|
1936
|
+
const tb = block;
|
|
1937
|
+
const newBody = await Promise.all(
|
|
1938
|
+
tb.body.map(
|
|
1939
|
+
async (entry) => {
|
|
1940
|
+
const materializeCell = async (cell) => {
|
|
1941
|
+
if (!cell.blocks?.length) return cell;
|
|
1942
|
+
return { ...cell, blocks: await materializeQrAndBarcodesInBlocks(cell.blocks) };
|
|
1943
|
+
};
|
|
1944
|
+
if (Array.isArray(entry)) {
|
|
1945
|
+
return await Promise.all(entry.map(materializeCell));
|
|
1946
|
+
}
|
|
1947
|
+
if (entry && typeof entry === "object" && "content" in entry && Array.isArray(entry.content)) {
|
|
1948
|
+
return { ...entry, content: await Promise.all(entry.content.map(materializeCell)) };
|
|
1949
|
+
}
|
|
1950
|
+
return entry;
|
|
1951
|
+
}
|
|
1952
|
+
)
|
|
1953
|
+
);
|
|
1954
|
+
out.push({ ...tb, body: newBody });
|
|
1631
1955
|
} else {
|
|
1632
1956
|
out.push(block);
|
|
1633
1957
|
}
|
|
@@ -1883,23 +2207,28 @@ function drawWatermarkForPage(doc, watermark, pageNumber, isLast) {
|
|
|
1883
2207
|
}
|
|
1884
2208
|
|
|
1885
2209
|
// src/renderer-engine/index.ts
|
|
2210
|
+
var BUILT_IN_DEFAULT_IMAGE = Buffer.from(
|
|
2211
|
+
images.default.slice(images.default.indexOf(",") + 1),
|
|
2212
|
+
"base64"
|
|
2213
|
+
);
|
|
1886
2214
|
async function renderCustomPdf(def, outputPath) {
|
|
2215
|
+
const fallbackImage = def.defaultImage ?? BUILT_IN_DEFAULT_IMAGE;
|
|
1887
2216
|
if (def.header) {
|
|
1888
2217
|
def.header.blocks = await materializeQrAndBarcodesInBlocks(def.header.blocks);
|
|
1889
|
-
def.header.blocks = await materializeImagesInBlocks(def.header.blocks);
|
|
2218
|
+
def.header.blocks = await materializeImagesInBlocks(def.header.blocks, fallbackImage);
|
|
1890
2219
|
}
|
|
1891
2220
|
def.content = await materializeQrAndBarcodesInBlocks(def.content);
|
|
1892
|
-
def.content = await materializeImagesInBlocks(def.content);
|
|
2221
|
+
def.content = await materializeImagesInBlocks(def.content, fallbackImage);
|
|
1893
2222
|
if (def.pageBackground?.src) {
|
|
1894
|
-
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src);
|
|
2223
|
+
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src, fallbackImage);
|
|
1895
2224
|
}
|
|
1896
2225
|
if (def.header?.backgroundImage) {
|
|
1897
|
-
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage);
|
|
2226
|
+
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage, fallbackImage);
|
|
1898
2227
|
}
|
|
1899
2228
|
if (def.footer && typeof def.footer !== "function") {
|
|
1900
2229
|
const footer = def.footer;
|
|
1901
2230
|
if (footer.backgroundImage) {
|
|
1902
|
-
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage);
|
|
2231
|
+
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage, fallbackImage);
|
|
1903
2232
|
}
|
|
1904
2233
|
}
|
|
1905
2234
|
return new Promise((resolve, reject) => {
|
|
@@ -1950,7 +2279,8 @@ async function renderCustomPdf(def, outputPath) {
|
|
|
1950
2279
|
styles,
|
|
1951
2280
|
computeColumnPixelWidths,
|
|
1952
2281
|
finishPage: finishPage2,
|
|
1953
|
-
processSignatureBlock
|
|
2282
|
+
processSignatureBlock,
|
|
2283
|
+
defaultImage: fallbackImage
|
|
1954
2284
|
});
|
|
1955
2285
|
const startNewPageLayout = createStartNewPageLayout({
|
|
1956
2286
|
doc,
|
|
@@ -1989,22 +2319,23 @@ async function renderCustomPdf(def, outputPath) {
|
|
|
1989
2319
|
});
|
|
1990
2320
|
}
|
|
1991
2321
|
async function renderCustomPdfToBuffer(def) {
|
|
2322
|
+
const fallbackImage = def.defaultImage ?? BUILT_IN_DEFAULT_IMAGE;
|
|
1992
2323
|
if (def.header) {
|
|
1993
2324
|
def.header.blocks = await materializeQrAndBarcodesInBlocks(def.header.blocks);
|
|
1994
|
-
def.header.blocks = await materializeImagesInBlocks(def.header.blocks);
|
|
2325
|
+
def.header.blocks = await materializeImagesInBlocks(def.header.blocks, fallbackImage);
|
|
1995
2326
|
}
|
|
1996
2327
|
def.content = await materializeQrAndBarcodesInBlocks(def.content);
|
|
1997
|
-
def.content = await materializeImagesInBlocks(def.content);
|
|
2328
|
+
def.content = await materializeImagesInBlocks(def.content, fallbackImage);
|
|
1998
2329
|
if (def.pageBackground?.src) {
|
|
1999
|
-
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src);
|
|
2330
|
+
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src, fallbackImage);
|
|
2000
2331
|
}
|
|
2001
2332
|
if (def.header?.backgroundImage) {
|
|
2002
|
-
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage);
|
|
2333
|
+
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage, fallbackImage);
|
|
2003
2334
|
}
|
|
2004
2335
|
if (def.footer && typeof def.footer !== "function") {
|
|
2005
2336
|
const footer = def.footer;
|
|
2006
2337
|
if (footer.backgroundImage) {
|
|
2007
|
-
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage);
|
|
2338
|
+
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage, fallbackImage);
|
|
2008
2339
|
}
|
|
2009
2340
|
}
|
|
2010
2341
|
return new Promise((resolve, reject) => {
|
|
@@ -2070,7 +2401,8 @@ async function renderCustomPdfToBuffer(def) {
|
|
|
2070
2401
|
styles,
|
|
2071
2402
|
computeColumnPixelWidths,
|
|
2072
2403
|
finishPage: finishPage2,
|
|
2073
|
-
processSignatureBlock
|
|
2404
|
+
processSignatureBlock,
|
|
2405
|
+
defaultImage: fallbackImage
|
|
2074
2406
|
});
|
|
2075
2407
|
const startNewPageLayout = createStartNewPageLayout({
|
|
2076
2408
|
doc,
|
|
@@ -2101,6 +2433,7 @@ async function renderCustomPdfToBuffer(def) {
|
|
|
2101
2433
|
PdfEngineError,
|
|
2102
2434
|
PdfEngineErrorCode,
|
|
2103
2435
|
QR_ERROR_LEVEL,
|
|
2436
|
+
images,
|
|
2104
2437
|
isPdfEngineError,
|
|
2105
2438
|
renderCustomPdf,
|
|
2106
2439
|
renderCustomPdfToBuffer,
|