nodejs在pdf中绘制表格

news2024/12/30 1:59:19

需求

之前我已经了解过如何在pdf模板中填写字段了

nodejs根据pdf模板填入中文数据并生成新的pdf文件icon-default.png?t=N7T8https://blog.csdn.net/ArmadaDK/article/details/132456324

 但是当我具体使用的时候,我发现我的模板里面有表格,表格的长度是不固定的,所以需要动态生成一个表格,就要在原方案生成的pdf后面自己画上表格,可以在pdflib的官网上看到一些例子PDF-LIB · Create and modify PDF documents in any JavaScript environment.

具体代码

// 创建一个新页面
      const currentPage = pdfDoc.addPage([pdfWidth, pdfHeight]);

用addpage创建一页,并将这页保存为变量方便后续进行操作。

// 绘制表格行数据
      for (let i = startRow; i < endRow; i++) {
        const rowData = arr[i];
        const y = pdfHeight - 100 - (i % rowsPerPage) * cellHeight;
        currentPage.drawRectangle({
          // 每行一个长方形
          x: 50,
          y, // 手动垂直居中
          width: tableWidth,
          height: cellHeight,
          borderColor: rgb(0, 0, 0),
        });
        let idx = 0;
        for (let key in rowData) {
          currentPage.drawText(rowData[key], {
            // 填入文字
            x: 50 + idx * cellWidth + 10,
            y: y + 5,
            size: fontSize,
            font,
          });
          currentPage.drawLine({
            // 竖线
            start: { x: 50 + idx * cellWidth, y },
            end: { x: 50 + idx * cellWidth, y: y + cellHeight },
            thickness: 1,
          });
          idx++;
        }
      }

drawText('文字内容',{文字的一些options(注意这里的坐标是左下角)})

drawLine({start:{起点坐标},end:{终点坐标},thickness: 粗细})

这时候发现如果文字是中文的话会出现乱码,就需要引入中文字体,但和上篇的引入方法不一样,这次不能用那个update,而是使用setfont,直接对整个currentPage字体进行设置,如下代码所示:

  // 设置字体
  const fontBytes = await fs.promises.readFile(
    "xxxx.ttf"
  );
  pdfDoc.registerFontkit(fontkit);
  let font = await pdfDoc.embedFont(fontBytes);

。。。

      // 每次创建一个新页面就要设置font
      const currentPage = pdfDoc.addPage([pdfWidth, pdfHeight]);
      currentPage.setFont(font);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Kafka系列】(二)Kafka的基本使用

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 文章更新计划[2] 系列文章地址[3] Kafka 线上集群部署方案怎么做 操作系统 先说结论&#xff0c;Kafka 部署在 Linux 上要比 Window…

代码随想录笔记--动态规划篇

1--动态规划理论基础 动态规划经典问题&#xff1a;① 背包问题&#xff1b;② 打家劫舍&#xff1b;③ 股票问题&#xff1b; ④ 子序列问题&#xff1b; 动态规划五部曲&#xff1a; ① 确定 dp 数组及其下标的含义&#xff1b; ② 确定递推公式&#xff1b; ③ 确定 dp 数组…

docker下redis备份文件dump.rdb获取

1.查看镜像 docker ps -a 2.进入redis客户端 docker exec -it redis redis-cli 3.保存备份文件 save 4.查看文件存放位置 CONFIG GET dir 5.将docker中文件拷出 docker cp id或name:容器中文件的路径 目标目录地址

学生党台灯哪款好一点?适合学生党使用的台灯推荐

不知道大家有没有仔细观察过身边的小学生以及中学生&#xff0c;很多孩子都戴上了眼镜。其实造成孩子近视的原因有很多&#xff0c;大部分家长认为主要原因还是在使用电子产品上&#xff0c;其实不止如此&#xff0c;经常使用电子产品&#xff0c;确实容易造成近视&#xff0c;…

内核和用户空间中的TID,GID, PID,uid

要获取关于eBPF中的进程信息&#xff0c;可以使用以下函数: bpf_get_current_pid_tgid()、 bpf_get_current_uid_gid()、 bpf_get_current_comm(char *buf, int size_of_buf)。 当程序被绑定到对某个内核函数调用时&#xff0c;就可以使用它们。UID/GID应该比较明确&#xff0c…

sudo文件的配置以及gccg++工具的使用

目录 sudo无法运行的原因 sudoers文件的配置 1.切换到root账户 2.打开sudoers文件 ​编辑 3.开始文件配置 gcc&g工具的使用 预处理 为什么要有条件编译呢&#xff1f; gcc预处理文件 编译 汇编 链接 动态库和静态库 sudo无法运行的原因 之前我们说过&#xff0c;普通用户在…

[Linux入门]---进程的概念

文章目录 1.进程的概念①描述进程-PCB②task_struct-PCB的一种③task_ struct内容分类 2.查看进程3.通过系统调用获取进程表示符4.通过系统调用创建进程---fork初识 1.进程的概念 在我们的电脑开机的时候&#xff0c;操作系统会被加载到内存中&#xff0c;点击多个应用进行时&a…

【校招VIP】前端js语言考点之ES6

考点介绍&#xff1a; es6就是es5的升级版&#xff0c;es5是js的通用标准&#xff0c;绝大多数浏览器都支持其语法&#xff0c;但是es6则不同&#xff0c;如果es6的代码需要在浏览器上运行&#xff0c;那就先将es6转换为es5。如果在es6中使用模块化机制&#xff0c;需要将个模块…

OAuth2.0客户端基于oltu搭建

之前提到了cas-server这个项目其本身是支持OAuth2.0协议的,因此我们可以简单搭建一个OAuth客户端,本次使用到的是Apache的oltu oltu介绍 Apache Oltu 是一个开源的 OAuth 库&#xff0c;用于帮助开发者实现 OAuth 1.0 和 OAuth 2.0 协议。OAuth 是一种用于授权和认证的协议&a…

Learn Prompt- Midjourney 图片生成:Image Prompts

Prompt 自动生成 前不久&#xff0c;Midjourney 宣布支持图片转 prompt 功能。 原始图片​ blueprint holographic design of futuristic Midlibrary --v 5Prompt 生成​ 直接输入 /describe 指令通过弹出窗口上传图像并发送&#xff0c;Midjourney 会根据该图像生成四种可…

图片无损放大在线工具分享

在论文写作过程中 忘了将图片保存330dpi怎么办&#xff1f;截图的图片放论文&#xff0c;十分模糊怎么办&#xff1f; 图片模糊、不清晰转高清的神器 【传送门】 推荐理由:无广告、速度快、在线版&#xff0c;随时用。

数据结构之【泛型】

泛型&#xff1a;定义阶段不明确具体类型&#xff0c;产生对象时明确具体类型。 //Object是Java中的最高参数统一化&#xff0c;能够接受所有的引用类型&#xff1b; //有了包装类的自动拆装箱之后&#xff0c;Object还能够接收基本类型数值&#xff08;自动装箱&#xff09; …

前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、等于操作符 二、全等操作符 三、区别 小结 一、等于操作符 等于操作符用两个等于号&#xff08; &am…

基于微信小程序的校园餐饮配送系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言学生微信小程序端的主要功能有&#xff1a;配送员微信小程序端的主要功能有&#xff1a;商家微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&am…

单调栈和单调队列可以很简单

大家好&#xff0c;我是 方圆。我觉得单调栈和单调队列的题目很有特点&#xff0c;而且理解了它的特点能够很轻松容易地解决一系列题目&#xff0c;所以决定用这篇帖子记录一下&#xff0c;也想以此来帮助在刷同样类型题目的朋友们。如果大家想要找刷题路线的话&#xff0c;可以…

每日一题~组合总数III

原题链接&#xff1a;216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 这是一个组合的问题&#xff0c;所以我们可以使用深度优先搜索&#xff08;DFS&#xff09;的方式将所有的情况都列举出来&#xff0c;然后将其中…

企业怎么申请OV SSL证书?

随着互联网的发展&#xff0c;越来越多的企业开始使用SSL证书来保护网站的安全。而OV SSL证书作为机构验证型的证书&#xff0c;能够重点强调网站安全、企业可信形象的网站&#xff0c;保密传输更加安全。那么&#xff0c;企业怎么申请OV SSL证书呢&#xff1f;接下来&#xff…

计算机视觉与深度学习-经典网络解析-GoogLeNet-[北邮鲁鹏]

这里写目录标题 GoogLeNet参考GoogLeNet模型结构创新点Inception结构&#xff0c;它能保留输入信号中的更多特征信息去掉了AlexNet的前两个全连接层&#xff0c;并采用了平均池化引入了辅助分类器 GoogLeNet GoogLeNet的设计主要特点是引入了Inception模块&#xff0c;这是一种…

聚观早报 | 杭州亚运开幕科技感拉满;腾讯官宣启动「青云计划」

【聚观365】9月25日消息 杭州亚运开幕科技感拉满 腾讯官宣启动「青云计划」 FF任命新全球CEO 比亚迪夺得多国销冠 iPhone 15/15 Pro销售低于预期 杭州亚运开幕科技感拉满 杭州第19届亚洲运动会开幕式23日晚在杭州奥体中心主体育馆举行&#xff0c;这届开幕式可谓科技感拉…

【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux进程 1. 前言2. PCB初认…