@build-qube/papyra

中文文档
0.8.0发布于 2026/10/27MITTypeScriptES Module构建来源已验证近 30 天下载 4632

由 Rust 驱动的节点和浏览器快速 PDF 渲染

中文使用文档
文档目录10 节
  1. 安装
  2. 绘制一页
  3. 缩略图
  4. 说急事
  5. 导出、文本和大纲
  6. 链接,标签, 以及文件对自己的内容
  7. 旋转视图
  8. 有三件事会咬你
  9. 发动机
  10. 再来

帕皮拉语name

节点快速 PDF 渲染 财务报告和审定财务报表 浏览器,从一个 Rust 核心。 发动机 (单位:千美元)红花页:1 二进制船和没有安装.

安装

npm install @build-qube/papyra

本地加通和浏览器是作为可选的依赖关系构建船; 您 软件包管理器选择正确的一个.

绘制一页

import { open, paintToCanvas } from '@build-qube/papyra';

const doc = await open(file); // Uint8Array | ArrayBuffer | Blob | File
const page = await doc.renderPage(0, { fitWidth: 1600 });

paintToCanvas(page, canvas);

renderPage 绝不屏蔽事件循环 . page 被紧紧包装 RGBA8,所以 paintToCanvas 这是一种便利而不是唯一的途径—— toImageData,则 编码器,或你自己的缓冲器处理同一字节的所有工作.

缩略图

stream 平分页时, 以货币表示:

for await (const { page, bitmap } of doc.stream({ fitWidth: 160 })) {
  paint(page, bitmap);
}

说急事

papyra并不猜测哪一页很重要——一个查看者知道屏幕上的内容和 图书馆没有。 附加优先级, 队列将尊重它 . 先放低一点, (中文(简体) ), 而默认是最紧急的一级, 所以不关心的呼叫者可以忽略这一点 完全没有.

const doc = await open(file, { concurrency: 4 }); // viewers want a narrow pool

// Thumbnails yield to whatever is on screen.
for await (const t of doc.stream({ fitWidth: 160, priority: 2 })) { /* … */ }

// Reprioritise on scroll instead of cancelling and resubmitting.
const job = doc.render(12, { fitWidth: 1600, priority: 2 });
onScroll(() => job.setPriority(isVisible(12) ? 0 : 3));

对同一页大小的请求合并为一个渲染。 待定工作 自由重排; 已经运行的工作永远不会中断 .

导出、文本和大纲

const image = await doc.renderImage(0, { fitWidth: 2000 });
await writeFile('page-0.webp', (await image.toWebp()).bytes);

for await (const hit of doc.search('site plan')) {
  highlight(hit.page, hit.rects);
}

for (const node of await doc.outline()) {
  if (node.page !== null) goTo(node.page);
}

renderImage 保持像素在Rust 和编码的需求,所以除了 完成的文件交叉进入JS. 对于必须存活下来的产出 doc.renderSvg(0),它返回向量标记而不是像素,因此不需要 大小和无质量.

const scale = rendered.width / doc.pageSize(index).width;
for (const link of await doc.links(index)) {
  const box = scaleRect(link.rect, scale);
  if (link.target.kind === 'uri') openExternally(link.target.uri);
  else goTo(link.target.dest.page);
}

const labels = await doc.pageLabels();
const shown = labels[index] || String(index + 1);   // "iv", not "4"

doc.metadata.title;   // null when the document never said
doc.fingerprint;      // stable key for per-document state

链接矩形与所提取的文本相同——从上到左的72 DPI, 采用旋转方式——这样一来,就把它们放在任何成份上. pageLabels() 为空 当文档定义了没有标签时,这是您按索引向数字发出的信号.

加密文件抛出 PasswordRequiredError 或者说 IncorrectPasswordError两者 扩展 PasswordError 带有 retry 旗下,所以一个对话框处理冷问和 错误的答案.

旋转视图

const vp = viewport(doc.pageSize(index), { fitWidth: 1600, rotation: 90 });

paintToCanvas(await doc.renderPage(index, { dpi: vp.dpi }), canvas, {
  rotation: vp.rotation,
});
const box = viewportRect(link.rect, vp);   // the link layer, turned to match

页面会变成不旋转, 画布会转弯, 所以一个旋转按钮不花费 调制。 大小通过视图端口而不是与 fitWidth 直接: 转动 屏幕上的宽度是页面的高度,和 vp.dpi 带回答案.

Renders 默认绘制注释 。 过 { annotations: false } 当你在画的时候 您自己的链接或突出显示层,或者它们两次出现.

有三件事会咬你

大小为 fitWidth没有 dpi。 。 。 . 页面区域因数量级而异。 在一个 固定 36 DPI,US Letter是一款216x279缩略图,而一款42x30in绘图是一款1512x1080, 6.5 MB图像. 按输出宽度大小保持成本与实际成正比 显示; 超过 100 MP 被直接拒绝 .

浏览器的构建需要交叉起源隔离. 它使用共享的原生记忆,所以 SharedArrayBuffer 必须具备。 服务你的页面:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

浏览器建设中的恐慌是致命的. 它中止了原案例和papyra 失败, 直至页面重新装入; 在本地是被拒绝的许诺 .

发动机

其他引擎——为无法隔离的页面提供pdf.js,Tauri,以及实验性 文字和权力点 @build-qube/papyra/office - 包含在 引擎指南。 。 。 . 用另一个引擎导入的打开文档的代码 @build-qube/papyra/core, (中文(简体) ), 它从来不装上papyra的原子弹.

再来

这个 完整 API 参考 从 这些来源,所以它从来没有从它们漂移。 这个 项目README 涵盖结构、基准 与pdf.js相对,以及这些默认背后的测量.

麻省理工学院.

版本与发布记录

@build-qube/papyra 共发布 11 个版本,首次发布于 2026/08/27;过去 12 个月发布了 11 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.8.0latest2026/10/2713 天前
0.7.12026/10/2415 天前
0.7.02026/10/2416 天前
0.6.02026/10/2316 天前
0.5.02026/10/2317 天前
0.4.02026/10/081 个月前

关于 @build-qube/papyra 的常见问题

@build-qube/papyra 是什么?

由 Rust 驱动的节点和浏览器快速 PDF 渲染

如何安装 @build-qube/papyra?

在项目目录运行 npm install @build-qube/papyra,或使用 pnpm add / yarn add / bun add。

@build-qube/papyra 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@build-qube/papyra 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@build-qube/papyra 可以商用吗?

@build-qube/papyra 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@build-qube/papyra 的下载量有多少?

根据 npm 官方下载统计,@build-qube/papyra 在 2026/10/09 – 2026/11/07 这 30 天内被下载 4,632 次,日均约 154 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@build-qube/papyra 还在维护吗?

最新版本 0.8.0 发布于 2026/10/27(13 天前);至今共发布 11 个版本,其中过去 12 个月发布了 11 个;首次发布于 2026/08/27。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。