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.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
- console.warn("Failed to load image:", e);
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 measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) => {
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 < table.body.length; rowIndex++) {
589
- const row = table.body[rowIndex];
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
- doc.font(getCellFontName(cell));
602
- doc.fontSize(cell.fontSize ?? 10);
603
- const h = doc.heightOfString(cell.text, { width: textWidth }) + paddingTop + paddingBottom;
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
- doc.font(getCellFontName(cell));
621
- doc.fontSize(cell.fontSize ?? 10);
622
- const neededHeight = doc.heightOfString(cell.text, { width: textWidth }) + paddingTop + paddingBottom;
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 buildPlacementAndHeights = (rows) => {
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 < rows.length; rowIndex++) {
660
- const row = rows[rowIndex];
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
- doc.font(getCellFontName(cell));
673
- doc.fontSize(cell.fontSize ?? 10);
674
- const h = doc.heightOfString(cell.text, { width: textWidth }) + paddingTop + paddingBottom;
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
- doc.font(getCellFontName(cell));
692
- doc.fontSize(cell.fontSize ?? 10);
693
- const neededHeight = doc.heightOfString(cell.text, { width: textWidth }) + paddingTop + paddingBottom;
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(table.body);
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
- if (cell.fillColor) {
717
- doc.rect(x, rowTop2, colW, drawHeight).fillOpacity(1).fill(cell.fillColor);
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 textHeight = doc.heightOfString(cell.text, { width: textWidth });
726
- let textY = rowTop2 + paddingTop;
727
- if (isHeaderRow) {
728
- const available = Math.max(drawHeight - paddingTop - paddingBottom, 0);
729
- const offset = Math.max((available - textHeight) / 2, 0);
730
- textY = rowTop2 + paddingTop + offset;
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
- if (borderAll) {
741
- const bottomY = rowTop2 + drawHeight;
742
- doc.save();
743
- doc.lineWidth(0.5);
744
- doc.strokeColor(layout.hLineColor ?? "#ccc");
745
- if (drawTopBorder) {
746
- doc.moveTo(x, rowTop2).lineTo(x + colW, rowTop2).stroke();
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 = table.body.slice(0, headerRows);
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 < table.body.length; 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,