news 2026/9/21 16:09:13

BentoPDF Add Page Labels 工具深度解析:用罗马数字、字母前缀与多规则为 PDF 添加页码标签

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BentoPDF Add Page Labels 工具深度解析:用罗马数字、字母前缀与多规则为 PDF 添加页码标签
  • 前端

【免费下载链接】bentopdf

The Privacy First PDF Toolkit

项目地址:https://gitcode.com/gh_mirrors/be/bentopdf
点击查看免费下载

本文围绕 BentoPDF 开源仓库中的 Add Page Labels 工具文档 展开。页码标签(Page Labels)是 PDF 阅读器在工具栏、缩略图与打印对话框中显示的编号元数据,它与"打印在纸面上的页码"是两回事。读完本文,你将掌握如何用 BentoPDF 为不同页面区间配置六种编号样式、自定义前缀与起始值,理解多规则标签背后的 CoherentPDF(CPDF)引擎调用链,并能直接在浏览器中完成书籍前言罗马数字、附录 A-1/B-1、扫描件修正等真实场景。

什么是 PDF 页码标签

页码标签控制的是PDF 阅读器如何显示页码——也就是阅读器工具栏中显示的那个数字,而不是打印在页面上的内容。它属于 PDF 的元数据层:PDF 规范通过页面标签树(page label tree,即/PageLabels字典)记录若干"标签序列",每个序列覆盖一段连续或不连续的页面区间,并声明该区间采用的编号样式、前缀和起始偏移。

BentoPDF 的 Add Page Labels 工具正是围绕这套机制设计的:它允许你为同一个文档定义多条标签规则,把不同章节映射到不同的编号体系。例如:

  • 前言(front matter)用罗马数字i, ii, iii
  • 正文用十进制1, 2, 3
  • 附录用带字母前缀的A-1, A-2, B-1, B-2

从仓库类型声明可以看到 CPDF 引擎对页标签的完整支持面:除写入用的 addPageLabels 与清除用的 removePageLabels 外,还提供读取接口 getPageLabelStringForPage(返回指定页的完整标签字符串)以及枚举已有标签序列的接口,这意味着标签不仅可写,也可被读取和校验。

使用流程

按照 工具文档 的步骤,操作流程非常直接:

  1. 上传 PDF 文件;
  2. 选项面板出现,默认带有一条标签规则;
  3. 为每条规则配置页面范围、样式、可选前缀与起始值;
  4. 点击Add Rule为不同章节追加更多规则;
  5. 点击Add Page Labels应用所有规则并下载结果。

对应页面 UI 由 add-page-labels.html 承载:上传区(#drop-zone)同时支持点击选择与拖拽,加载成功后显示文件名、大小与页数({{size}} • {{count}} pages),随后展开选项面板。

上传阶段的两次校验

前端逻辑 add-page-labels-page.ts 在handleFiles中做了两层防护:

  1. 类型校验:文件 MIME 类型必须为application/pdf或文件名以.pdf结尾,否则弹出 "Invalid File";
  2. 加密检测:通过loadPdfDocument读取 PDF 后检查pdfDoc.isEncrypted,若为加密文档则提示 "Protected PDF",并建议先用 Unlock PDF 移除密码再上传。这也是页面 FAQ 中"能否处理密码保护 PDF"的标准答复。

标签规则配置详解

每条标签规则由 LabelRule 类型 定义:pageRangestyleprefixstartValueprogress五个字段。以下逐一展开。

页面范围(Page Range)

  • 留空:作用于全部页面(内部等价于cpdf.all(pdf));
  • 支持格式1-4(连续区间)、7(单页)、odd(奇数页)、1-9,30-40(不连续区间组合)。

注意:这里的页码指文件中的物理页序,而非 PDF 已显示的标签编号。源码中,非空范围会交给 CPDF 的parsePagespec(pdf, trimmedRange)解析,解析失败会抛出带有规则序号与范围的明确错误信息("Rule N has an invalid page range: …"),见 add-page-labels-page.ts。

标签样式(Label Style)

共六种样式,与 CPDF 的样式常量一一对应(常量值见 coherentpdf.global.d.ts):

样式示例CPDF 常量值
Decimal Arabic(十进制阿拉伯数字)1, 2, 3decimalArabic= 0
Uppercase Roman(大写罗马数字)I, II, IIIuppercaseRoman= 1
Lowercase Roman(小写罗马数字)i, ii, iiilowercaseRoman= 2
Uppercase Letters(大写字母)A, B, CuppercaseLetters= 3
Lowercase Letters(小写字母)a, b, clowercaseLetters= 4
No Label(仅前缀)如 "A-" 只显示前缀noLabelPrefixOnly= 5

样式选择器遍历 PAGE_LABEL_STYLE_OPTIONS 渲染下拉框;提交时由resolvePageLabelStyle将样式名映射为 CPDF 常量。该映射在 单元测试 中被逐一验证,NoLabelPrefixOnly在运行时常量缺失时回退为数值 5。

标签前缀(Label Prefix)

可选文本,前置到每个标签上。例如输入A-并配合默认起始值 1,可生成A-1, A-2, A-3。前缀会经过rule.prefix.trim()去除首尾空白后传入 CPDF。

起始值(Start Value)

编号开始的数值,默认 1;设为 0 可实现零基编号(配合前缀可生成A-0, A-1, A-2)。输入框限制为min=0, step=1的整数,提交前还会经过normalizePageLabelStartValue规范化:

  • 非有限数值(如 NaN)→ 回退为 1;
  • 负数 → 钳制为 0;
  • 小数 → 向下取整。

以上规则均有测试覆盖(见 page-labels.test.ts)。FAQ 还提到一个实用场景:从长书中截取的章节,把起始值设为 15 即可保留原文页码。

跨不连续区间连续编号(Continue numbering across disjoint ranges)

当一条规则的目标页面不连续(如1-9,30-40odd)时启用该选项,编号会在区间之间顺序延续;关闭时,每个独立页面块都会从起始值重新开始。该选项直接对应addPageLabelsprogress布尔参数,类型注释的解释是 "If true, labels continue the sequence"(见 coherentpdf.global.d.ts)。

移除已有标签(Remove existing page labels)

默认勾选,应用新规则前先用cpdf.removePageLabels(pdf)清空文档中已有的所有标签;取消勾选则只重标部分页面、保留其余页面的旧标签。

底层原理:CoherentPDF 引擎的完整调用链

该工具依赖 CoherentPDF(CPDF)WASM 引擎,处理完全发生在浏览器本地,PDF 文件不会离开设备。一次完整的"Add Page Labels"处理管线如下(见 addPageLabels 主流程):

  1. 前置检查isCpdfAvailable()判断 CPDF 是否已配置,未配置则调用showWasmRequiredDialog('cpdf')弹出配置引导(见 wasm-provider.ts);
  2. 加载引擎getCpdf()通过 cpdf-helper.ts 按配置的 URL 动态注入coherentpdf.browser.min.js,默认源为 CDN(仓库默认coherentpdf@2.5.5),并调用cpdf.setSlow?.()以较大堆配置运行;
  3. 读入文档cpdf.fromMemory(inputBytes, '')将文件字节载入 CPDF;
  4. 清旧标签:若勾选移除,调用cpdf.removePageLabels(pdf)
  5. 逐规则应用:对每条规则,用parsePagespec(或all)解析页面范围,再调用cpdf.addPageLabels(pdf, style, prefix, offset, range, progress)写入标签序列;
  6. 导出下载cpdf.toMemory(pdf, false, false)取回字节并校验非空,封装为application/pdf的 Blob 后触发下载;
  7. 资源清理finally中调用cpdf.deletePdf(pdf)释放 CPDF 内存。

WASM 引擎的 URL 可在 WASM Settings 页面 中配置,仓库的WasmProvider会校验存储 URL 的主机是否属于受信主机(内置 CDN 域名 + 环境变量VITE_WASM_CPDF_URL对应主机),非受信地址会被丢弃,具体逻辑见 wasm-provider.ts。配置 CPDF 时请注意其 AGPL-3.0 许可声明(配置弹窗中会明确提示)。

实战用例

来自 工具文档 的典型场景:

  • 书籍前言与正文:规则 1 设置1-4+ Lowercase Roman 得到i, ii, iii, iv;规则 2 设置5-20+ Decimal Arabic 得到1, 2, …,两条规则覆盖同一文档的不同区间;
  • 字母化附录:为附录页区间保留 Decimal Arabic 样式并输入前缀A-,默认起始值 1 即得A-1, A-2, A-3;再建一条前缀B-的规则处理下一个附录;
  • 扫描件修正:扫描 PDF 的物理页序与实际印刷页码不符时,用起始值把标签对齐到真实页码;
  • 技术文档零基编号:起始值设为 0;
  • 章节保持原页码:起始值设为原书页码(如 15),见页面 FAQ。

常见问题(FAQ)

页面内置了完整的 FAQ 区块(源码见 add-page-labels.html,文案位于 public/locales/en/tools.json):

  • 附录如何标成 A-1, A-2, A-3?为附录区间添加规则,样式保持 Decimal Arabic,前缀填A-,默认起始值 1 即可;第二个附录用前缀B-
  • 编号可以从 0 或非 1 开始吗?每条规则都有 Start Value 字段,默认 1,可改为 0 或任意整数。
  • "Continue numbering across disjoint ranges" 是做什么的?当一条规则覆盖不连续页(如1-9,30-40odd)且希望跨区间顺序计数时开启;关闭时各页面块各自从起始值重新开始。
  • PDF 已有的标签会怎样?默认勾选移除,旧标签先被清空再应用新规则;取消勾选则保留未涉及页面的旧标签。
  • 支持哪些区间格式?留空 = 全部页面,或使用1-47odd1-9,30-40等;注意指向物理页序而非已有标签。
  • 能处理加密 PDF 吗?不能直接处理,工具会提示 "Protected PDF",需先用 Unlock PDF 移除密码。
  • 为什么提示配置 CoherentPDF?页标签由 CPDF 引擎写入,默认从 CDN 加载;若自托管构建关闭了默认源,需在 WASM Settings 中指向本地副本。
  • 如何验证标签生效?用支持显示页标签的阅读器(如 Adobe Acrobat、Firefox 内置查看器)打开下载的 PDF,查看工具栏页码框——它显示的是标签(如ivA-1)而非纯页索引。

与相邻工具的关系

  • Page Numbers:把可见页码打印到页面上,而页标签是阅读器导航元数据、不打印。需要纸面可见编号时用前者。
  • Bates Numbering:跨一个或多个文件的顺序编号戳记(法律/审计文档常用),与页标签的元数据式编号互补。
  • Edit Bookmarks:组织 PDF 书签结构,与页标签一起构成文档导航体系。

工具本身注册于 src/js/config/tools.ts 的 PDF 工具列表中,且所有界面文案均通过 i18n 机制支持多语言(public/locales/下约二十种语言),中英文环境下呈现一致的功能行为。

小结

Add Page Labels 是 BentoPDF 中面向"文档导航元数据"的轻量工具:无需上传服务器,CPDF WASM 在浏览器内完成全部处理;六种编号样式 + 前缀 + 起始值 + 多规则组合,足以覆盖书籍、附录、扫描件与零基技术文档等绝大多数页码标签需求。核心实现集中在 add-page-labels-page.ts 与 page-labels.ts,配合 page-labels.test.ts 的测试,可进一步探索样式映射与起始值规范化的细节。

  • 前端

【免费下载链接】bentopdf

The Privacy First PDF Toolkit

项目地址:https://gitcode.com/gh_mirrors/be/bentopdf
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 16:07:45

PowerPMAC上位机开发实战:用C#构建Winform运动控制界面

去年接手一个三轴检测设备的上位机项目,厂家只留了一台装着 PowerPMAC 调试软件的工控机。操作员每天开工要盯着命令行窗口,敲一堆类似#1j/#2j/的指令做回零和点动,稍微按错一个符号,轴就停在半路。于是"做一个能给人用的 Wi…

作者头像 李华
网站建设 2026/9/21 15:55:11

Agent Harness Runtime 跑工具循环:Key 用 TaoToken

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

作者头像 李华