PDF Oxide (WASM) 快速上手
PDF Oxide 可编译为 WebAssembly,在浏览器、Deno、Bun 以及 Cloudflare Workers、Vercel Edge 等 Edge 运行时中运行。驱动 Python、Rust、Node.js、Go 与 C# 绑定的同一套 Rust 内核,在任意 JavaScript 环境中以接近原生的速度直接执行。
使用 Node.js? 在服务端更推荐使用原生 N-API 插件
pdf-oxide:速度更快,并原生支持 OCR、渲染和数字签名。本页的 WASM 版本适合无法加载原生插件的浏览器和 Edge 运行时。
安装
npm install pdf-oxide-wasm
import { WasmPdfDocument, WasmPdf } from "pdf-oxide-wasm";
快速上手
Node.js
import { readFileSync } from "fs";
import { WasmPdfDocument } from "pdf-oxide-wasm";
const bytes = new Uint8Array(readFileSync("document.pdf"));
const doc = new WasmPdfDocument(bytes);
console.log(`Pages: ${doc.pageCount()}`);
console.log(doc.extractText(0));
doc.free();
浏览器
<script type="module">
import init, { WasmPdfDocument } from "pdf-oxide-wasm";
await init();
const response = await fetch("document.pdf");
const bytes = new Uint8Array(await response.arrayBuffer());
const doc = new WasmPdfDocument(bytes);
console.log(`Pages: ${doc.pageCount()}`);
console.log(doc.extractText(0));
doc.free();
</script>
浏览器文件上传
<input type="file" id="pdfInput" accept=".pdf" />
<pre id="output"></pre>
<script type="module">
import init, { WasmPdfDocument } from "pdf-oxide-wasm";
await init();
document.getElementById("pdfInput").addEventListener("change", async (e) => {
const file = e.target.files[0];
const bytes = new Uint8Array(await file.arrayBuffer());
const doc = new WasmPdfDocument(bytes);
let result = `Pages: ${doc.pageCount()}\n\n`;
for (let i = 0; i < doc.pageCount(); i++) {
result += `--- Page ${i + 1} ---\n`;
result += doc.extractText(i) + "\n\n";
}
document.getElementById("output").textContent = result;
doc.free();
});
</script>
文本提取
单页
const doc = new WasmPdfDocument(bytes);
const text = doc.extractText(0);
所有页
const allText = doc.extractAllText();
结构化提取
按字符和按 span 获取位置和字体元数据:
// 字符级数据
const chars = doc.extractChars(0);
for (const c of chars) {
console.log(`'${c.char}' at (${c.bbox.x}, ${c.bbox.y}) font=${c.fontName}`);
}
// span 级数据
const spans = doc.extractSpans(0);
for (const span of spans) {
console.log(`"${span.text}" size=${span.fontSize}`);
}
Markdown 转换
const markdown = doc.toMarkdown(0);
// 带选项
const md = doc.toMarkdown(0, true, true); // detect_headings, include_images
// 所有页
const allMarkdown = doc.toMarkdownAll();
HTML 转换
const html = doc.toHtml(0);
// 所有页
const allHtml = doc.toHtmlAll();
创建 PDF
使用 WasmPdf 从 Markdown、HTML 或纯文本创建新的 PDF:
import { WasmPdf } from "pdf-oxide-wasm";
// 从 Markdown 创建
const pdf = WasmPdf.fromMarkdown("# Hello World\n\nThis is a PDF.");
const pdfBytes = pdf.toBytes(); // Uint8Array
// 从 HTML 创建
const invoice = WasmPdf.fromHtml("<h1>Invoice</h1><p>Amount: $42</p>");
// 从纯文本创建
const notes = WasmPdf.fromText("Plain text content.");
// 保存到文件(Node.js)
import { writeFileSync } from "fs";
writeFileSync("output.pdf", pdf.toBytes());
表单字段
const fields = doc.getFormFields();
for (const f of fields) {
console.log(`${f.name} (${f.fieldType}) = ${f.value}`);
}
// 导出表单数据
const fdfBytes = doc.exportFormData(); // FDF 格式
const xfdfBytes = doc.exportFormData("xfdf"); // XFDF 格式
搜索
// 搜索所有页
const results = doc.search("configuration", true); // case_insensitive
for (const r of results) {
console.log(`Found "${r.text}" on page ${r.page}`);
}
// 仅搜索单页
const pageResults = doc.searchPage(0, "configuration", true);
从字节打开
WasmPdfDocument 构造函数直接接收 Uint8Array,无需单独的 from_bytes 方法:
// 直接可用 —— WasmPdfDocument 接受字节
const doc = new WasmPdfDocument(uint8Array);
加密 PDF
const doc = new WasmPdfDocument(encryptedBytes);
const success = doc.authenticate("password");
if (success) {
console.log(doc.extractText(0));
}
编辑
const doc = new WasmPdfDocument(bytes);
// 元数据
doc.setTitle("Updated Title");
doc.setAuthor("Jane Doe");
// 旋转页面
doc.rotatePage(0, 90);
// 保存修改
const edited = doc.save();
// 加密保存
const encrypted = doc.saveEncryptedToBytes(
"user-password",
"owner-password",
true, // allow_print
true, // allow_copy
false, // allow_modify
true // allow_annotate
);
内存管理
WASM 对象持有 Rust 内存,必须显式释放:
const doc = new WasmPdfDocument(bytes);
try {
const text = doc.extractText(0);
} finally {
doc.free();
}
功能支持
部分功能依赖原生组件,在 WebAssembly 构建中不可用:
| 功能 | WASM | 说明 |
|---|---|---|
| 文本提取 | 支持 | 完整支持 |
| 创建 PDF | 支持 | Markdown、HTML、文本 |
| 编辑 PDF | 支持 | 完整支持 |
| 加密 | 支持 | AES-256 |
| OCR | 不支持 | 需原生 ONNX Runtime |
| 数字签名 | 不支持 | 需原生加密库 |
| 页面渲染 | 不支持 | 需原生 tiny-skia |
如需 OCR 或渲染,请使用 Python 或 Rust 绑定。
下一步
- Python 快速上手 – 在 Python 中使用 PDF Oxide
- Rust 快速上手 – 在 Rust 中使用 PDF Oxide
- JavaScript API 参考 – 完整的 WASM API 文档
- 文本提取 – 详细的提取选项
- 创建 PDF – 进阶创建方法