av6-pdf-engine 1.2.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 +34 -2
- package/dist/index.d.ts +34 -2
- package/dist/index.js +326 -77
- package/dist/index.mjs +325 -77
- 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;
|
|
@@ -589,6 +606,7 @@ var toTableCell = (rawBlock) => {
|
|
|
589
606
|
const tableCellInput = isTableCellInput(rawBlock) ? rawBlock : void 0;
|
|
590
607
|
return {
|
|
591
608
|
text: rawBlock.text,
|
|
609
|
+
blocks: tableCellInput?.blocks,
|
|
592
610
|
italic: rawBlock.italic,
|
|
593
611
|
underline: rawBlock.underline,
|
|
594
612
|
link: rawBlock.link,
|
|
@@ -605,7 +623,8 @@ var toTableCell = (rawBlock) => {
|
|
|
605
623
|
paddingTop: tableCellInput?.paddingTop,
|
|
606
624
|
paddingRight: tableCellInput?.paddingRight,
|
|
607
625
|
paddingBottom: tableCellInput?.paddingBottom,
|
|
608
|
-
paddingLeft: tableCellInput?.paddingLeft
|
|
626
|
+
paddingLeft: tableCellInput?.paddingLeft,
|
|
627
|
+
border: tableCellInput?.border
|
|
609
628
|
};
|
|
610
629
|
};
|
|
611
630
|
var resolvePathValue = (obj, dottedPath) => {
|
|
@@ -628,7 +647,7 @@ var interpolateCellText = (text, item, rowIndex) => {
|
|
|
628
647
|
};
|
|
629
648
|
var applyIterableData = (cell, item, rowIndex) => ({
|
|
630
649
|
...cell,
|
|
631
|
-
text: interpolateCellText(cell.text, item, rowIndex)
|
|
650
|
+
text: cell.text !== void 0 ? interpolateCellText(cell.text, item, rowIndex) : void 0
|
|
632
651
|
});
|
|
633
652
|
var expandIterableRow = (table, bodyDef) => {
|
|
634
653
|
const templateRow = bodyDef.content.map(toTableCell).filter((cell) => cell !== null);
|
|
@@ -658,7 +677,15 @@ var normalizeTableRows = (table) => {
|
|
|
658
677
|
}
|
|
659
678
|
return rows;
|
|
660
679
|
};
|
|
661
|
-
var
|
|
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) => {
|
|
662
689
|
const localLeft = table.marginLeft ?? 0;
|
|
663
690
|
const localRight = table.marginRight ?? 0;
|
|
664
691
|
const width = Math.max(env.innerWidth - localLeft - localRight, 1);
|
|
@@ -681,9 +708,11 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
|
|
|
681
708
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
682
709
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
683
710
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
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);
|
|
687
716
|
rowHeight = Math.max(rowHeight, h);
|
|
688
717
|
});
|
|
689
718
|
rowHeights.push(rowHeight);
|
|
@@ -700,9 +729,11 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
|
|
|
700
729
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
701
730
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
702
731
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
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);
|
|
706
737
|
const currentGroupHeight = getRowSpanGroupHeight(rowHeights, rowIndex, rowSpan);
|
|
707
738
|
if (neededHeight > currentGroupHeight) {
|
|
708
739
|
const deficit = neededHeight - currentGroupHeight;
|
|
@@ -717,7 +748,7 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
|
|
|
717
748
|
totalHeight += table.marginBottom ?? 0;
|
|
718
749
|
return totalHeight;
|
|
719
750
|
};
|
|
720
|
-
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) => {
|
|
721
752
|
const localLeft = table.marginLeft ?? 0;
|
|
722
753
|
const localRight = table.marginRight ?? 0;
|
|
723
754
|
const baseLeft = env.marginLeft + localLeft;
|
|
@@ -733,7 +764,6 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
733
764
|
hLineColor: "#ccc",
|
|
734
765
|
vLineColor: "#ccc"
|
|
735
766
|
};
|
|
736
|
-
const borderAll = layout.border !== "none";
|
|
737
767
|
const headerRows = table.headerRows ?? 0;
|
|
738
768
|
const rows = normalizeTableRows(table);
|
|
739
769
|
const buildPlacementAndHeights = (rows2) => {
|
|
@@ -753,9 +783,11 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
753
783
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
754
784
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
755
785
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
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);
|
|
759
791
|
rowHeight = Math.max(rowHeight, h);
|
|
760
792
|
});
|
|
761
793
|
rowHeights.push(rowHeight);
|
|
@@ -772,9 +804,11 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
772
804
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
773
805
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
774
806
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
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);
|
|
778
812
|
const currentGroupHeight = getRowSpanGroupHeight(rowHeights, rowIndex, rowSpan);
|
|
779
813
|
if (neededHeight > currentGroupHeight) {
|
|
780
814
|
const deficit = neededHeight - currentGroupHeight;
|
|
@@ -797,47 +831,60 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
797
831
|
const paddingTop = cell.paddingTop ?? 2;
|
|
798
832
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
799
833
|
doc.save();
|
|
800
|
-
|
|
801
|
-
|
|
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);
|
|
802
839
|
doc.fillOpacity(1);
|
|
803
840
|
}
|
|
804
|
-
doc.font(getCellFontName(cell));
|
|
805
|
-
doc.fontSize(fontSize);
|
|
806
|
-
doc.fillColor(cell.color ?? "black");
|
|
807
|
-
const align = cell.align ?? "left";
|
|
808
841
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
809
|
-
const
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
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
|
+
});
|
|
815
876
|
}
|
|
816
|
-
doc.text(cell.text, x + paddingLeft, textY, {
|
|
817
|
-
width: textWidth,
|
|
818
|
-
align,
|
|
819
|
-
underline: !!cell.underline,
|
|
820
|
-
strike: !!cell.strike,
|
|
821
|
-
link: cell.link
|
|
822
|
-
});
|
|
823
877
|
doc.restore();
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
doc.moveTo(x, bottomY).lineTo(x + colW, bottomY).stroke();
|
|
833
|
-
doc.restore();
|
|
834
|
-
doc.save();
|
|
835
|
-
doc.lineWidth(0.5);
|
|
836
|
-
doc.strokeColor(layout.vLineColor ?? "#ccc");
|
|
837
|
-
doc.moveTo(x, rowTop2).lineTo(x, bottomY).stroke();
|
|
838
|
-
doc.moveTo(x + colW, rowTop2).lineTo(x + colW, bottomY).stroke();
|
|
839
|
-
doc.restore();
|
|
878
|
+
const effectiveBorder = getEffectiveCellBorder({
|
|
879
|
+
table,
|
|
880
|
+
cell,
|
|
881
|
+
rowIndex,
|
|
882
|
+
startCol
|
|
883
|
+
});
|
|
884
|
+
if (!drawTopBorder) {
|
|
885
|
+
effectiveBorder.top.visible = false;
|
|
840
886
|
}
|
|
887
|
+
drawCellBorder(doc, effectiveBorder, x, rowTop2, colW, drawHeight);
|
|
841
888
|
});
|
|
842
889
|
return rowTop2 + rowHeight;
|
|
843
890
|
};
|
|
@@ -877,6 +924,123 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
877
924
|
if (y === null) ctx.currentY = newY;
|
|
878
925
|
return newY;
|
|
879
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
|
+
};
|
|
880
1044
|
|
|
881
1045
|
// src/renderer-engine/blocks/text.ts
|
|
882
1046
|
var processTextBlock = (doc, ctx, styles, block, y, env, ensureSpaceFor) => {
|
|
@@ -920,7 +1084,7 @@ var processTextBlock = (doc, ctx, styles, block, y, env, ensureSpaceFor) => {
|
|
|
920
1084
|
|
|
921
1085
|
// src/renderer-engine/utils/block-renderer.ts
|
|
922
1086
|
function createBlockRenderer(deps) {
|
|
923
|
-
const { doc, ctx, styles, computeColumnPixelWidths: computeColumnPixelWidths2, finishPage: finishPage2, processSignatureBlock } = deps;
|
|
1087
|
+
const { doc, ctx, styles, computeColumnPixelWidths: computeColumnPixelWidths2, finishPage: finishPage2, processSignatureBlock, defaultImage } = deps;
|
|
924
1088
|
const bottomLimitForContent = createBottomLimitForContent(doc, ctx);
|
|
925
1089
|
const ensureSpaceFor = createEnsureSpaceFor(ctx, bottomLimitForContent, finishPage2);
|
|
926
1090
|
const measureBlockHeight = createMeasureBlockHeight({
|
|
@@ -932,11 +1096,31 @@ function createBlockRenderer(deps) {
|
|
|
932
1096
|
if (block.visible === false) {
|
|
933
1097
|
return y ?? ctx.currentY;
|
|
934
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
|
+
}
|
|
935
1119
|
switch (block.type) {
|
|
936
1120
|
case "text":
|
|
937
1121
|
return processTextBlock(doc, ctx, styles, block, y, env, ensureSpaceFor);
|
|
938
1122
|
case "image":
|
|
939
|
-
return processImageBlock(doc, ctx, block, y, env, ensureSpaceFor);
|
|
1123
|
+
return processImageBlock(doc, ctx, block, y, env, ensureSpaceFor, defaultImage);
|
|
940
1124
|
case "qr": {
|
|
941
1125
|
const qb = block;
|
|
942
1126
|
const imageLike = {
|
|
@@ -950,7 +1134,7 @@ function createBlockRenderer(deps) {
|
|
|
950
1134
|
marginLeft: qb.marginLeft,
|
|
951
1135
|
marginRight: qb.marginRight
|
|
952
1136
|
};
|
|
953
|
-
return processImageBlock(doc, ctx, imageLike, y, env, ensureSpaceFor);
|
|
1137
|
+
return processImageBlock(doc, ctx, imageLike, y, env, ensureSpaceFor, defaultImage);
|
|
954
1138
|
}
|
|
955
1139
|
case "barcode":
|
|
956
1140
|
return processBarcodeBlock(doc, ctx, block, y, env, ensureSpaceFor);
|
|
@@ -966,7 +1150,9 @@ function createBlockRenderer(deps) {
|
|
|
966
1150
|
env,
|
|
967
1151
|
computeColumnPixelWidths2,
|
|
968
1152
|
bottomLimitForContent,
|
|
969
|
-
finishPage2
|
|
1153
|
+
finishPage2,
|
|
1154
|
+
(b, blockY, blockEnv) => renderBlock(b, blockY, blockEnv),
|
|
1155
|
+
measureBlockHeight
|
|
970
1156
|
);
|
|
971
1157
|
case "columns":
|
|
972
1158
|
return processColumnsBlock(
|
|
@@ -1209,14 +1395,24 @@ function drawHeader(doc, def, headerBandHeight, header, renderBlockArray) {
|
|
|
1209
1395
|
|
|
1210
1396
|
// src/renderer-engine/utils/image-loader.ts
|
|
1211
1397
|
var import_axios = __toESM(require("axios"));
|
|
1212
|
-
async function normalizeImageSrc(src) {
|
|
1213
|
-
if (!src) return src;
|
|
1398
|
+
async function normalizeImageSrc(src, fallback) {
|
|
1399
|
+
if (!src) return fallback ?? src;
|
|
1214
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
|
+
}
|
|
1215
1407
|
if (src.startsWith("http://") || src.startsWith("https://")) {
|
|
1216
1408
|
try {
|
|
1217
1409
|
const res = await import_axios.default.get(src, { responseType: "arraybuffer" });
|
|
1218
1410
|
return Buffer.from(res.data);
|
|
1219
1411
|
} catch (e) {
|
|
1412
|
+
if (fallback !== void 0) {
|
|
1413
|
+
console.warn(`Failed to fetch remote image "${src}", using default image.`);
|
|
1414
|
+
return fallback;
|
|
1415
|
+
}
|
|
1220
1416
|
throw toPdfEngineError(e, {
|
|
1221
1417
|
code: "PDF_ERROR_IMAGE_FETCH_FAILED" /* PDF_ERROR_IMAGE_FETCH_FAILED */,
|
|
1222
1418
|
message: "Failed to fetch remote image for PDF.",
|
|
@@ -1228,23 +1424,47 @@ async function normalizeImageSrc(src) {
|
|
|
1228
1424
|
}
|
|
1229
1425
|
return src;
|
|
1230
1426
|
}
|
|
1231
|
-
async function materializeImagesInBlocks(blocks) {
|
|
1427
|
+
async function materializeImagesInBlocks(blocks, fallback) {
|
|
1232
1428
|
const out = [];
|
|
1233
1429
|
for (const block of blocks) {
|
|
1430
|
+
const blockAny = block;
|
|
1431
|
+
if (blockAny.backgroundImage) {
|
|
1432
|
+
blockAny.backgroundImage = await normalizeImageSrc(blockAny.backgroundImage, fallback);
|
|
1433
|
+
}
|
|
1234
1434
|
if (block.type === "image") {
|
|
1235
1435
|
const img = { ...block };
|
|
1236
|
-
img.src = await normalizeImageSrc(img.src);
|
|
1436
|
+
img.src = await normalizeImageSrc(img.src, fallback);
|
|
1237
1437
|
out.push(img);
|
|
1238
1438
|
} else if (block.type === "columns") {
|
|
1239
1439
|
out.push({
|
|
1240
1440
|
...block,
|
|
1241
|
-
columns: await Promise.all(block.columns.map((col) => materializeImagesInBlocks(col)))
|
|
1441
|
+
columns: await Promise.all(block.columns.map((col) => materializeImagesInBlocks(col, fallback)))
|
|
1242
1442
|
});
|
|
1243
1443
|
} else if (block.type === "signature" && block.blocks) {
|
|
1244
1444
|
out.push({
|
|
1245
1445
|
...block,
|
|
1246
|
-
blocks: await materializeImagesInBlocks(block.blocks)
|
|
1446
|
+
blocks: await materializeImagesInBlocks(block.blocks, fallback)
|
|
1247
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 });
|
|
1248
1468
|
} else {
|
|
1249
1469
|
out.push(block);
|
|
1250
1470
|
}
|
|
@@ -1398,7 +1618,7 @@ function createMeasureBlockHeight(deps) {
|
|
|
1398
1618
|
innerWidth,
|
|
1399
1619
|
allowPageBreak: false
|
|
1400
1620
|
};
|
|
1401
|
-
const h = measureTableHeight(doc, b, fakeEnv, styles, computeColumnPixelWidths2);
|
|
1621
|
+
const h = measureTableHeight(doc, b, fakeEnv, styles, computeColumnPixelWidths2, measure);
|
|
1402
1622
|
return mt + h + mb;
|
|
1403
1623
|
};
|
|
1404
1624
|
const measureColumns = (b, env) => {
|
|
@@ -1712,6 +1932,26 @@ async function materializeQrAndBarcodesInBlocks(blocks) {
|
|
|
1712
1932
|
bb.src = buf;
|
|
1713
1933
|
}
|
|
1714
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 });
|
|
1715
1955
|
} else {
|
|
1716
1956
|
out.push(block);
|
|
1717
1957
|
}
|
|
@@ -1967,23 +2207,28 @@ function drawWatermarkForPage(doc, watermark, pageNumber, isLast) {
|
|
|
1967
2207
|
}
|
|
1968
2208
|
|
|
1969
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
|
+
);
|
|
1970
2214
|
async function renderCustomPdf(def, outputPath) {
|
|
2215
|
+
const fallbackImage = def.defaultImage ?? BUILT_IN_DEFAULT_IMAGE;
|
|
1971
2216
|
if (def.header) {
|
|
1972
2217
|
def.header.blocks = await materializeQrAndBarcodesInBlocks(def.header.blocks);
|
|
1973
|
-
def.header.blocks = await materializeImagesInBlocks(def.header.blocks);
|
|
2218
|
+
def.header.blocks = await materializeImagesInBlocks(def.header.blocks, fallbackImage);
|
|
1974
2219
|
}
|
|
1975
2220
|
def.content = await materializeQrAndBarcodesInBlocks(def.content);
|
|
1976
|
-
def.content = await materializeImagesInBlocks(def.content);
|
|
2221
|
+
def.content = await materializeImagesInBlocks(def.content, fallbackImage);
|
|
1977
2222
|
if (def.pageBackground?.src) {
|
|
1978
|
-
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src);
|
|
2223
|
+
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src, fallbackImage);
|
|
1979
2224
|
}
|
|
1980
2225
|
if (def.header?.backgroundImage) {
|
|
1981
|
-
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage);
|
|
2226
|
+
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage, fallbackImage);
|
|
1982
2227
|
}
|
|
1983
2228
|
if (def.footer && typeof def.footer !== "function") {
|
|
1984
2229
|
const footer = def.footer;
|
|
1985
2230
|
if (footer.backgroundImage) {
|
|
1986
|
-
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage);
|
|
2231
|
+
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage, fallbackImage);
|
|
1987
2232
|
}
|
|
1988
2233
|
}
|
|
1989
2234
|
return new Promise((resolve, reject) => {
|
|
@@ -2034,7 +2279,8 @@ async function renderCustomPdf(def, outputPath) {
|
|
|
2034
2279
|
styles,
|
|
2035
2280
|
computeColumnPixelWidths,
|
|
2036
2281
|
finishPage: finishPage2,
|
|
2037
|
-
processSignatureBlock
|
|
2282
|
+
processSignatureBlock,
|
|
2283
|
+
defaultImage: fallbackImage
|
|
2038
2284
|
});
|
|
2039
2285
|
const startNewPageLayout = createStartNewPageLayout({
|
|
2040
2286
|
doc,
|
|
@@ -2073,22 +2319,23 @@ async function renderCustomPdf(def, outputPath) {
|
|
|
2073
2319
|
});
|
|
2074
2320
|
}
|
|
2075
2321
|
async function renderCustomPdfToBuffer(def) {
|
|
2322
|
+
const fallbackImage = def.defaultImage ?? BUILT_IN_DEFAULT_IMAGE;
|
|
2076
2323
|
if (def.header) {
|
|
2077
2324
|
def.header.blocks = await materializeQrAndBarcodesInBlocks(def.header.blocks);
|
|
2078
|
-
def.header.blocks = await materializeImagesInBlocks(def.header.blocks);
|
|
2325
|
+
def.header.blocks = await materializeImagesInBlocks(def.header.blocks, fallbackImage);
|
|
2079
2326
|
}
|
|
2080
2327
|
def.content = await materializeQrAndBarcodesInBlocks(def.content);
|
|
2081
|
-
def.content = await materializeImagesInBlocks(def.content);
|
|
2328
|
+
def.content = await materializeImagesInBlocks(def.content, fallbackImage);
|
|
2082
2329
|
if (def.pageBackground?.src) {
|
|
2083
|
-
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src);
|
|
2330
|
+
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src, fallbackImage);
|
|
2084
2331
|
}
|
|
2085
2332
|
if (def.header?.backgroundImage) {
|
|
2086
|
-
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage);
|
|
2333
|
+
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage, fallbackImage);
|
|
2087
2334
|
}
|
|
2088
2335
|
if (def.footer && typeof def.footer !== "function") {
|
|
2089
2336
|
const footer = def.footer;
|
|
2090
2337
|
if (footer.backgroundImage) {
|
|
2091
|
-
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage);
|
|
2338
|
+
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage, fallbackImage);
|
|
2092
2339
|
}
|
|
2093
2340
|
}
|
|
2094
2341
|
return new Promise((resolve, reject) => {
|
|
@@ -2154,7 +2401,8 @@ async function renderCustomPdfToBuffer(def) {
|
|
|
2154
2401
|
styles,
|
|
2155
2402
|
computeColumnPixelWidths,
|
|
2156
2403
|
finishPage: finishPage2,
|
|
2157
|
-
processSignatureBlock
|
|
2404
|
+
processSignatureBlock,
|
|
2405
|
+
defaultImage: fallbackImage
|
|
2158
2406
|
});
|
|
2159
2407
|
const startNewPageLayout = createStartNewPageLayout({
|
|
2160
2408
|
doc,
|
|
@@ -2185,6 +2433,7 @@ async function renderCustomPdfToBuffer(def) {
|
|
|
2185
2433
|
PdfEngineError,
|
|
2186
2434
|
PdfEngineErrorCode,
|
|
2187
2435
|
QR_ERROR_LEVEL,
|
|
2436
|
+
images,
|
|
2188
2437
|
isPdfEngineError,
|
|
2189
2438
|
renderCustomPdf,
|
|
2190
2439
|
renderCustomPdfToBuffer,
|