medusajs-documents-plugin 1.1.39 → 1.1.41

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.
@@ -7,13 +7,12 @@ exports.postProcessPdf = postProcessPdf;
7
7
  const pdf_lib_1 = require("pdf-lib");
8
8
  const qrcode_1 = __importDefault(require("qrcode"));
9
9
  /**
10
- * Post-processes PDF buffers to embed QR codes and clean up headers/footers.
11
- * (Note: Watermarks removed per user instruction)
10
+ * Post-processes PDF buffers to embed QR codes, payment links, and clean up Zoho footers.
12
11
  */
13
12
  async function postProcessPdf(pdfBuffer, options = {}) {
14
13
  try {
15
14
  const pdfDoc = await pdf_lib_1.PDFDocument.load(pdfBuffer, { ignoreEncryption: true });
16
- // 1. Generate & Embed QR Code if URL is provided
15
+ // 1. Generate QR Code image if URL is provided
17
16
  let qrImage = null;
18
17
  if (options.qrUrl) {
19
18
  try {
@@ -21,7 +20,7 @@ async function postProcessPdf(pdfBuffer, options = {}) {
21
20
  errorCorrectionLevel: "H",
22
21
  type: "png",
23
22
  margin: 1,
24
- width: 75,
23
+ width: 80,
25
24
  });
26
25
  qrImage = await pdfDoc.embedPng(qrBufferLib);
27
26
  }
@@ -30,26 +29,81 @@ async function postProcessPdf(pdfBuffer, options = {}) {
30
29
  }
31
30
  }
32
31
  const pages = pdfDoc.getPages();
33
- if (pages.length > 0 && qrImage) {
34
- const firstPage = pages[0];
35
- // Draw QR Code on top right
36
- firstPage.drawImage(qrImage, {
37
- x: firstPage.getWidth() - 105,
38
- y: 40,
39
- width: 65,
40
- height: 65,
41
- });
42
- }
43
- // 2. Obscure external footer (e.g. "Powered by Zoho Books") if requested
44
- if (options.obscureZohoFooter) {
45
- for (const page of pages) {
46
- page.drawRectangle({
47
- x: 0,
48
- y: 0,
49
- width: page.getWidth(),
50
- height: 35,
51
- color: (0, pdf_lib_1.rgb)(1, 1, 1),
32
+ if (pages.length > 0) {
33
+ const lastPage = pages[pages.length - 1];
34
+ // 1. Stamp QR Code on bottom right (above the divider line at 51 on the bottom right: y = 56, x = 502)
35
+ if (qrImage) {
36
+ lastPage.drawImage(qrImage, {
37
+ x: 502,
38
+ y: 56,
39
+ width: 46,
40
+ height: 46,
52
41
  });
42
+ // Label under QR code
43
+ try {
44
+ const fontBold = await pdfDoc.embedFont(pdf_lib_1.StandardFonts.HelveticaBold);
45
+ const isInv = options.isInvoice ?? (Boolean(options.paymentLink) || options.docType === "invoice");
46
+ const qrLabel = isInv ? "Scan to Pay Online" : options.docType === "receipt" ? "Scan to Verify" : "Scan to View";
47
+ lastPage.drawText(qrLabel, {
48
+ x: 488,
49
+ y: 47,
50
+ size: 5.5,
51
+ font: fontBold,
52
+ color: (0, pdf_lib_1.rgb)(0.3, 0.35, 0.4),
53
+ });
54
+ }
55
+ catch (_) { }
56
+ }
57
+ // 2. For invoices, stamp payment link block to the left of QR code (x = 340..495)
58
+ // without overlapping customer notes on the left (x < 320) or totals above (y > 170)
59
+ const isInvoice = options.isInvoice ?? (Boolean(options.paymentLink) || options.docType === "invoice");
60
+ if (isInvoice && options.paymentLink) {
61
+ try {
62
+ const fontBold = await pdfDoc.embedFont(pdf_lib_1.StandardFonts.HelveticaBold);
63
+ const fontRegular = await pdfDoc.embedFont(pdf_lib_1.StandardFonts.Helvetica);
64
+ const pLink = String(options.paymentLink).trim();
65
+ lastPage.drawText("Pay Online:", {
66
+ x: 340,
67
+ y: 92,
68
+ size: 7.5,
69
+ font: fontBold,
70
+ color: (0, pdf_lib_1.rgb)(0.12, 0.16, 0.22),
71
+ });
72
+ // Truncate or fit link within x = 340..495 (max width 155pt)
73
+ let displayLink = pLink;
74
+ if (pLink.length > 36) {
75
+ displayLink = pLink.slice(0, 34) + "…";
76
+ }
77
+ lastPage.drawText(displayLink, {
78
+ x: 340,
79
+ y: 81,
80
+ size: 6.8,
81
+ font: fontRegular,
82
+ color: (0, pdf_lib_1.rgb)(0.15, 0.39, 0.92),
83
+ });
84
+ lastPage.drawText("Scan QR code to pay instantly", {
85
+ x: 340,
86
+ y: 70,
87
+ size: 6.2,
88
+ font: fontRegular,
89
+ color: (0, pdf_lib_1.rgb)(0.4, 0.45, 0.5),
90
+ });
91
+ }
92
+ catch (stampErr) {
93
+ console.error("[postProcessPdf] Error stamping payment link:", stampErr);
94
+ }
95
+ }
96
+ // 3. Obscure only the Zoho footer badge on the bottom left (x: 35, y: 12, width: 220, height: 36)
97
+ if (options.obscureZohoFooter) {
98
+ for (const page of pages) {
99
+ page.drawRectangle({
100
+ x: 35,
101
+ y: 12,
102
+ width: 220,
103
+ height: 36,
104
+ color: (0, pdf_lib_1.rgb)(1, 1, 1),
105
+ });
106
+ }
53
107
  }
54
108
  }
55
109
  const modifiedPdfBytes = await pdfDoc.save();
@@ -61,4 +115,4 @@ async function postProcessPdf(pdfBuffer, options = {}) {
61
115
  }
62
116
  }
63
117
  exports.default = postProcessPdf;
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXBvc3QtcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3BkZi1wb3N0LXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVlBLHdDQXVEQztBQW5FRCxxQ0FBd0Q7QUFDeEQsb0RBQTRCO0FBTzVCOzs7R0FHRztBQUNJLEtBQUssVUFBVSxjQUFjLENBQ2xDLFNBQWlCLEVBQ2pCLFVBQThCLEVBQUU7SUFFaEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxxQkFBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTNFLGlEQUFpRDtRQUNqRCxJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUM7UUFDeEIsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sZ0JBQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtvQkFDdkQsb0JBQW9CLEVBQUUsR0FBRztvQkFDekIsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsTUFBTSxFQUFFLENBQUM7b0JBQ1QsS0FBSyxFQUFFLEVBQUU7aUJBQ1YsQ0FBQyxDQUFDO2dCQUNILE9BQU8sR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRSxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQiw0QkFBNEI7WUFDNUIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzNCLENBQUMsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLEdBQUcsR0FBRztnQkFDN0IsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsTUFBTSxFQUFFLEVBQUU7YUFDWCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQseUVBQXlFO1FBQ3pFLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDOUIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQztvQkFDakIsQ0FBQyxFQUFFLENBQUM7b0JBQ0osQ0FBQyxFQUFFLENBQUM7b0JBQ0osS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ3RCLE1BQU0sRUFBRSxFQUFFO29CQUNWLEtBQUssRUFBRSxJQUFBLGFBQUcsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDcEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQztRQUM3RSxPQUFPLFNBQVMsQ0FBQyxDQUFDLHNDQUFzQztJQUMxRCxDQUFDO0FBQ0gsQ0FBQztBQUVELGtCQUFlLGNBQWMsQ0FBQyJ9
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXBvc3QtcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3BkZi1wb3N0LXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWNBLHdDQWlIQztBQS9IRCxxQ0FBdUU7QUFDdkUsb0RBQTRCO0FBVTVCOztHQUVHO0FBQ0ksS0FBSyxVQUFVLGNBQWMsQ0FDbEMsU0FBaUIsRUFDakIsVUFBOEIsRUFBRTtJQUVoQyxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLHFCQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFM0UsK0NBQStDO1FBQy9DLElBQUksT0FBTyxHQUFRLElBQUksQ0FBQztRQUN4QixJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxnQkFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO29CQUN2RCxvQkFBb0IsRUFBRSxHQUFHO29CQUN6QixJQUFJLEVBQUUsS0FBSztvQkFDWCxNQUFNLEVBQUUsQ0FBQztvQkFDVCxLQUFLLEVBQUUsRUFBRTtpQkFDVixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV6Qyx1R0FBdUc7WUFDdkcsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtvQkFDMUIsQ0FBQyxFQUFFLEdBQUc7b0JBQ04sQ0FBQyxFQUFFLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLEVBQUU7b0JBQ1QsTUFBTSxFQUFFLEVBQUU7aUJBQ1gsQ0FBQyxDQUFDO2dCQUVILHNCQUFzQjtnQkFDdEIsSUFBSSxDQUFDO29CQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyx1QkFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNyRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDO29CQUNuRyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztvQkFDakgsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7d0JBQ3pCLENBQUMsRUFBRSxHQUFHO3dCQUNOLENBQUMsRUFBRSxFQUFFO3dCQUNMLElBQUksRUFBRSxHQUFHO3dCQUNULElBQUksRUFBRSxRQUFRO3dCQUNkLEtBQUssRUFBRSxJQUFBLGFBQUcsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQztxQkFDM0IsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUM7WUFDaEIsQ0FBQztZQUVELGtGQUFrRjtZQUNsRixxRkFBcUY7WUFDckYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQztZQUN2RyxJQUFJLFNBQVMsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQztvQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsdUJBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDckUsTUFBTSxXQUFXLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLHVCQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3BFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBRWpELFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFO3dCQUMvQixDQUFDLEVBQUUsR0FBRzt3QkFDTixDQUFDLEVBQUUsRUFBRTt3QkFDTCxJQUFJLEVBQUUsR0FBRzt3QkFDVCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxLQUFLLEVBQUUsSUFBQSxhQUFHLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7cUJBQzdCLENBQUMsQ0FBQztvQkFFSCw2REFBNkQ7b0JBQzdELElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztvQkFDeEIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO3dCQUN0QixXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUN6QyxDQUFDO29CQUNELFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFO3dCQUM3QixDQUFDLEVBQUUsR0FBRzt3QkFDTixDQUFDLEVBQUUsRUFBRTt3QkFDTCxJQUFJLEVBQUUsR0FBRzt3QkFDVCxJQUFJLEVBQUUsV0FBVzt3QkFDakIsS0FBSyxFQUFFLElBQUEsYUFBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO3FCQUM3QixDQUFDLENBQUM7b0JBRUgsUUFBUSxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsRUFBRTt3QkFDakQsQ0FBQyxFQUFFLEdBQUc7d0JBQ04sQ0FBQyxFQUFFLEVBQUU7d0JBQ0wsSUFBSSxFQUFFLEdBQUc7d0JBQ1QsSUFBSSxFQUFFLFdBQVc7d0JBQ2pCLEtBQUssRUFBRSxJQUFBLGFBQUcsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQztxQkFDM0IsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQztvQkFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztZQUNILENBQUM7WUFFRCxrR0FBa0c7WUFDbEcsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDOUIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQzt3QkFDakIsQ0FBQyxFQUFFLEVBQUU7d0JBQ0wsQ0FBQyxFQUFFLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLEdBQUc7d0JBQ1YsTUFBTSxFQUFFLEVBQUU7d0JBQ1YsS0FBSyxFQUFFLElBQUEsYUFBRyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUNwQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztRQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRSxPQUFPLElBQUksR0FBRyxDQUFDLENBQUM7UUFDN0UsT0FBTyxTQUFTLENBQUMsQ0FBQyxzQ0FBc0M7SUFDMUQsQ0FBQztBQUNILENBQUM7QUFFRCxrQkFBZSxjQUFjLENBQUMifQ==