PDFKit 图片使用完全指南:格式支持、缩放模式、EXIF 方向与透明通道
PDFKit 图片使用完全指南格式支持、缩放模式、EXIF 方向与透明通道【免费下载链接】pdfkitA JavaScript PDF generation library for Node and the browser项目地址: https://gitcode.com/gh_mirrors/pd/pdfkit本文是 PDFKitdocs/images.md图片能力的深度技术指南。PDFKit 是用于 Node 与浏览器环境的 JavaScript PDF 生成库在文档中插入图片只需调用doc.image()并传入路径、Buffer 或 base64 Data URI。读完本文你将掌握 PDFKit 图片 API 的全部入参缩放、适配、对齐、链接、透明度、EXIF 方向并理解其在 lib/mixins/images.js 与 lib/image.js 中的底层实现原理从而在实际项目中精准控制图片的排版与渲染效果。支持的图片格式与数据来源PDFKit 的image方法支持JPEG与PNG两种格式。格式判定并非通过文件扩展名而是读取数据的文件头魔数magic bytes相关逻辑集中在 lib/image.js以0xFF 0xD8开头 → 按 JPEG 解析lib/image/jpeg.js以0x89 0x50 0x4E 0x47即\x89PNG开头 → 按 PNG 解析lib/image/png.js其余情况抛出Unknown image format.错误。image方法的第一个参数支持三种数据源// 1. 文件路径Node 环境内部经 fs 读取 doc.image(images/test.jpeg); // 2. Buffer / Uint8Array / ArrayBuffer const buf fs.readFileSync(images/test.png); doc.image(buf); // 3. Base64 编码的 Data URI doc.image(data:image/png;base64,iVBORw0KGgo...);其中 Data URI 通过fromBase64解码见 lib/image.jsBuffer 类型则在构造阶段直接使用。每张图片对象以I${n}的形式打标签并注册进文档的_imageRegistry同一路径/对象重复插入时会复用已嵌入的 XObject避免重复写入数据见 lib/mixins/images.js。图片的定位文档流内联与绝对定位doc.image(src, x, y, options)的后两个参数决定图片的摆放方式不传x、y图片渲染在当前文本流的光标位置紧接最后一行文本下方。此时image返回后会自动把文档的当前y坐标下移图片高度后续text等内容会自然排在图片下方对应 lib/mixins/images.js。这一行为有测试直接验证tests/unit/image.spec.js中的 y position should be updated 用例断言document.y增加了图片高度。传入x、y图片按绝对坐标定位在该点不影响文本流。此外x、y也可以放进options对象的x、y字段中见 lib/mixins/images.js。// 流入文本流跟随上文内容 doc.text(下面这张图跟随文本流); doc.image(images/test.jpeg); // 绝对定位 doc.image(images/test.jpeg, 320, 15);缩放规则八种组合方式若不提供任何缩放选项图片以原始像素尺寸渲染1 个 PDF 单位对应 1 像素。image方法的缩放逻辑全部实现在 lib/mixins/images.js规则如下传入选项渲染行为源码分支无width/height全尺寸渲染默认分支仅width按宽等比缩放高按比例计算options.width !options.height仅height按高等比缩放宽按比例计算options.height !options.widthwidthheight拉伸到指定尺寸不保持比例options.width \|\| width直接赋值scale按比例因子缩放w width * scaleoptions.scalefit: [w, h]等比缩放完整装入指定矩形不留白不裁切options.fitcover: [w, h]等比缩放完全覆盖指定矩形允许裁切options.coverlink/goTo/destination见下文交互与注释小节注释分支fit与cover的核心差异在于宽高比的比较fit以图片完整可见优先cover以填满矩形优先两者在 lib/mixins/images.js 中对比图片宽高比ip与矩形宽高比bp后决定按宽还是按高适配。// 等比缩放到指定宽度 doc.image(images/test.jpeg, 0, 15, { width: 300 }); // 拉伸到指定尺寸 doc.image(images/test.jpeg, 320, 145, { width: 200, height: 100 }); // 按比例因子缩放 doc.image(images/test.jpeg, 320, 280, { scale: 0.25 }); // fit完整装入 100x100 矩形 doc.image(images/test.jpeg, 320, 15, { fit: [100, 100] }) .rect(320, 15, 100, 100) .stroke(); // cover覆盖 100x100 矩形 doc.image(images/test.jpeg, 430, 145, { cover: [100, 100] });fit / cover 的对齐选项align 与 valign当使用fit或cover时图片缩放后可能不会恰好填满目标矩形此时可通过align与valign控制图片在矩形内的位置alignleft默认centerrightvaligntop默认centerbottom对齐计算同样在 lib/mixins/images.js 中完成center会把起点平移(矩形宽 - 图片宽) / 2right/bottom则平移完整差值。// 在 100x100 矩形内水平、垂直居中 doc.image(images/test.jpeg, 430, 15, { fit: [100, 100], align: center, valign: center, }) .rect(430, 15, 100, 100) .stroke();交互与注释link、goTo、destinationimage方法内置了三个注释快捷选项底层分别调用 lib/mixins/annotations.js 中的link与goTo见 lib/mixins/images.jslink: https://example.com— 为图片区域创建超链接注释跳转外部 URLgoTo: anchor-name— 跳转到文档内的命名目标配合destination或doc.addNamedDestination使用destination: anchor-name— 将图片本身注册为一个命名目的地锚点供goTo跳转。// 给图片加外链 doc.image(images/test.jpeg, 0, 15, { width: 300, link: https://example.com, }); // 图片作为锚点另一个位置跳转过来 doc.image(images/test.jpeg, 0, 15, { destination: fig-1 });注意链接区域的位置与尺寸使用缩放前的x、y、w、h缩放计算之后的最终值因此带fit/cover的图片其注释区域会与实际绘制区域保持一致。透明度opacity 选项opacity接受0完全透明到1完全不透明之间的数值通过为页面注册ExtGState实现源码入口在 lib/mixins/images.js。对于本身带 alpha 通道的 PNG该值会与现有透明度叠加生效。数值会被钳制在[0, 1]区间相同透明度的多次调用会复用同一个 ExtGState 对象——这些行为均有测试覆盖见 tests/unit/image.spec.js。doc.image(images/test.png, 0, 15, { width: 200, opacity: 0.5 });JPEG EXIF 方向ignoreOrientation 选项相机或手机拍摄的 JPEG 常带有 EXIF Orientation 标签指示拍摄时的旋转/翻转状态。PDFKit 默认会解析并应用该方向值 1–8确保图片看起来是正的方向解析逻辑在 lib/image/jpeg.js 中实现——扫描 JPEG 各段定位 APP10xFFE1中Exif\x00\x00头解析 TIFF 结构并在 IFD0 条目中查找0x0112标签取值范围 1–8 之外的取值会被忽略并回退为 1。在 lib/mixins/images.js 中当方向值大于 4 时即需要旋转 90°/270° 的 5–8图片的宽高会互换随后按方向值通过变换矩阵与旋转逐项还原lib/mixins/images.js。关闭方向矫正的方式有两个层级// 1. 单张图片忽略 doc.image(orientation-6.jpeg, 0, 15, { height: 80, ignoreOrientation: true }); // 2. 整个文档默认忽略new PDFDocument 时设置 const doc new PDFDocument({ ignoreOrientation: true });需要特别留意文档级选项只作为默认值。在 lib/mixins/images.js 中单次调用传入ignoreOrientation: false会显式覆盖文档级默认值options.ignoreOrientation ! false this.options.ignoreOrientation因此你可以在文档默认忽略的前提下对个别图片单独开启方向矫正。8 种方向的逐一渲染对照见 tests/visual/images.spec.js 的orientation用例其视觉快照位于 tests/visual/image_snapshots/images-spec-js-images-orientation-1-snap.pngfit/cover与方向矫正的组合对齐效果也有独立用例与快照images-spec-js-images-orientation-with-cover-and-alignment-1-snap.png。PNG 的深度支持透明通道、调色板与交错图PNG 的嵌入实现位于 lib/image/png.js内部借助png-js解码像素后按 PDF 规范重新组织数据覆盖了 PNG 的各类变体调色板索引色color type 3将PLTE调色板内联为Indexed颜色空间的独立对象配合tRNS透明度生成灰度 SMasklib/image/png.js 与loadIndexedAlphaChannel内建 alpha 通道color type 4/6splitAlphaChannel把颜色像素与 alpha 像素分离alpha 以 8 位灰度 SMask 写入 PDF16 位图只取高字节lib/image/png.js交错Adam7PNGdecodeData会先解码再重新压缩lib/image/png.js相关视觉测试见 tests/visual/interlaced-png.spec.js非透明 PNG 使用FlateDecode滤镜并带上DecodeParms预测器参数。这也是opacity与 PNG 自身 alpha 叠加生效的底层原因图片自身的 alpha 通道被写为 SMask而opacity通过 ExtGState 的透明度再叠加一层。完整示例一次演示所有缩放模式下面是 docs/images.md 中的经典示例将各种缩放与对齐方式集中展示在同一页// 等比缩放到指定宽度 doc.image(images/test.jpeg, 0, 15, { width: 300 }) .text(Proportional to width, 0, 0); // fit 到 100x100并描出矩形边框 doc.image(images/test.jpeg, 320, 15, { fit: [100, 100] }) .rect(320, 15, 100, 100) .stroke() .text(Fit, 320, 0); // 拉伸 doc.image(images/test.jpeg, 320, 145, { width: 200, height: 100 }) .text(Stretch, 320, 130); // 按比例因子缩放 doc.image(images/test.jpeg, 320, 280, { scale: 0.25 }) .text(Scale, 320, 265); // fit 到 100x100并在矩形内水平垂直居中 doc.image(images/test.jpeg, 430, 15, { fit: [100, 100], align: center, valign: center, }) .rect(430, 15, 100, 100) .stroke() .text(Centered, 430, 0);示例中用到的images/test.jpeg可在 examples/images/test.jpeg 找到仓库中也提供了可直接运行的参考脚本 examples/png.js演示 PNG 插入并输出png.pdf。若要快速验证各选项的实际渲染效果可以运行视觉测试套件查看生成的快照例如 tests/visual/image_snapshots/images-spec-js-images-orientation-with-fit-and-alignment-1-snap.png。小结PDFKit 的图片 API 在保持一行代码插入图片的简洁同时覆盖了生产环境几乎全部诉求双格式自动识别、文档流与绝对定位两种排版方式、width/height/scale/fit/cover五种缩放语义、align/valign对齐、link/goTo/destination交互注释、opacity透明度以及 JPEG EXIF 方向矫正与 PNG 透明通道/交错图的底层处理。理解这些选项与 lib/mixins/images.js 的实现对应关系后你可以在发票、报表、图片画廊等任何场景中精准控制每一张图片的呈现。【免费下载链接】pdfkitA JavaScript PDF generation library for Node and the browser项目地址: https://gitcode.com/gh_mirrors/pd/pdfkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

阅读笔记-密码学基本原理

阅读笔记-密码学基本原理

数据身份认证:数据身份认证有时被称为消息认证码,主要涉及数据(消息)的身份认证。不可否认性:不可抵赖性,发送者不能向第三方否认他发送了这些数据。如果不能提供数据源身份认证(因此也不能提供…

2026/9/24 13:41:16 阅读更多 →
YOLOv11视觉引导机械臂抓取:0.1mm精度控制全链路解析

YOLOv11视觉引导机械臂抓取:0.1mm精度控制全链路解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 13:41:16 阅读更多 →
【Dv2Admin】新增自定义无模型序列化

【Dv2Admin】新增自定义无模型序列化

在开发基于 Django REST framework (DRF) 的应用时,通常会使用 ModelSerializer 进行序列化操作。然而,在一些无模型(无数据库表)的查询操作中,直接使用 ModelSerializer 或自定义的 CustomModelSerializer 可能会导致各种冲突或不适合的场景。为了解决这些问题,我们可以…

2026/9/24 13:41:16 阅读更多 →

最新新闻

实战案例:Agent Sprite Forge 打造 Unity WebGL 生存类小游戏全流程

实战案例:Agent Sprite Forge 打造 Unity WebGL 生存类小游戏全流程

实战案例:Agent Sprite Forge 打造 Unity WebGL 生存类小游戏全流程 【免费下载链接】agent-sprite-forge Agent Skill for generating 2D sprite sheets and map, transparent PNG frames, and animated GIFs from prompts. 项目地址: https://gitcode.com/gh_mi…

2026/9/25 16:55:20 阅读更多 →
Minitron剪枝工作流:Model Optimizer把LLM参数量砍掉40%的全流程

Minitron剪枝工作流:Model Optimizer把LLM参数量砍掉40%的全流程

Minitron剪枝工作流:Model Optimizer把LLM参数量砍掉40%的全流程 【免费下载链接】Model-Optimizer A unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc.…

2026/9/25 16:55:20 阅读更多 →
FlexGen 仓库视角下的 Transformers Flax 语言模型预训练实战:从零训练 RoBERTa、GPT-2、T5 与 BART

FlexGen 仓库视角下的 Transformers Flax 语言模型预训练实战:从零训练 RoBERTa、GPT-2、T5 与 BART

推理引擎大模型 【免费下载链接】FlexGen Running large language models on a single GPU for throughput-oriented scenarios. 项目地址: https://gitcode.com/gh_mirrors/fl/FlexGen 点击查看 免费下载 本篇技术指南以 benchmark/third_party/transformers/exam…

2026/9/25 16:55:20 阅读更多 →
基于 Hugging Face Transformers 在 MM-IMDb 上微调多模态双 Transformer(MMBT)分类模型实战指南

基于 Hugging Face Transformers 在 MM-IMDb 上微调多模态双 Transformer(MMBT)分类模型实战指南

推理引擎大模型 【免费下载链接】FlexGen Running large language models on a single GPU for throughput-oriented scenarios. 项目地址: https://gitcode.com/gh_mirrors/fl/FlexGen 点击查看 免费下载 本文以当前仓库中 mm-imdb 示例目录 的官方 README 为核心…

2026/9/25 16:55:20 阅读更多 →
React Native Skia 阴影滤镜实战:用 Shadow 组件实现投影、内阴影与拟物化设计

React Native Skia 阴影滤镜实战:用 Shadow 组件实现投影、内阴影与拟物化设计

图形学移动开发跨平台UI组件 【免费下载链接】react-native-skia High-performance React Native Graphics using Skia 项目地址: https://gitcode.com/gh_mirrors/re/react-native-skia 点击查看 免费下载 Shadow(DropShadow)是 React Nati…

2026/9/25 16:55:20 阅读更多 →
OS第二章随手记(2.1)

OS第二章随手记(2.1)

目录 一、进程阻塞的过程 二、阻塞队列 三、对时钟中断与中断的思考🤔 四、虚拟地址的思考 五、保存程序状态 六、int 0x80 的思考 七、中断源 八、陷入机制 九、MMU的简略描述 十、王道题目知识点总结 一、进程阻塞的过程 进程调用了一个系统调用函数去访…

2026/9/25 16:54:19 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →