首页 > 编程语言 >node根据模板生成pdf,并在pdf中插入文本信息,水印,签章。

node根据模板生成pdf,并在pdf中插入文本信息,水印,签章。

时间:2024-10-24 19:47:19浏览次数:3  
标签:node canvas const ctx 水印 签章 pdf

要求

通过node生成司机小程序需要的pdf,并在pdf插入信息,用户签章,公司签章,水印等。

第三方插件

# pdf-lib  版本1.17.1。读取pdf模板,插入信息,签章,水印。
# @pdf-lib/fontkit  版本1.1.1。加载pdf插入信息时所需的字体文件ttf。
# canvas 版本2.11.2。根据用户名形成用户签章(文字生成图片)。
 
npm install pdf-lib @pdf-lib/fontkit canvas

关键代码

文本信息和水印都可以使用文本插入,水印可根据需要做特殊处理,如:用rgb函数设置水印的透明度,degrees设置水印的旋转角度


// 导入插件
    const { PDFDocument, rgb, degrees } = require('pdf-lib');
    const fontkit = require('@pdf-lib/fontkit');
    // 读取模板pdf
    const templateBytes = await fs.promises.readFile(templatePdfPath)
    // 加载模板pdf
    const pdfDoc = await PDFDocument.load(templateBytes);
    // pdf准备加载字体
    pdfDoc.registerFontkit(fontkit);
    // 加载字体文件 fontPath字体文件ttf的存放路径
    const fontBytes = await fs.promises.readFile(fontPath);
    // 读取字体文件
    const font = await pdfDoc.embedFont(fontBytes);
    // 获取pdf页面列表
    const pages = pdfDoc.getPages()
    // 在对应页面插入信息  水印同理
    const firstPage = pages[0]
    firstPage.drawText(data.name, {
            x: 125,
            y: 530,
            size: 16,
            font,
        })
    // 插入图片 (签章均为图片)
    const imgData = fs.readFileSync(url)
    const jpgImage = await pdfDoc.embedPng(imgData);
    const jpgDims = jpgImage.scale(0.25);
    pages[0].drawImage(jpgImage, {
        x: 400,
        y: 300,
        width: jpgDims.width,
        height: jpgDims.height,
    });
 
    // 保存pdf
    const modifiedPdfBytes = await pdfDoc.save();
    // 拼接输出路径
    const outPath = path.join(__dirname, '../../../temporary', outputPath)
    // 写在指定位置
    await fs.promises.writeFile(outPath, modifiedPdfBytes);

canvas生成签章(canvas生成图片插入到pdf)

// 文件流输出异步进行,需要使用promise将异步转为同步操作
async function makeUserSignature(data) {
        return new Promise((resolve, reject) => {
            // 是否可以存储用户签章
            let text = data.userName
            const canvas = createCanvas(200, 200);
            const ctx = canvas.getContext('2d');
            // 设置字体样式和大小
            ctx.font = '90px GB2312';
            ctx.fillStyle = 'red';
            // 写入文字到Canvas上
            ctx.fillText(text[0], 110, 80);
            ctx.fillText(text[1], 110, 180);
            ctx.fillText(text[2], 10, 80);
            ctx.fillText(text[3], 10, 180);
            // 将Canvas转换为图片并保存到文件
            const name = id()
      // 文件流输出路径
            const outputPathPng = path.join(__dirname, './temporary', `./${name}.png`)
            const stream = fs.createWriteStream(outputPathPng);
            canvas.createPNGStream().pipe(stream);
            // 监听文件流输出完毕,调用promise返回输出路径
            stream.on('finish', () => {
                logger.info('finish')
                resolve(outputPathPng)
            })
        })
    }

效果

1157cbe7166a4abfb03fe0d9ea1956af.png

 

 

 

标签:node,canvas,const,ctx,水印,签章,pdf
From: https://blog.csdn.net/qq_57597568/article/details/143178765

相关文章

  • Nodejs版本管理及镜像配置
    pnpm安装Windows(PowerShell)Invoke-WebRequesthttps://get.pnpm.io/install.ps1-UseBasicParsing|Invoke-Expressionhttps://pnpm.io/zh/installationPOSIX系统curl-fsSLhttps://get.pnpm.io/install.sh|sh-更新pnpmself-update配置node镜像pnpmconfi......
  • save download pdf
    packagecn.didisos.sos.fams.controller;importorg.apache.http.HttpEntity;importorg.apache.http.HttpResponse;importorg.apache.http.HttpStatus;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.impl.client.CloseableHttpClient;importorg......
  • 计算机毕业设计项目推荐:大学生实习成绩评价系统的设计与实现38147(开题答辩+程序定制+
    摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对大学生实习成绩......
  • 计算机毕业设计项目推荐,个人知识管理系统 79004(开题答辩+程序定制+全套文案 )上万套实
    摘 要尽管我们每天面临的信息越来越多,信息过载与信息噪音越来越严重,但只要我们能充分利用个人知识管理技能,借助有效的个人知识管理软件相信战胜海量信息不再是困难。本课题在分析了个人知识管理现状以及对现有的个人知识管理网站进行研究比较的基础上,针对网络交流互助的特......
  • 安装node及vue项目的启动
    1、ubuntu安装npmsudoaptinstallnodejsnpm2、设置包下载源npmconfigsetregistryhttps://registry.npmmirror.com/3.安装包及运行npminstall安装成功后会生成一个node_moudels目录运行:npmrunserve4、常见报错及解决方式(1)oldlockfile报错npmWARNoldlo......
  • 如何使用格式工厂将 PDF 转换为 Word 文档
    格式工厂是一款多功能的多媒体文件转换工具,它不仅可以转换音频和视频文件,还可以处理文档格式之间的转换。下面是一篇详细的教程,简鹿办公教你如何使用格式工厂将PDF文档转换为Word(.docx)格式。需要注意的是,如果PDF文件是由扫描件组成的图片,则可能无法直接转换为可编辑的文本......
  • 报error:0308010C:digital envelope routines::unsupported错--nodejs版本过高(nvm安
    最近小编入职实习,运行(npmrundev)前端项目时报error:0308010C:digitalenveloperoutines::unsupported的错,一查发现原来是nodejs版本过高,与项目不匹配。接下来介绍更换nodejs版本的方法。第一种:官网下载通过nodejs官网下载安装,但有个缺陷,不同版本的nodejs无法顺利的切换......
  • 如何给pdf文档加密码保护?(2024全新)6个靠谱pdf加密方法分享
    如何给pdf文档加密码保护?日常办公生活中,我们经常需要使用到pdf文件。作为一个打工人,我们经常需要进行文件传输交流,当你将PDF文件分享到一个群或者人数较多的平台时,为了不让其他人随意查看文件,和保护文件隐私信息不被泄露,我们会选择给文件进行加密保护。那么要如何给PDF文件进行......
  • 【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (四):状态码的使用
    本项目旨在学习如何快速使用nodejs开发后端api,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师)由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序(并非循序渐进的教学文档)。建议配合项目源码node-mongodb-template。【NodeJS......
  • 【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (五):POST上传文件的设置
    本项目旨在学习如何快速使用nodejs开发后端api,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师)由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序(并非循序渐进的教学文档)。建议配合项目源码node-mongodb-template。【NodeJS......