av6-pdf-engine 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +41 -3
- package/dist/index.d.ts +41 -3
- package/dist/index.js +416 -83
- package/dist/index.mjs +415 -83
- package/package.json +1 -1
- package/tmp/border-showcase.pdf +0 -0
- package/tmp/quote-details.pdf +0 -0
package/dist/index.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
|
-
|
|
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
|
|
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 <
|
|
546
|
-
const row =
|
|
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
|
-
|
|
559
|
-
|
|
560
|
-
|
|
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
|
-
|
|
578
|
-
|
|
579
|
-
|
|
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
|
|
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 <
|
|
617
|
-
const row =
|
|
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
|
-
|
|
630
|
-
|
|
631
|
-
|
|
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
|
-
|
|
649
|
-
|
|
650
|
-
|
|
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(
|
|
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
|
-
|
|
674
|
-
|
|
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
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
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
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
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 =
|
|
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 <
|
|
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,
|