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.mjs CHANGED
@@ -30,6 +30,11 @@ function toPdfEngineError(cause, fallback) {
30
30
  });
31
31
  }
32
32
 
33
+ // src/images/index.ts
34
+ var images = {
35
+ default: "data:image/png;base64,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"
36
+ };
37
+
33
38
  // src/renderer-engine/index.ts
34
39
  import fs from "fs";
35
40
  import PDFDocument from "pdfkit";
@@ -208,7 +213,7 @@ var drawRotatedImage = (doc, src, x, y, width, height, rotationDeg) => {
208
213
  doc.image(src, x, y, { width, height });
209
214
  doc.restore();
210
215
  };
211
- var processImageBlock = (doc, ctx, block, y, env, ensureSpaceFor) => {
216
+ var processImageBlock = (doc, ctx, block, y, env, ensureSpaceFor, defaultImage) => {
212
217
  const imgSource = block.src;
213
218
  const imgWidth = block.width ?? 80;
214
219
  const imgHeight = block.height ?? 50;
@@ -236,7 +241,18 @@ var processImageBlock = (doc, ctx, block, y, env, ensureSpaceFor) => {
236
241
  height: imgHeight
237
242
  });
238
243
  } catch (e) {
239
- console.warn("Failed to load image:", e);
244
+ if (defaultImage !== void 0) {
245
+ try {
246
+ doc.image(defaultImage, x, startY, {
247
+ width: imgWidth,
248
+ height: imgHeight
249
+ });
250
+ } catch {
251
+ console.warn("Failed to render default image fallback:", e);
252
+ }
253
+ } else {
254
+ console.warn("Failed to load image:", e);
255
+ }
240
256
  }
241
257
  const newY = startY + imgHeight + mb;
242
258
  if (y === null) ctx.currentY = newY;
@@ -533,17 +549,110 @@ var getPlacedCellWidth = (colWidths, startCol, colSpan) => {
533
549
  var getRowSpanGroupHeight = (rowHeights, rowIndex, rowSpan) => {
534
550
  return sum(rowHeights.slice(rowIndex, rowIndex + rowSpan));
535
551
  };
536
- var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) => {
552
+ var isTableBodyIterableEntry = (entry) => {
553
+ if (!entry || typeof entry !== "object") return false;
554
+ const row = entry;
555
+ return typeof row.isIterable === "boolean" && typeof row.iterableKey === "string" && Array.isArray(row.content);
556
+ };
557
+ var isTableCellInput = (rawBlock) => !("type" in rawBlock);
558
+ var toTableCell = (rawBlock) => {
559
+ if ("type" in rawBlock && rawBlock.type !== "text") {
560
+ return null;
561
+ }
562
+ const tableCellInput = isTableCellInput(rawBlock) ? rawBlock : void 0;
563
+ return {
564
+ text: rawBlock.text,
565
+ blocks: tableCellInput?.blocks,
566
+ italic: rawBlock.italic,
567
+ underline: rawBlock.underline,
568
+ link: rawBlock.link,
569
+ strike: rawBlock.strike,
570
+ bold: rawBlock.bold,
571
+ fontSize: rawBlock.fontSize,
572
+ font: rawBlock.font,
573
+ align: rawBlock.align,
574
+ color: rawBlock.color,
575
+ fillColor: tableCellInput?.fillColor,
576
+ style: rawBlock.style,
577
+ colSpan: tableCellInput?.colSpan,
578
+ rowSpan: tableCellInput?.rowSpan,
579
+ paddingTop: tableCellInput?.paddingTop,
580
+ paddingRight: tableCellInput?.paddingRight,
581
+ paddingBottom: tableCellInput?.paddingBottom,
582
+ paddingLeft: tableCellInput?.paddingLeft,
583
+ border: tableCellInput?.border
584
+ };
585
+ };
586
+ var resolvePathValue = (obj, dottedPath) => {
587
+ if (!obj || typeof obj !== "object") return void 0;
588
+ return dottedPath.split(".").reduce((acc, key) => {
589
+ if (!acc || typeof acc !== "object") return void 0;
590
+ return acc[key];
591
+ }, obj);
592
+ };
593
+ var interpolateCellText = (text, item, rowIndex) => {
594
+ return text.replace(/\{\{\s*([^}]+)\s*\}\}/g, (_match, tokenRaw) => {
595
+ const token = tokenRaw.trim();
596
+ if (!token) return "";
597
+ if (token === "index") return String(rowIndex + 1);
598
+ const normalizedPath = token.startsWith("item.") ? token.slice(5) : token;
599
+ const value = resolvePathValue(item, normalizedPath);
600
+ if (value === void 0 || value === null) return "";
601
+ return typeof value === "string" ? value : String(value);
602
+ });
603
+ };
604
+ var applyIterableData = (cell, item, rowIndex) => ({
605
+ ...cell,
606
+ text: cell.text !== void 0 ? interpolateCellText(cell.text, item, rowIndex) : void 0
607
+ });
608
+ var expandIterableRow = (table, bodyDef) => {
609
+ const templateRow = bodyDef.content.map(toTableCell).filter((cell) => cell !== null);
610
+ if (!templateRow.length) {
611
+ return [];
612
+ }
613
+ if (!bodyDef.isIterable) {
614
+ return [templateRow];
615
+ }
616
+ const iterableSource = table[bodyDef.iterableKey];
617
+ if (!Array.isArray(iterableSource) || !iterableSource.length) {
618
+ return [templateRow];
619
+ }
620
+ return iterableSource.map((item, rowIndex) => templateRow.map((cell) => applyIterableData(cell, item, rowIndex)));
621
+ };
622
+ var normalizeTableRows = (table) => {
623
+ if (!Array.isArray(table.body)) return [];
624
+ const rows = [];
625
+ for (const entry of table.body) {
626
+ if (Array.isArray(entry)) {
627
+ rows.push(entry);
628
+ continue;
629
+ }
630
+ if (isTableBodyIterableEntry(entry)) {
631
+ rows.push(...expandIterableRow(table, entry));
632
+ }
633
+ }
634
+ return rows;
635
+ };
636
+ var measureCellHeight = (doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn) => {
637
+ if (cell.blocks?.length && measureBlockHeightFn) {
638
+ const cellEnv = { marginLeft: 0, innerWidth: textWidth, allowPageBreak: false };
639
+ const contentH = cell.blocks.filter((b) => b.visible !== false).reduce((acc, b) => acc + measureBlockHeightFn(b, cellEnv), 0);
640
+ return contentH + paddingTop + paddingBottom;
641
+ }
642
+ return doc.heightOfString(cell.text ?? "", { width: textWidth }) + paddingTop + paddingBottom;
643
+ };
644
+ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2, measureBlockHeightFn) => {
537
645
  const localLeft = table.marginLeft ?? 0;
538
646
  const localRight = table.marginRight ?? 0;
539
647
  const width = Math.max(env.innerWidth - localLeft - localRight, 1);
648
+ const rows = normalizeTableRows(table);
540
649
  const totalCols = table.widths.length;
541
650
  const colWidths = computeColumnPixelWidths2(table.widths, width);
542
651
  const rowHeights = [];
543
652
  const activeRowSpans = Array(totalCols).fill(0);
544
653
  const placedRows = [];
545
- for (let rowIndex = 0; rowIndex < table.body.length; rowIndex++) {
546
- const row = table.body[rowIndex];
654
+ for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
655
+ const row = rows[rowIndex];
547
656
  const placedRow = buildPlacedRow(row, totalCols, activeRowSpans);
548
657
  placedRows.push(placedRow);
549
658
  let rowHeight = 12;
@@ -555,9 +664,11 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
555
664
  const paddingBottom = cell.paddingBottom ?? 2;
556
665
  const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
557
666
  const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
558
- doc.font(getCellFontName(cell));
559
- doc.fontSize(cell.fontSize ?? 10);
560
- const h = doc.heightOfString(cell.text, { width: textWidth }) + paddingTop + paddingBottom;
667
+ if (!cell.blocks?.length) {
668
+ doc.font(getCellFontName(cell));
669
+ doc.fontSize(cell.fontSize ?? 10);
670
+ }
671
+ const h = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
561
672
  rowHeight = Math.max(rowHeight, h);
562
673
  });
563
674
  rowHeights.push(rowHeight);
@@ -574,9 +685,11 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
574
685
  const paddingBottom = cell.paddingBottom ?? 2;
575
686
  const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
576
687
  const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
577
- doc.font(getCellFontName(cell));
578
- doc.fontSize(cell.fontSize ?? 10);
579
- const neededHeight = doc.heightOfString(cell.text, { width: textWidth }) + paddingTop + paddingBottom;
688
+ if (!cell.blocks?.length) {
689
+ doc.font(getCellFontName(cell));
690
+ doc.fontSize(cell.fontSize ?? 10);
691
+ }
692
+ const neededHeight = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
580
693
  const currentGroupHeight = getRowSpanGroupHeight(rowHeights, rowIndex, rowSpan);
581
694
  if (neededHeight > currentGroupHeight) {
582
695
  const deficit = neededHeight - currentGroupHeight;
@@ -591,7 +704,7 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
591
704
  totalHeight += table.marginBottom ?? 0;
592
705
  return totalHeight;
593
706
  };
594
- var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidths2, bottomLimitForContent, finishPage2) => {
707
+ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidths2, bottomLimitForContent, finishPage2, renderBlockFn, measureBlockHeightFn) => {
595
708
  const localLeft = table.marginLeft ?? 0;
596
709
  const localRight = table.marginRight ?? 0;
597
710
  const baseLeft = env.marginLeft + localLeft;
@@ -607,14 +720,14 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
607
720
  hLineColor: "#ccc",
608
721
  vLineColor: "#ccc"
609
722
  };
610
- const borderAll = layout.border !== "none";
611
723
  const headerRows = table.headerRows ?? 0;
612
- const buildPlacementAndHeights = (rows) => {
724
+ const rows = normalizeTableRows(table);
725
+ const buildPlacementAndHeights = (rows2) => {
613
726
  const placedRows = [];
614
727
  const rowHeights = [];
615
728
  const activeRowSpans = Array(totalCols).fill(0);
616
- for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
617
- const row = rows[rowIndex];
729
+ for (let rowIndex = 0; rowIndex < rows2.length; rowIndex++) {
730
+ const row = rows2[rowIndex];
618
731
  const placedRow = buildPlacedRow(row, totalCols, activeRowSpans);
619
732
  placedRows.push(placedRow);
620
733
  let rowHeight = 12;
@@ -626,9 +739,11 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
626
739
  const paddingBottom = cell.paddingBottom ?? 2;
627
740
  const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
628
741
  const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
629
- doc.font(getCellFontName(cell));
630
- doc.fontSize(cell.fontSize ?? 10);
631
- const h = doc.heightOfString(cell.text, { width: textWidth }) + paddingTop + paddingBottom;
742
+ if (!cell.blocks?.length) {
743
+ doc.font(getCellFontName(cell));
744
+ doc.fontSize(cell.fontSize ?? 10);
745
+ }
746
+ const h = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
632
747
  rowHeight = Math.max(rowHeight, h);
633
748
  });
634
749
  rowHeights.push(rowHeight);
@@ -645,9 +760,11 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
645
760
  const paddingBottom = cell.paddingBottom ?? 2;
646
761
  const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
647
762
  const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
648
- doc.font(getCellFontName(cell));
649
- doc.fontSize(cell.fontSize ?? 10);
650
- const neededHeight = doc.heightOfString(cell.text, { width: textWidth }) + paddingTop + paddingBottom;
763
+ if (!cell.blocks?.length) {
764
+ doc.font(getCellFontName(cell));
765
+ doc.fontSize(cell.fontSize ?? 10);
766
+ }
767
+ const neededHeight = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
651
768
  const currentGroupHeight = getRowSpanGroupHeight(rowHeights, rowIndex, rowSpan);
652
769
  if (neededHeight > currentGroupHeight) {
653
770
  const deficit = neededHeight - currentGroupHeight;
@@ -657,7 +774,7 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
657
774
  }
658
775
  return { placedRows, rowHeights };
659
776
  };
660
- const allLayout = buildPlacementAndHeights(table.body);
777
+ const allLayout = buildPlacementAndHeights(rows);
661
778
  const drawPlacedRow = (placedRow, rowTop2, rowHeight, rowIndex, rowHeights, isHeaderRow, drawTopBorder) => {
662
779
  placedRow.forEach(({ cell: rawCell, startCol, colSpan, rowSpan }) => {
663
780
  const cell = resolveTableCell(styles, rawCell);
@@ -670,51 +787,64 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
670
787
  const paddingTop = cell.paddingTop ?? 2;
671
788
  const paddingBottom = cell.paddingBottom ?? 2;
672
789
  doc.save();
673
- if (cell.fillColor) {
674
- doc.rect(x, rowTop2, colW, drawHeight).fillOpacity(1).fill(cell.fillColor);
790
+ const columnStyle = table.layout?.columnStyles?.[startCol];
791
+ const rowStyle = table.layout?.rowStyles?.[rowIndex];
792
+ const fillColor = cell.fillColor ?? rowStyle?.fillColor ?? columnStyle?.fillColor;
793
+ if (fillColor) {
794
+ doc.rect(x, rowTop2, colW, drawHeight).fillOpacity(1).fill(fillColor);
675
795
  doc.fillOpacity(1);
676
796
  }
677
- doc.font(getCellFontName(cell));
678
- doc.fontSize(fontSize);
679
- doc.fillColor(cell.color ?? "black");
680
- const align = cell.align ?? "left";
681
797
  const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
682
- const textHeight = doc.heightOfString(cell.text, { width: textWidth });
683
- let textY = rowTop2 + paddingTop;
684
- if (isHeaderRow) {
685
- const available = Math.max(drawHeight - paddingTop - paddingBottom, 0);
686
- const offset = Math.max((available - textHeight) / 2, 0);
687
- textY = rowTop2 + paddingTop + offset;
798
+ const textY = rowTop2 + paddingTop;
799
+ if (cell.blocks?.length && renderBlockFn) {
800
+ const cellEnv = {
801
+ marginLeft: x + paddingLeft,
802
+ innerWidth: textWidth,
803
+ allowPageBreak: false
804
+ };
805
+ const savedY = ctx.currentY;
806
+ let contentY = textY;
807
+ for (const block of cell.blocks) {
808
+ if (!block || block.visible === false) continue;
809
+ if (block.type === "signature" || block.type === "pageBreak") continue;
810
+ contentY = renderBlockFn(block, contentY, cellEnv);
811
+ }
812
+ ctx.currentY = savedY;
813
+ } else {
814
+ doc.font(getCellFontName(cell));
815
+ doc.fontSize(fontSize);
816
+ doc.fillColor(cell.color ?? "black");
817
+ const align = cell.align ?? "left";
818
+ const textHeight = doc.heightOfString(cell.text ?? "", { width: textWidth });
819
+ let paintY = textY;
820
+ if (isHeaderRow) {
821
+ const available = Math.max(drawHeight - paddingTop - paddingBottom, 0);
822
+ const offset = Math.max((available - textHeight) / 2, 0);
823
+ paintY = rowTop2 + paddingTop + offset;
824
+ }
825
+ doc.text(cell.text ?? "", x + paddingLeft, paintY, {
826
+ width: textWidth,
827
+ align,
828
+ underline: !!cell.underline,
829
+ strike: !!cell.strike,
830
+ link: cell.link
831
+ });
688
832
  }
689
- doc.text(cell.text, x + paddingLeft, textY, {
690
- width: textWidth,
691
- align,
692
- underline: !!cell.underline,
693
- strike: !!cell.strike,
694
- link: cell.link
695
- });
696
833
  doc.restore();
697
- if (borderAll) {
698
- const bottomY = rowTop2 + drawHeight;
699
- doc.save();
700
- doc.lineWidth(0.5);
701
- doc.strokeColor(layout.hLineColor ?? "#ccc");
702
- if (drawTopBorder) {
703
- doc.moveTo(x, rowTop2).lineTo(x + colW, rowTop2).stroke();
704
- }
705
- doc.moveTo(x, bottomY).lineTo(x + colW, bottomY).stroke();
706
- doc.restore();
707
- doc.save();
708
- doc.lineWidth(0.5);
709
- doc.strokeColor(layout.vLineColor ?? "#ccc");
710
- doc.moveTo(x, rowTop2).lineTo(x, bottomY).stroke();
711
- doc.moveTo(x + colW, rowTop2).lineTo(x + colW, bottomY).stroke();
712
- doc.restore();
834
+ const effectiveBorder = getEffectiveCellBorder({
835
+ table,
836
+ cell,
837
+ rowIndex,
838
+ startCol
839
+ });
840
+ if (!drawTopBorder) {
841
+ effectiveBorder.top.visible = false;
713
842
  }
843
+ drawCellBorder(doc, effectiveBorder, x, rowTop2, colW, drawHeight);
714
844
  });
715
845
  return rowTop2 + rowHeight;
716
846
  };
717
- const headerRowsSource = table.body.slice(0, headerRows);
847
+ const headerRowsSource = rows.slice(0, headerRows);
718
848
  const drawHeaderRowsOnNewPage = () => {
719
849
  if (!headerRows) return doc.page.margins.top + mt;
720
850
  const headerLayout = buildPlacementAndHeights(headerRowsSource);
@@ -733,7 +863,7 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
733
863
  return rowTop2;
734
864
  };
735
865
  let rowTop = startY;
736
- for (let rowIndex = 0; rowIndex < table.body.length; rowIndex++) {
866
+ for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
737
867
  const isHeaderRow = rowIndex < headerRows;
738
868
  const placedRow = allLayout.placedRows[rowIndex];
739
869
  const rowHeight = allLayout.rowHeights[rowIndex];
@@ -750,6 +880,123 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
750
880
  if (y === null) ctx.currentY = newY;
751
881
  return newY;
752
882
  };
883
+ var SIDES = ["top", "right", "bottom", "left"];
884
+ var DEFAULT_BORDER_COLOR = "#ccc";
885
+ var DEFAULT_BORDER_WIDTH = 0.5;
886
+ var isBorderStyleObject = (value) => {
887
+ return !!value && typeof value === "object" && !Array.isArray(value);
888
+ };
889
+ var normalizeOneSideBorder = (value, fallback) => {
890
+ if (value === void 0) return fallback;
891
+ if (typeof value === "boolean") {
892
+ return {
893
+ ...fallback,
894
+ visible: value
895
+ };
896
+ }
897
+ return {
898
+ visible: value.visible ?? fallback.visible,
899
+ color: value.color ?? fallback.color,
900
+ width: value.width ?? fallback.width,
901
+ dash: value.dash ?? fallback.dash
902
+ };
903
+ };
904
+ var normalizeCellBorder = (input, fallback) => {
905
+ if (input === void 0) return fallback;
906
+ if (typeof input === "boolean") {
907
+ return SIDES.reduce((acc, side) => {
908
+ acc[side] = {
909
+ ...fallback[side],
910
+ visible: input
911
+ };
912
+ return acc;
913
+ }, {});
914
+ }
915
+ if (isBorderStyleObject(input) && ("visible" in input || "color" in input || "width" in input || "dash" in input)) {
916
+ return SIDES.reduce((acc, side) => {
917
+ acc[side] = normalizeOneSideBorder(input, fallback[side]);
918
+ return acc;
919
+ }, {});
920
+ }
921
+ const sideInput = input;
922
+ return SIDES.reduce((acc, side) => {
923
+ acc[side] = normalizeOneSideBorder(sideInput[side], fallback[side]);
924
+ return acc;
925
+ }, {});
926
+ };
927
+ var createDefaultTableBorder = (layout) => {
928
+ const visible = layout?.border !== "none";
929
+ const hColor = layout?.hLineColor ?? layout?.borderColor ?? DEFAULT_BORDER_COLOR;
930
+ const vColor = layout?.vLineColor ?? layout?.borderColor ?? DEFAULT_BORDER_COLOR;
931
+ const width = layout?.borderWidth ?? DEFAULT_BORDER_WIDTH;
932
+ return {
933
+ top: {
934
+ visible,
935
+ color: hColor,
936
+ width,
937
+ dash: layout?.borderDash
938
+ },
939
+ bottom: {
940
+ visible,
941
+ color: hColor,
942
+ width,
943
+ dash: layout?.borderDash
944
+ },
945
+ left: {
946
+ visible,
947
+ color: vColor,
948
+ width,
949
+ dash: layout?.borderDash
950
+ },
951
+ right: {
952
+ visible,
953
+ color: vColor,
954
+ width,
955
+ dash: layout?.borderDash
956
+ }
957
+ };
958
+ };
959
+ var getEffectiveCellBorder = (args) => {
960
+ const { table, cell, rowIndex, startCol } = args;
961
+ const tableBorder = createDefaultTableBorder(table.layout);
962
+ const columnBorder = normalizeCellBorder(table.layout?.columnStyles?.[startCol]?.border, tableBorder);
963
+ const rowBorder = normalizeCellBorder(table.layout?.rowStyles?.[rowIndex]?.border, columnBorder);
964
+ return normalizeCellBorder(cell.border, rowBorder);
965
+ };
966
+ var drawBorderSide = (doc, side, border, x, y, width, height) => {
967
+ if (!border.visible || border.width <= 0) return;
968
+ doc.save();
969
+ doc.lineWidth(border.width);
970
+ doc.strokeColor(border.color);
971
+ if (border.dash?.length) {
972
+ doc.dash(border.dash[0], {
973
+ space: border.dash[1] ?? border.dash[0]
974
+ });
975
+ } else {
976
+ doc.undash();
977
+ }
978
+ switch (side) {
979
+ case "top":
980
+ doc.moveTo(x, y).lineTo(x + width, y).stroke();
981
+ break;
982
+ case "right":
983
+ doc.moveTo(x + width, y).lineTo(x + width, y + height).stroke();
984
+ break;
985
+ case "bottom":
986
+ doc.moveTo(x, y + height).lineTo(x + width, y + height).stroke();
987
+ break;
988
+ case "left":
989
+ doc.moveTo(x, y).lineTo(x, y + height).stroke();
990
+ break;
991
+ }
992
+ doc.restore();
993
+ };
994
+ var drawCellBorder = (doc, border, x, y, width, height) => {
995
+ drawBorderSide(doc, "top", border.top, x, y, width, height);
996
+ drawBorderSide(doc, "right", border.right, x, y, width, height);
997
+ drawBorderSide(doc, "bottom", border.bottom, x, y, width, height);
998
+ drawBorderSide(doc, "left", border.left, x, y, width, height);
999
+ };
753
1000
 
754
1001
  // src/renderer-engine/blocks/text.ts
755
1002
  var processTextBlock = (doc, ctx, styles, block, y, env, ensureSpaceFor) => {
@@ -793,7 +1040,7 @@ var processTextBlock = (doc, ctx, styles, block, y, env, ensureSpaceFor) => {
793
1040
 
794
1041
  // src/renderer-engine/utils/block-renderer.ts
795
1042
  function createBlockRenderer(deps) {
796
- const { doc, ctx, styles, computeColumnPixelWidths: computeColumnPixelWidths2, finishPage: finishPage2, processSignatureBlock } = deps;
1043
+ const { doc, ctx, styles, computeColumnPixelWidths: computeColumnPixelWidths2, finishPage: finishPage2, processSignatureBlock, defaultImage } = deps;
797
1044
  const bottomLimitForContent = createBottomLimitForContent(doc, ctx);
798
1045
  const ensureSpaceFor = createEnsureSpaceFor(ctx, bottomLimitForContent, finishPage2);
799
1046
  const measureBlockHeight = createMeasureBlockHeight({
@@ -805,11 +1052,31 @@ function createBlockRenderer(deps) {
805
1052
  if (block.visible === false) {
806
1053
  return y ?? ctx.currentY;
807
1054
  }
1055
+ if ((block.backgroundColor || block.backgroundImage) && block.type !== "pageBreak" && block.type !== "signature") {
1056
+ const startY = y ?? ctx.currentY;
1057
+ const blockHeight = measureBlockHeight(block, env);
1058
+ const opacity = block.backgroundOpacity ?? 1;
1059
+ doc.save();
1060
+ if (block.backgroundColor) {
1061
+ doc.fillOpacity(opacity).rect(env.marginLeft, startY, env.innerWidth, blockHeight).fill(block.backgroundColor);
1062
+ doc.fillOpacity(1);
1063
+ }
1064
+ if (block.backgroundImage) {
1065
+ try {
1066
+ doc.image(block.backgroundImage, env.marginLeft, startY, {
1067
+ width: env.innerWidth,
1068
+ height: blockHeight
1069
+ });
1070
+ } catch (_) {
1071
+ }
1072
+ }
1073
+ doc.restore();
1074
+ }
808
1075
  switch (block.type) {
809
1076
  case "text":
810
1077
  return processTextBlock(doc, ctx, styles, block, y, env, ensureSpaceFor);
811
1078
  case "image":
812
- return processImageBlock(doc, ctx, block, y, env, ensureSpaceFor);
1079
+ return processImageBlock(doc, ctx, block, y, env, ensureSpaceFor, defaultImage);
813
1080
  case "qr": {
814
1081
  const qb = block;
815
1082
  const imageLike = {
@@ -823,7 +1090,7 @@ function createBlockRenderer(deps) {
823
1090
  marginLeft: qb.marginLeft,
824
1091
  marginRight: qb.marginRight
825
1092
  };
826
- return processImageBlock(doc, ctx, imageLike, y, env, ensureSpaceFor);
1093
+ return processImageBlock(doc, ctx, imageLike, y, env, ensureSpaceFor, defaultImage);
827
1094
  }
828
1095
  case "barcode":
829
1096
  return processBarcodeBlock(doc, ctx, block, y, env, ensureSpaceFor);
@@ -839,7 +1106,9 @@ function createBlockRenderer(deps) {
839
1106
  env,
840
1107
  computeColumnPixelWidths2,
841
1108
  bottomLimitForContent,
842
- finishPage2
1109
+ finishPage2,
1110
+ (b, blockY, blockEnv) => renderBlock(b, blockY, blockEnv),
1111
+ measureBlockHeight
843
1112
  );
844
1113
  case "columns":
845
1114
  return processColumnsBlock(
@@ -1082,14 +1351,24 @@ function drawHeader(doc, def, headerBandHeight, header, renderBlockArray) {
1082
1351
 
1083
1352
  // src/renderer-engine/utils/image-loader.ts
1084
1353
  import axios from "axios";
1085
- async function normalizeImageSrc(src) {
1086
- if (!src) return src;
1354
+ async function normalizeImageSrc(src, fallback) {
1355
+ if (!src) return fallback ?? src;
1087
1356
  if (Buffer.isBuffer(src)) return src;
1357
+ if (src.startsWith("data:")) {
1358
+ const commaIdx = src.indexOf(",");
1359
+ if (commaIdx !== -1) {
1360
+ return Buffer.from(src.slice(commaIdx + 1), "base64");
1361
+ }
1362
+ }
1088
1363
  if (src.startsWith("http://") || src.startsWith("https://")) {
1089
1364
  try {
1090
1365
  const res = await axios.get(src, { responseType: "arraybuffer" });
1091
1366
  return Buffer.from(res.data);
1092
1367
  } catch (e) {
1368
+ if (fallback !== void 0) {
1369
+ console.warn(`Failed to fetch remote image "${src}", using default image.`);
1370
+ return fallback;
1371
+ }
1093
1372
  throw toPdfEngineError(e, {
1094
1373
  code: "PDF_ERROR_IMAGE_FETCH_FAILED" /* PDF_ERROR_IMAGE_FETCH_FAILED */,
1095
1374
  message: "Failed to fetch remote image for PDF.",
@@ -1101,23 +1380,47 @@ async function normalizeImageSrc(src) {
1101
1380
  }
1102
1381
  return src;
1103
1382
  }
1104
- async function materializeImagesInBlocks(blocks) {
1383
+ async function materializeImagesInBlocks(blocks, fallback) {
1105
1384
  const out = [];
1106
1385
  for (const block of blocks) {
1386
+ const blockAny = block;
1387
+ if (blockAny.backgroundImage) {
1388
+ blockAny.backgroundImage = await normalizeImageSrc(blockAny.backgroundImage, fallback);
1389
+ }
1107
1390
  if (block.type === "image") {
1108
1391
  const img = { ...block };
1109
- img.src = await normalizeImageSrc(img.src);
1392
+ img.src = await normalizeImageSrc(img.src, fallback);
1110
1393
  out.push(img);
1111
1394
  } else if (block.type === "columns") {
1112
1395
  out.push({
1113
1396
  ...block,
1114
- columns: await Promise.all(block.columns.map((col) => materializeImagesInBlocks(col)))
1397
+ columns: await Promise.all(block.columns.map((col) => materializeImagesInBlocks(col, fallback)))
1115
1398
  });
1116
1399
  } else if (block.type === "signature" && block.blocks) {
1117
1400
  out.push({
1118
1401
  ...block,
1119
- blocks: await materializeImagesInBlocks(block.blocks)
1402
+ blocks: await materializeImagesInBlocks(block.blocks, fallback)
1120
1403
  });
1404
+ } else if (block.type === "table") {
1405
+ const tb = block;
1406
+ const newBody = await Promise.all(
1407
+ tb.body.map(
1408
+ async (entry) => {
1409
+ const materializeCell = async (cell) => {
1410
+ if (!cell.blocks?.length) return cell;
1411
+ return { ...cell, blocks: await materializeImagesInBlocks(cell.blocks, fallback) };
1412
+ };
1413
+ if (Array.isArray(entry)) {
1414
+ return await Promise.all(entry.map(materializeCell));
1415
+ }
1416
+ if (entry && typeof entry === "object" && "content" in entry && Array.isArray(entry.content)) {
1417
+ return { ...entry, content: await Promise.all(entry.content.map(materializeCell)) };
1418
+ }
1419
+ return entry;
1420
+ }
1421
+ )
1422
+ );
1423
+ out.push({ ...tb, body: newBody });
1121
1424
  } else {
1122
1425
  out.push(block);
1123
1426
  }
@@ -1271,7 +1574,7 @@ function createMeasureBlockHeight(deps) {
1271
1574
  innerWidth,
1272
1575
  allowPageBreak: false
1273
1576
  };
1274
- const h = measureTableHeight(doc, b, fakeEnv, styles, computeColumnPixelWidths2);
1577
+ const h = measureTableHeight(doc, b, fakeEnv, styles, computeColumnPixelWidths2, measure);
1275
1578
  return mt + h + mb;
1276
1579
  };
1277
1580
  const measureColumns = (b, env) => {
@@ -1585,6 +1888,26 @@ async function materializeQrAndBarcodesInBlocks(blocks) {
1585
1888
  bb.src = buf;
1586
1889
  }
1587
1890
  out.push(bb);
1891
+ } else if (block.type === "table") {
1892
+ const tb = block;
1893
+ const newBody = await Promise.all(
1894
+ tb.body.map(
1895
+ async (entry) => {
1896
+ const materializeCell = async (cell) => {
1897
+ if (!cell.blocks?.length) return cell;
1898
+ return { ...cell, blocks: await materializeQrAndBarcodesInBlocks(cell.blocks) };
1899
+ };
1900
+ if (Array.isArray(entry)) {
1901
+ return await Promise.all(entry.map(materializeCell));
1902
+ }
1903
+ if (entry && typeof entry === "object" && "content" in entry && Array.isArray(entry.content)) {
1904
+ return { ...entry, content: await Promise.all(entry.content.map(materializeCell)) };
1905
+ }
1906
+ return entry;
1907
+ }
1908
+ )
1909
+ );
1910
+ out.push({ ...tb, body: newBody });
1588
1911
  } else {
1589
1912
  out.push(block);
1590
1913
  }
@@ -1840,23 +2163,28 @@ function drawWatermarkForPage(doc, watermark, pageNumber, isLast) {
1840
2163
  }
1841
2164
 
1842
2165
  // src/renderer-engine/index.ts
2166
+ var BUILT_IN_DEFAULT_IMAGE = Buffer.from(
2167
+ images.default.slice(images.default.indexOf(",") + 1),
2168
+ "base64"
2169
+ );
1843
2170
  async function renderCustomPdf(def, outputPath) {
2171
+ const fallbackImage = def.defaultImage ?? BUILT_IN_DEFAULT_IMAGE;
1844
2172
  if (def.header) {
1845
2173
  def.header.blocks = await materializeQrAndBarcodesInBlocks(def.header.blocks);
1846
- def.header.blocks = await materializeImagesInBlocks(def.header.blocks);
2174
+ def.header.blocks = await materializeImagesInBlocks(def.header.blocks, fallbackImage);
1847
2175
  }
1848
2176
  def.content = await materializeQrAndBarcodesInBlocks(def.content);
1849
- def.content = await materializeImagesInBlocks(def.content);
2177
+ def.content = await materializeImagesInBlocks(def.content, fallbackImage);
1850
2178
  if (def.pageBackground?.src) {
1851
- def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src);
2179
+ def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src, fallbackImage);
1852
2180
  }
1853
2181
  if (def.header?.backgroundImage) {
1854
- def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage);
2182
+ def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage, fallbackImage);
1855
2183
  }
1856
2184
  if (def.footer && typeof def.footer !== "function") {
1857
2185
  const footer = def.footer;
1858
2186
  if (footer.backgroundImage) {
1859
- footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage);
2187
+ footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage, fallbackImage);
1860
2188
  }
1861
2189
  }
1862
2190
  return new Promise((resolve, reject) => {
@@ -1907,7 +2235,8 @@ async function renderCustomPdf(def, outputPath) {
1907
2235
  styles,
1908
2236
  computeColumnPixelWidths,
1909
2237
  finishPage: finishPage2,
1910
- processSignatureBlock
2238
+ processSignatureBlock,
2239
+ defaultImage: fallbackImage
1911
2240
  });
1912
2241
  const startNewPageLayout = createStartNewPageLayout({
1913
2242
  doc,
@@ -1946,22 +2275,23 @@ async function renderCustomPdf(def, outputPath) {
1946
2275
  });
1947
2276
  }
1948
2277
  async function renderCustomPdfToBuffer(def) {
2278
+ const fallbackImage = def.defaultImage ?? BUILT_IN_DEFAULT_IMAGE;
1949
2279
  if (def.header) {
1950
2280
  def.header.blocks = await materializeQrAndBarcodesInBlocks(def.header.blocks);
1951
- def.header.blocks = await materializeImagesInBlocks(def.header.blocks);
2281
+ def.header.blocks = await materializeImagesInBlocks(def.header.blocks, fallbackImage);
1952
2282
  }
1953
2283
  def.content = await materializeQrAndBarcodesInBlocks(def.content);
1954
- def.content = await materializeImagesInBlocks(def.content);
2284
+ def.content = await materializeImagesInBlocks(def.content, fallbackImage);
1955
2285
  if (def.pageBackground?.src) {
1956
- def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src);
2286
+ def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src, fallbackImage);
1957
2287
  }
1958
2288
  if (def.header?.backgroundImage) {
1959
- def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage);
2289
+ def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage, fallbackImage);
1960
2290
  }
1961
2291
  if (def.footer && typeof def.footer !== "function") {
1962
2292
  const footer = def.footer;
1963
2293
  if (footer.backgroundImage) {
1964
- footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage);
2294
+ footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage, fallbackImage);
1965
2295
  }
1966
2296
  }
1967
2297
  return new Promise((resolve, reject) => {
@@ -2027,7 +2357,8 @@ async function renderCustomPdfToBuffer(def) {
2027
2357
  styles,
2028
2358
  computeColumnPixelWidths,
2029
2359
  finishPage: finishPage2,
2030
- processSignatureBlock
2360
+ processSignatureBlock,
2361
+ defaultImage: fallbackImage
2031
2362
  });
2032
2363
  const startNewPageLayout = createStartNewPageLayout({
2033
2364
  doc,
@@ -2057,6 +2388,7 @@ export {
2057
2388
  PdfEngineError,
2058
2389
  PdfEngineErrorCode,
2059
2390
  QR_ERROR_LEVEL,
2391
+ images,
2060
2392
  isPdfEngineError,
2061
2393
  renderCustomPdf,
2062
2394
  renderCustomPdfToBuffer,