如何在 pdf.js 渲染 PDF 页面前向 Canvas 添加自定义文本

雨枫酱_6805

雨枫酱_6805

2026-03-24

950人浏览

原创

本文详解如何在 pdf.js 的 canvas 渲染流程中正确插入自定义文本(如水印、页眉、调试标记等),重点解决因渲染覆盖导致文本不可见的常见问题,并提供可立即运行的完整示例与关键注意事项。

本文详解如何在 pdf.js 的 canvas 渲染流程中正确插入自定义文本(如水印、页眉、调试标记等),重点解决因渲染覆盖导致文本不可见的常见问题,并提供可立即运行的完整示例与关键注意事项。

在使用 pdf.js 渲染 PDF 时,开发者常希望通过 元素叠加文本(例如页码、版权水印或调试标识),但直接在 page.render() 调用前用 fillText() 绘制文本却始终不显示——根本原因在于:page.render() 会完全重绘整个 Canvas,覆盖此前所有 2D 上下文操作。

你的代码中:

gcc.fillText("Hello World", canvas.width/2, canvas.height/2);           
page.render({canvasContext: gcc, viewport: viewport}); // ← 此行清空并重绘 Canvas!

page.render() 内部会调用 clearRect(0, 0, width, height) 并执行 PDF 图形指令,因此前置绘制的文本必然被擦除。

✅ 正确做法是:在 page.render() 完成后,再执行文本绘制,即利用其返回的 RenderTask 的 promise 链式回调:

function renderPage(pageNumber, canvas) {
  thePdf.getPage(pageNumber).then(function(page) {
    const viewport = page.getViewport({ scale: scale });
    canvas.height = viewport.height;
    canvas.width = viewport.width;
    const ctx = canvas.getContext('2d');

    // Step 1: 执行 PDF 渲染
    const renderTask = page.render({
      canvasContext: ctx,
      viewport: viewport
    });

    // Step 2: 渲染完成后,再绘制自定义文本(确保不被覆盖)
    renderTask.promise.then(function() {
      ctx.font = "30px 'Comic Sans MS', sans-serif";
      ctx.fillStyle = "rgba(0, 128, 0, 0.8)"; // 半透明绿色,避免遮挡内容
      ctx.textAlign = "center";
      ctx.textBaseline = "middle";
      ctx.fillText(`Page ${pageNumber}`, canvas.width / 2, canvas.height / 2);
    }).catch(console.error);
  });
}

? 关键要点说明:

  • 渲染与绘制必须分阶段:PDF 内容由 page.render() 生成;自定义图形/文本必须在其 promise 解析后追加。
  • 字体与样式建议:优先使用 Web 安全字体(如 'Helvetica', sans-serif),避免依赖本地字体(Comic Sans MS 在多数服务器环境不可用);使用 rgba() 控制透明度,提升可读性。
  • 坐标系注意:page.getViewport() 返回的 height/width 是逻辑像素尺寸,与 Canvas 的 height/width 属性一致,可直接用于定位。
  • 性能提示:若需为每页添加相同水印(如“DRAFT”),建议复用 ctx 绘制逻辑;若涉及复杂 SVG 或多层文本,可考虑在 renderTask.promise 后叠加绝对定位的
    层(需同步 Canvas 尺寸与 CSS transform),但 Canvas 原生绘制更轻量、更可控。

    ? 进阶技巧:如需动态文本(如当前时间、用户 ID),可在 renderTask.promise.then() 中实时生成字符串;若需抗锯齿文本,可启用 ctx.imageSmoothingEnabled = true(对文字效果有限,主要影响缩放图像)。

    总结:pdf.js 的 Canvas 渲染是单向覆写流程,任何前置绘制都会失效。牢记“先渲染 PDF,后叠加文本”的原则,并依托 renderTask.promise 实现可靠时机控制——这是实现页眉、水印、调试标注等增强功能的核心范式。

极轻PDF
极轻PDF

专业的在线PDF工具,支持PDF编辑、转换、合并、压缩等多种功能,操作简单,处理高效,满足日常办公与学习中的PDF处理需求。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

2023.10.23

3531

6

canva可画使用技巧汇总
canva可画使用技巧汇总

本专题汇集了PHP中文网精心整理的Canva可画新手使用技巧大全,专为零基础用户打造。无论你是想制作精美海报、PPT还是社交媒体配图,这里都有从注册登录、模板搜索到AI辅助设计、导出分享的全流程保姆级教程。通过深入浅出的图文指南,帮助你快速跨越设计门槛,轻松掌握Canva可画的实用操作,让每个人都能成为设计达人!

2026.05.19

224

21

canva可画新手使用指南
canva可画新手使用指南

本专题专为零基础用户打造,系统讲解Canva可画的核心功能与实用技巧。从注册登录、模板选择到图文编辑、导出分享,手把手带你快速上手。涵盖海报、PPT、简历等高频场景,结合AI工具提升效率,让你5分钟做出专业级设计,轻松应对学习、工作与社交需求。

2026.05.06

700

25

canva可画硬件门槛与适配设备指南
canva可画硬件门槛与适配设备指南

本专题聚焦Canva可画的硬件门槛与适配设备指南,全面解析网页版与App在不同终端上的运行要求。结合PHP中文网提供的专业技术教程,帮助用户精准排查设备卡顿、白屏等问题,快速判断电脑、平板及手机是否满足流畅使用Canva可画的各项硬性指标。

2026.05.19

94

11

canva可画使用技巧汇总
canva可画使用技巧汇总

本专题汇集了PHP中文网精心整理的Canva可画新手使用技巧大全,专为零基础用户打造。无论你是想制作精美海报、PPT还是社交媒体配图,这里都有从注册登录、模板搜索到AI辅助设计、导出分享的全流程保姆级教程。通过深入浅出的图文指南,帮助你快速跨越设计门槛,轻松掌握Canva可画的实用操作,让每个人都能成为设计达人!

2026.05.19

224

21

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

60

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

20

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

20

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

20

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.2万人学习