知行札记
专题技术实践文档与编辑工具

PDF 生成、操作、预览与提取

按排版生成、浏览器打印、页面操作和内容提取组织 PDF 工程链路。

四类任务有不同输入

PDF 排版生成从结构化内容和排版规则构成页面;HTML 打印从浏览器布局生成页面;页面操作读取已有 PDF 并合并、拆分或填表;预览和文本提取解释 PDF 内容。选择工具应先确定需要哪一类操作。

PDF 的视觉布局和可编辑语义不同。文字可能保存为独立定位片段,表格不必作为表格结构保存;扫描页主要是图片。提取出的字符串顺序不自动代表阅读顺序,图片 PDF 也不会因为调用文本提取 API 就拥有文字。

结构化内容生成页面

@react-pdf/renderer 使用 Document、Page、Text、View 等 PDF 组件,并支持对应样式与字体。它有自己的排版系统,网页 DOM 和任意 CSS 不能直接移植。React PDF 组件

中文生成需要注册并嵌入包含所需字形的字体,还要明确粗体、斜体和回退。字体文件许可、尺寸和子集化影响交付。长表格、跨页段落、页眉页脚和不可拆分区块应通过实际样本检查,文本提取通过不足以证明没有裁切或重叠。

页面尺寸、单位、边距、行高和分页规则形成一组排版约束。复用网页主题时只映射 PDF 所支持的值;Tailwind 包装器也只转换其支持子集。生成服务需要控制并发和内存,字体注册及渲染状态依库规则管理。

HTML 打印建立在浏览器布局上

Puppeteer 的 page.pdf() 按打印媒体规则生成 PDF,可以在需要时切换媒体类型;参数控制页面、背景和边距。Page.pdf

一条打印任务通常先创建隔离页面、加载受控模板与数据、等待字体和必要资源,再打印并释放页面。页面 ready 和网络短暂空闲是不同条件:长连接、异步组件和失败图片会影响就绪。应用应给出明确渲染完成信号和总超时。

模板引用远程资源时,需要限制访问对象;无控制地打印用户 URL 或加载任意 HTML 可能访问内部服务。浏览器沙箱、网络策略和容器权限应按实际环境配置,不能把 --no-sandbox 写成全部容器的必需设置。

复用浏览器进程、按任务隔离 context 或 page,可以降低启动成本,但应防止 cookie、缓存和状态在任务间串用。并发队列要控制页面数量和内存;失败与取消均清理资源。Playwright 的 Chromium 打印能力是另一种接入选择,项目已有浏览器依赖时可评估复用,不必机械安装两套。

合并与拆分保存什么

pdf-lib 可以读取文档、复制页面并生成新的 PDF。下面为合并片段,输入和输出为字节,未处理加密、损坏文件或资源限制。pdf-lib 页面复制

import { PDFDocument } from 'pdf-lib';

export async function mergePdfs(inputs: Uint8Array[]) {
  const output = await PDFDocument.create();
  for (const input of inputs) {
    const source = await PDFDocument.load(input);
    const pages = await output.copyPages(source, source.getPageIndices());
    pages.forEach((page) => output.addPage(page));
  }
  return output.save();
}

页面复制是否保留书签、表单字段、附件、签名与文档元数据,需要按目标能力核对;页面视觉保留不能替代这些条件。修改已经签名的文档会影响签名有效性,应明确修改后的成果性质。

填写表单、绘制文字和合并页面是不同操作。内置拉丁字体通常不足以覆盖中文,应嵌入合适字体;表单 appearance 和普通页面文本也需分别处理。错误、加密密码及页数上限应在入口转换为明确任务结果。

预览与文本提取

PDF.js 提供浏览器 PDF 解释与显示能力。PDF.js 官方主页 预览组件还需处理 Worker 来源、资源、缩放、页码、selection、链接和可访问交互,预览窗口不自动成为任意文件的安全边界。

Node 中可以用基于 PDF.js 的工具进行文本提取。提取结果需要保留页码及来源身份,再处理页眉页脚、断词、分栏和阅读顺序。把所有页面拼成一条文本会丢失后续检索与引用所需的位置。

扫描件需要 OCR;包含少量文本的混合页也可能需要按页判断。OCR 输出具有识别误差和坐标关系,不能直接视为原始事实。文本提取、OCR 和表格结构恢复是不同能力,选择流程前先查看实际样本类型。

DOM 截图与真实文本 PDF

将 DOM 截图为 canvas,再把长图片切成 A4 页,可以保留部分视觉外观,但容易在任意高度切断行、形成较大的栅格文件,并降低文字检索、选择及可访问性。跨域图片、字体、动画和 canvas 大小还会影响截图。

适合输出海报或视觉快照的路线,与正式长文档的需求不同。需要可检索文本、语义标签及稳定分页时,应评估结构排版或浏览器打印。可访问 PDF 参数只是能力入口,最终阅读顺序和标签结构仍需要检查。

让结论对应实际检查

生成后的页数、文本和页面尺寸可通过代码检查;图像、裁切、分页、字体和印刷外观需要渲染审阅;目标阅读器表单和链接需要相应应用观察。性能结论保留文件类型、页数、资源和环境。

本页吸收归档 PDF 与 Office 实践,示例未运行。归档的包版本、停更判断和固定行数上限不作为当前技术事实;采用时锁定依赖,检查真实输入、许可证和任务所需能力。

最后更新于

本页目录