帕皮拉语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相对,以及这些默认背后的测量.
麻省理工学院.