NodeJs导出PDF

这篇具有很好参考价值的文章主要介绍了NodeJs导出PDF。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(优于别人,并不高贵,真正的高贵应该是优于过去的自己。——海明威)

NodeJs导出PDF,pdf

场景

根据订单参数生成账单PDF

结果

NodeJs导出PDF,pdf文章来源地址https://www.toymoban.com/news/detail-669636.html

示例代码
/* eslint-disable no-unused-vars */
/* eslint-disable no-undef */
/* eslint-disable complexity */
const PDFDocument = require('pdfkit');
const fs = require('fs');
const dayjs = require('dayjs');
const AgencyWithdrawOrderStatus = {
    Completed: 'Completed',
    Submitted: 'Submitted',
    Rejected: 'Rejected',
}
const agencyName = 'Jasin';
const agencyEmail = 'pdfkit@dev.com';
const order = {
    "id": "FI-AWO-20230718-8657637839",
    "accountID": {
        "id": "ID-AGE-20230707-6351711990",
        "type": "AGENCY"
    },
    "transactionNo": "FIAWO202307180650601146",
    "referenceID": "",
    "transferWay": "Bank card",
    "walletID": "FI-WAL-20230707-5401898911",
    "transferID": "FI-TRF-20230718-4134849682",
    "transactionID": "FI-TRA-20230718-2048728248",
    "somoServiceFee": 345,
    "somoServiceFeeRate": 0.05,
    "bankTransferFee": 3000,
    "bankTransferFeeRate": 3000,
    "paypalTransferFee": 345,
    "paypalTransferFeeRate": 0.05,
    "paypalRemittanceAmount": 6555,
    "bankRemittanceAmount": 6900,
    "totalAmount": 6900,
    "status": "Submitted",
    "transactionList": [{
        "brandName": "asdasdads",
        "transactionID": "FI-TRA-20230710-1494352833",
        "brandID": "ID-BRA-20230627-2309656536",
        "campaignID": "AC-CAM-20230710-3827733853",
        "campaignTitle": "Jack",
        "orderID": "AC-ORD-20230710-2795223591",
        "type": "AGENCY_CAMPAIGN_ORDER_PAYMENT",
        "amount": 6900,
        "somoServiceFee": 345,
        "paypalTransferFee": 345,
        "bankTransferFee": 0
    }, {
        "brandName": "asdasdads",
        "transactionID": "FI-TRA-20230710-5284753385",
        "brandID": "ID-BRA-20230627-2309656536",
        "campaignID": "AC-CAM-20230710-4072616238",
        "campaignTitle": "Kami",
        "orderID": "AC-ORD-20230710-7402268061",
        "type": "AGENCY_CAMPAIGN_ORDER_PAYMENT",
        "amount": 0,
        "somoServiceFee": 0,
        "paypalTransferFee": 0,
        "bankTransferFee": 0
    }],
    "transactionCount": 2,
    "accountBalance": 888750099,
    "withdrawalMethod": {
        "bankEnabled": true,
        "bankAccountName": "12213",
        "bankAccountNumber": "22",
        "bankName": "333",
        "bankAddress": "444",
        "bankSwiftCode": "555"
    },
    "reason": "",
    "createdAt": {
        "$date": "2023-07-18T09:53:45.568Z"
    },
    "updatedAt": {
        "$date": "2023-07-18T09:53:45.568Z"
    },
    "__v": 0
};
const method = async () => {
    const pdfBuffer = await new Promise((resolve) => {
        // 实例化PDF对象
        const doc = new PDFDocument({ size: 'A4' });
        const fontSize = 14;
        const remittanceText = 'Remittance amount:';
        const remittanceTitleColor = '#8792A2';
        const remittanceAmountColor = '#181C1F';
        const remittanceAmountSize = 40;
        const orderStatusText = order.status;
        const orderStatusColor = {
            Submitted: '#4E515C',
            Completed: '#009944',
            Rejected: '#FF0000',
        }[orderStatusText];
        const orderStatusBackColor = {
            Submitted: '#f2f4f9',
            Completed: '#d8f7e6',
            Rejected: '#f0dede',
        }[orderStatusText];
        const orderStatusOffset = {
            Submitted: -6,
            Completed: -8,
            Rejected: 0,
        }[orderStatusText];
        const getFloatNumber = (number) => {
            return parseFloat(number.toString()).toFixed(2);
        };
        const getConvertAmount = (number) => {
            return number / 100;
        };
        const rejectedOffset = order.status === 'Rejected' ? 45 : 0;
        const remittanceAmount = order.withdrawalMethod.paypalEnabled
            ? order.paypalRemittanceAmount
            : order.bankRemittanceAmount;
        const transferFee = order.withdrawalMethod.paypalEnabled
            ? order.paypalTransferFee
            : order.bankTransferFee;
        const remittanceAmountLength = getFloatNumber(
            getConvertAmount(remittanceAmount),
        ).length;
        const remittanceAmoutOffset =
            remittanceAmountLength - 4 > 0 ? remittanceAmountLength - 4 : 0;
        const transferAccount =
            (order.withdrawalMethod.paypalEnabled
                ? order.withdrawalMethod.paypalAccountID
                : order.withdrawalMethod.bankAccountName) ?? ' ';
        const transferDetailTitleColor = '#F2F3F7';
        const transferDetailTitleSize = 16;
        const transferDetailBackgroundColor = '#171A1F';
        const transferDetailTitleText = 'Transfer detail:';

        const orderStatusX = 100;
        const orderStatusY = 105;
        const startX = 73;
        const transferDetailRectY = 150;
        const transferDetailX = 80;
        const transferDetailY = 168;
        const transferDetailWidth = 500;
        const transferDetailHeight = 60;

        const sideWidth = 500;
        const sideHeight = 1;

        const valueColor = '#272A33';
        const linceColor = '#F5F7F7';

        doc.
            // 使用字体
            font(`${__dirname}/Montserrat-Bold.ttf`).
            // 字体大小
            fontSize(fontSize).
            // 字体颜色
            fillColor(remittanceTitleColor).
            // 这一行的文本
            text(remittanceText).
            fontSize(remittanceAmountSize).
            fillColor(remittanceAmountColor).
            text(`$ ${getFloatNumber(getConvertAmount(remittanceAmount))}`).

            // 渲染块,指定x,y坐标以及宽高
            rect(
                orderStatusX + 112 + remittanceAmoutOffset * 23,
                orderStatusY - 8,
                92,
                34,
            ).
            // 块的颜色
            fill(orderStatusBackColor).
            // 块的字体大小
            fontSize(fontSize).
            // 字体的颜色
            fillColor(orderStatusColor).
            font(`${__dirname}/Montserrat-Regular.ttf`).
            // 指定x,y坐标
            text(
                orderStatusText,
                orderStatusX +
                16 +
                112 +
                orderStatusOffset +
                remittanceAmoutOffset * 23,
                orderStatusY,
            );
        if (orderStatusText === AgencyWithdrawOrderStatus.Rejected) {
            doc.
                rect(startX, transferDetailRectY, 469, 30).
                fill('#FFE58F').
                // 插入图片
                image(
                    'withdraw.pdf.rejected.png',
                    startX + 10,
                    transferDetailRectY + 5,
                    { width: 20, height: 20 },
                ).
                fontSize(12).
                fillColor('#000000').
                text(` ${order.reason}`, startX + 35, transferDetailRectY + 6.5);
        }
        doc.
            rect(
                startX,
                transferDetailRectY + rejectedOffset,
                transferDetailWidth,
                transferDetailHeight,
            ).
            fill(transferDetailTitleColor).
            fontSize(transferDetailTitleSize).
            fillColor(transferDetailBackgroundColor).
            font(`${__dirname}/Montserrat-Bold.ttf`).
            text(
                transferDetailTitleText,
                transferDetailX,
                transferDetailY + rejectedOffset,
                {
                    continued: false,
                    baseline: 'top',
                },
            ).

            font(`${__dirname}/Montserrat-Regular.ttf`).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text(
                'Agency:',
                startX,
                transferDetailRectY + transferDetailHeight + 20 + rejectedOffset,
                { lineBreak: false },
            ).
            fillColor(valueColor).

            text(agencyName, startX + 200, doc.y, { lineGap: 5 }).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).

            text(`Email:`, startX, doc.y, { lineBreak: false, lineGap: 5 }).
            fillColor(valueColor).

            text(agencyEmail, startX + 200, doc.y, { lineGap: 5 }).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Transaction No. :', startX, doc.y, { lineBreak: false }).
            fillColor(valueColor).
            text(order.transactionNo, startX + 200, doc.y, { lineGap: 5 }).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Reference ID. :', startX, doc.y, { lineBreak: false }).
            fillColor(valueColor).
            text(order.referenceID || ' ', startX + 200, doc.y, { lineGap: 5 }).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Transfer way:', startX, doc.y, { lineBreak: false }).
            fillColor(valueColor).
            text(order.transferWay, startX + 200, doc.y, { lineGap: 5 }).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Transfer account:', startX, doc.y, { lineBreak: false }).
            fillColor(valueColor).
            text(transferAccount, startX + 200, doc.y, { lineGap: 5 }).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Transfer status:', startX, doc.y, { lineBreak: false }).
            fillColor(valueColor).
            text(orderStatusText, startX + 200, doc.y, { lineGap: 5 }).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Created time:', startX, doc.y, { lineBreak: false }).
            fillColor(valueColor).
            text(
                dayjs(order.createdAt.valueOf()).format('YYYY-MM-DD HH:mm:ss'),
                startX + 200,
                doc.y,
                { lineGap: 5 },
            ).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Update time:', startX, doc.y, { lineBreak: false }).
            fillColor(valueColor).
            text(
                dayjs(order.updatedAt.valueOf()).format('YYYY-MM-DD HH:mm:ss'),
                startX + 200,
                doc.y,
                { lineGap: 5 },
            ).
            rect(startX, doc.y + 10, sideWidth, sideHeight).
            fill(linceColor).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Order total amount:', startX, doc.y + 20, { lineBreak: false }).
            fillColor(valueColor).
            text(
                `$ ${getFloatNumber(getConvertAmount(order.totalAmount))}`,
                startX + 200,
                doc.y,
                {
                    lineGap: 5,
                },
            ).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('SOMO service fee:', startX, doc.y, {
                lineBreak: false,
            }).
            fillColor(remittanceTitleColor).
            text(
                `$ ${getFloatNumber(getConvertAmount(order.somoServiceFee))}`,
                startX + 200,
                doc.y,
                {
                    lineGap: 5,
                    strike: true,
                },
            ).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Transfer fee:', startX, doc.y, { lineBreak: false }).
            fillColor(valueColor).
            text(
                `$ ${getFloatNumber(getConvertAmount(transferFee))}`,
                startX + 200,
                doc.y,
                {
                    lineGap: 5,
                },
            ).
            fontSize(fontSize).
            fillColor(remittanceTitleColor).
            text('Remittance amount:', startX, doc.y, { lineBreak: false }).
            fillColor(valueColor).
            text(
                `$ ${getFloatNumber(getConvertAmount(remittanceAmount))}`,
                startX + 200,
                doc.y,
                {
                    lineGap: 5,
                },
            ).
            rect(startX, doc.y + 10, sideWidth, 60).
            fill('#F2F3F7').
            fontSize(transferDetailTitleSize).
            fillColor('#171A1F').
            font(`${__dirname}/Montserrat-Bold.ttf`).
            text('Associated with the order', transferDetailX, doc.y + 30, {
                lineBreak: false,
                baseline: 'top',
            }).
            text(' ', { lineGap: 10 }).
            font(`${__dirname}/Montserrat-Regular.ttf`);

        for (let i = 0; i < order.transactionList.length; i++) {
            const item = order.transactionList[i];
            const itemTransferFee = order.withdrawalMethod.paypalEnabled
                ? item.paypalTransferFee
                : item.bankTransferFee;
            doc.text(' ', { lineGap: 10 });
            doc.
                fontSize(fontSize).
                fillColor(remittanceTitleColor).
                text('Brand:', startX, doc.y, { paragraphGap: -20 }).
                fillColor(valueColor).
                text(item.brandName, startX + 200, doc.y, { lineGap: 8 });

            doc.
                fontSize(fontSize).
                fillColor(remittanceTitleColor).
                text('Campaign:', startX, doc.y, { paragraphGap: -20 }).
                fillColor(valueColor).
                text(item.campaignTitle, startX + 200, doc.y, { lineGap: 8 });

            doc.
                fontSize(fontSize).
                fillColor(remittanceTitleColor).
                text('Order ID:', startX, doc.y, { paragraphGap: -20 }).
                fillColor(valueColor).
                text(item.orderID, startX + 200, doc.y, { lineGap: 8 });

            doc.
                fontSize(fontSize).
                fillColor(remittanceTitleColor).
                text('Oder price:', startX, doc.y, { paragraphGap: -20 }).
                fillColor(valueColor).
                text(
                    `$ ${getFloatNumber(getConvertAmount(item.amount))}`,
                    startX + 200,
                    doc.y,
                    {
                        lineGap: 8,
                    },
                );

            doc.
                fontSize(fontSize).
                fillColor(remittanceTitleColor).
                text('SOMO service fee:', startX, doc.y, {
                    paragraphGap: -20,
                }).
                fillColor(remittanceTitleColor).
                text(
                    `$ ${getFloatNumber(getConvertAmount(item.somoServiceFee))}`,
                    startX + 200,
                    doc.y,
                    {
                        lineGap: 8,
                        strike: true,
                    },
                );

            doc.
                fontSize(fontSize).
                fillColor(remittanceTitleColor).
                text('Transfer fee:', startX, doc.y, { paragraphGap: -20 }).
                fillColor(valueColor).
                text(
                    `$ ${getFloatNumber(getConvertAmount(itemTransferFee))}`,
                    startX + 200,
                    doc.y,
                    {
                        lineGap: 8,
                    },
                );

            doc.rect(startX, doc.y + 20, sideWidth, sideHeight).fill(linceColor);
        }
        doc.end();
        const buffers = [];
        // 使用pdfkit的监听方法收集buffer,便于后续文件处理
        doc.on('data', buffers.push.bind(buffers));
        doc.on('end', () => {
            const pdfData = Buffer.concat(buffers);
            return resolve(pdfData);
        });
    });
    fs.writeFileSync(`${__dirname}/file.pdf`, pdfBuffer);
};
method();

到了这里,关于NodeJs导出PDF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【python】jupyter notebook导出pdf和pdf不显示中文问题

    使用jupyter notebook导出pdf时,出现了一些问题: 1)会报错,缺少安装包; 2)没有报错并且生成了pdf,但是只显示英文,不显示中文; 3)插入svg图片问题; 下面是给出了一些网搜后适用自己的解决办法。 导出pdf步骤: File- Download as - PDF via LaTex(.pdf) : 出现报错没有 Pandoc :

    2024年02月11日
    浏览(50)
  • Word导出高清PDF

    通过word导出pdf清晰度较高的方法_word如何导出高分辨率pdf_Perishell的博客-CSDN博客 通过打印机属性设置,让word打印出比较高清的pdf_word如何导出高分辨率pdf https://blog.csdn.net/weixin_45390670/article/details/129228568?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169106261616800192249442%2522%252C%25

    2024年02月14日
    浏览(57)
  • Java实现PDF导出

    需求:使用easyPOI方式导出合同word文档 Word模板和Excel模板用法基本一致,支持的标签也是一致的,仅仅支持07版本的word也是只能生成后缀是docx的文档,poi对doc支持不好所以easyPOI中就没有支持doc,我们就拿docx做导出 这里得好好说说模板中标签的用法: 下面列举下EasyPoi支持的

    2024年02月03日
    浏览(53)
  • 导出pdf

    该方法导出的pdf大小是A4纸的尺寸,如果大于1页需要根据元素高度进行截断的话,页面元素需要加 class ergodic-dom ,方法里面会获取 ergodic-dom 元素,对元素高度和A4高度做比较,如果大于A4高度,会塞一个空白元素,确保每一个元素在换页的时候不会被分割。

    2024年02月12日
    浏览(34)
  • JS打印、导出PDF

    这种方式打印的pdf比较高清,且分页不会截断文字和图片,背景图片是会被截断的 1.直接打印 直接调用浏览器的打印功能,打印整个页面 2.打印指定区域 通过开始标记、结束标记来打印,打印局部页面 注意 :1.如果你要打印的区域中包含vue赋值对象,那你的开始结束标志符

    2024年02月15日
    浏览(47)
  • Java POI导出Word、Excel、Pdf文档(可在线预览PDF)

    1、导入依赖Pom.xml        dependency             groupIdorg.apache.poi/groupId             artifactIdpoi/artifactId             version3.14/version         /dependency 2、Controller   3、Service a、pdfService b、wordService c、excelService  4、Utils 5、模板截图   6、前端

    2024年02月08日
    浏览(59)
  • 前端导出PDF(纯前端功能)

    例如:需要导出PDF格式 提示:问题出现在滚动条加错地方 首先: npm install html2canvas npm install jspdf 第二:新建一个htmlToPdf.js文件存放 // 导出页面为PDF格式 import html2Canvas from \\\'./html2canvas\\\' import JsPDF from \\\'./jsPdf.debug\\\' export default{   name:\\\'wwutils\\\',   toolExportPdf(fileName) {     let isCompele

    2024年02月16日
    浏览(49)
  • Java实现PDF导出/预览

            网上有很多关于PDF导出的文章,但是个人感觉实现的过于复杂,又是模板又是html的,有的还需要字体模板的支持,本片文章只是实现简单的PDF表格导出,可以实现PDF动态表格导出/预览,这类文章网上很少,就给你们整理一篇吧! 实现思路:本地创建PDF文件 --》打开

    2024年02月16日
    浏览(51)
  • Figma怎么导出PDF文件?

    Figma 是一款备受网页和 UI 设计师喜爱的基于矢量的设计工具。其最大的优势在于方便用户与团队成员进行协作。当设计师需要与其他团队成员、设计师或客户共享设计文件时,设计师需要将设计图案导出为 PDF 格式以方便查看。同样地,当设计师需要将设计图稿打印出来时,

    2024年02月06日
    浏览(42)
  • 使用IText导出复杂pdf

            需要将发票导出成pdf,要求每页都必须包含发票信息和表头行。         使用IText工具实现PDF导出         IText8文档:Examples (itextpdf.com)                  引入Itext依赖,我这里用的是8.0.1版本         测试一下:         IText8不支持中文,需要引入外部

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包