Початок роботи з PDF Oxide (WASM)
PDF Oxide компілюється в WebAssembly і працює у браузерах, Deno, Bun та edge-рантаймах — Cloudflare Workers, Vercel Edge. Те саме ядро на Rust, що живить прив’язки для Python, Rust, Node.js, Go та C#, виконується в будь-якому 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();
Структуроване видобування
Дані за символами та спанами з координатами й метаданими шрифтів:
// Дані за символами
const chars = doc.extractChars(0);
for (const c of chars) {
console.log(`'${c.char}' at (${c.bbox.x}, ${c.bbox.y}) font=${c.fontName}`);
}
// Дані за спанами
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
Створюйте нові PDF з Markdown, HTML чи звичайного тексту за допомогою WasmPdf:
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 – використання PDF Oxide з Python
- Швидкий старт Rust – використання PDF Oxide з Rust
- Довідник JavaScript API – повна документація WASM API
- Видобування тексту – детальні параметри видобування
- Створення PDF – розширене створення документів