Skip to content

JavaScript API 参考

PDF Oxide 为 JavaScript 和 TypeScript 提供 WebAssembly 绑定。npm 包 pdf-oxide-wasm 同时支持 Node.js 和浏览器。

npm install pdf-oxide-wasm

关于 Rust API,请参见 Rust API 参考. 关于 Python API,请参见 Python API 参考. 关于类型详情,请参见 类型与枚举.


WasmPdfDocument

用于打开、提取、编辑和保存 PDF 的主要类.

import { WasmPdfDocument } from "pdf-oxide-wasm";

构造函数

new WasmPdfDocument(data)

从原始字节加载 PDF 文档。

参数 类型 描述
data Uint8Array PDF 文件内容

抛出: Error if the PDF is invalid or cannot be parsed.

const bytes = new Uint8Array(readFileSync("document.pdf"));
const doc = new WasmPdfDocument(bytes);

核心只读

pageCount() -> number

获取文档的页数。

version() -> Uint8Array

获取 PDF 版本,格式为 [major, minor]

const [major, minor] = doc.version();
console.log(`PDF ${major}.${minor}`);

authenticate(password) -> boolean

解密加密的 PDF。认证成功返回 true

参数 类型 描述
password string 密码字符串

has结构Tree() -> boolean

检查文档是否为带有结构树的 Tagged PDF。


文本提取

extractText(pageIndex) -> string

从单个页面提取纯文本。

参数 类型 描述
pageIndex number 从零开始的页码
const text = doc.extractText(0);

extractAllText() -> string

从所有页面提取纯文本,以换页符分隔。

extractChars(pageIndex) -> Array

提取逐字符精确位置和字体元数据。

参数 类型 描述
pageIndex number 从零开始的页码

返回值: Array of objects with fields:

字段 类型 描述
char string 字符
bbox {x, y, width, height} 边界框
font_name string 字体名称
font_size number 字体大小(磅)
font_weight string 字重(Normal、Bold 等)
is_italic boolean 斜体标志
color {r, g, b} RGB color (0.0–1.0)
const chars = doc.extractChars(0);
for (const c of chars) {
  console.log(`'${c.char}' at (${c.bbox.x}, ${c.bbox.y})`);
}

extractSpans(pageIndex) -> Array

提取带字体元数据的样式文本段。

参数 类型 描述
pageIndex number 从零开始的页码

返回值: Array of objects with fields:

字段 类型 描述
text string 文本内容
bbox {x, y, width, height} 边界框
font_name string 字体名称
font_size number 字体大小(磅)
font_weight string 字重(Normal、Bold 等)
is_italic boolean 斜体标志
color {r, g, b} RGB color (0.0–1.0)
const result = doc.extractPageText(0);
console.log(`Page: ${result.pageWidth}x${result.pageHeight} pt`);
for (const span of result.spans) {
  console.log(`'${span.text}' font=${span.fontName} size=${span.fontSize}`);
}
const spans = doc.extractSpans(0);
for (const span of spans) {
  console.log(`"${span.text}" size=${span.fontSize}`);
}

格式转换

toMarkdown(pageIndex, detectHeadings?, includeImages?, includeFormFields?) -> string

将单个页面转换为 Markdown。

参数 类型 默认值 描述
pageIndex number 从零开始的页码
detectHeadings boolean true 根据字体大小检测标题
includeImages boolean true 包含图片
includeFormFields boolean true 包含表单字段值

toMarkdownAll(detectHeadings?, includeImages?, includeFormFields?) -> string

将所有页面转换为 Markdown。

toHtml(pageIndex, preserveLayout?, detectHeadings?, includeFormFields?) -> string

将单个页面转换为 HTML。

参数 类型 默认值 描述
pageIndex number 从零开始的页码
preserveLayout boolean false 保留视觉布局
detectHeadings boolean true 检测标题
includeFormFields boolean true 包含表单字段值

toHtmlAll(preserveLayout?, detectHeadings?, includeFormFields?) -> string

将所有页面转换为 HTML。

toPlainText(pageIndex) -> string

将单个页面转换为纯文本。

toPlainTextAll() -> string

将所有页面转换为纯文本。


搜索

search(pattern, caseInsensitive?, literal?, wholeWord?, maxResults?) -> Array

在所有页面上搜索文本。

参数 类型 默认值 描述
pattern string 搜索模式(字符串或正则表达式)
caseInsensitive boolean false 大小写不敏感搜索
literal boolean false 将模式视为字面字符串
wholeWord boolean false 仅匹配完整单词
maxResults number 返回的最大结果数

返回值: Array of objects with fields:

字段 类型 描述
page number 页码
text string 匹配的文本
bbox object 边界框
start_index number 页面文本中的起始索引
end_index number 页面文本中的结束索引

searchPage(pageIndex, pattern, caseInsensitive?, literal?, wholeWord?, maxResults?) -> Array

在单个页面内搜索文本。


图片信息

extractImages(pageIndex) -> Array

获取页面的图片元数据。

字段 类型 描述
width number 图像宽度(像素)
height number 图像高度(像素)
color_space string Color space (e.g. DeviceRGB)
bits_per_component number 每通道位数
bbox object 页面上的位置

extractImageBytes(pageIndex) -> Array

从页面提取原始图片字节。 返回对象数组:

字段 类型 描述
width number 图像宽度(像素)
height number 图像高度(像素)
data Uint8Array 原始图片字节
format string 图像格式

pageImages(pageIndex) -> Array

获取图片名称和边界用于定位操作。

字段 类型 描述
name string XObject 名称
bounds number[] [x, y, width, height]
matrix number[] 变换矩阵 [a, b, c, d, e, f]

文档结构

getOutline() -> Array | null

获取文档书签/目录。 如果不存在大纲则返回 null

getAnnotations(pageIndex) -> Array

获取页面的注释元数据(类型、矩形、内容等)。

extractPaths(pageIndex) -> Array

从页面获取矢量路径(线条、曲线、形状)。

pageLabels() -> Array

获取页面标签范围。 返回对象数组:

字段 类型 描述
start_page number 此范围的第一页
style string 编号样式
prefix string 标签前缀
start_value number 起始数字

xmpMetadata() -> object | null

获取 XMP 元数据。 如果不存在则返回 null。 对象字段包括:

字段 类型 描述
dc_title string | null 文档标题
dc_creator string[] | null 创建者列表
dc_description string | null 描述
xmp_creator_tool string | null 创建工具
xmp_create_date string | null 创建日期
xmp_modify_date string | null 修改日期
pdf_producer string | null PDF 制作工具

表单字段

getFormFields() -> Array

获取所有表单字段。with name, type, value, and flags.

字段 类型 描述
name string 字段名称
field_type string 字段类型 (text, checkbox, etc.)
value string 当前值
flags number 字段标志
const fields = doc.getFormFields();
for (const f of fields) {
  console.log(`${f.name} (${f.field_type}) = ${f.value}`);
}

hasXfa() -> boolean

检查文档是否包含 XFA 表单。

getFormFieldValue(name) -> any

按名称获取表单字段值。根据字段类型返回 stringbooleannull

参数 类型 描述
name string 字段名称

setFormFieldValue(name, value) -> void

按名称设置表单字段值。

参数 类型 描述
name string 字段名称
value string | boolean 新字段值

exportFormData(format?) -> Uint8Array

导出表单数据为 FDF(默认)或 XFDF 格式。

参数 类型 默认值 描述
format string "fdf" 导出格式: "fdf" or "xfdf"

编辑

元数据

方法 参数 描述
setTitle(title) string 设置文档标题
setAuthor(author) string 设置文档作者
setSubject(subject) string 设置文档主题
setKeywords(keywords) string 设置文档关键词

页面旋转

方法 参数 描述
pageRotation(pageIndex) number 获取当前旋转角度(0、90、180、270)
setPageRotation(pageIndex, degrees) number, number 设置绝对旋转
rotatePage(pageIndex, degrees) number, number 在当前旋转基础上增加
rotateAllPages(degrees) number 旋转所有页面

页面尺寸

方法 参数 描述
pageMediaBox(pageIndex) number Get MediaBox [llx, lly, urx, ury]
setPageMediaBox(pageIndex, llx, lly, urx, ury) number, ... 设置 MediaBox
pageCropBox(pageIndex) number 获取 CropBox(可能为 null)
setPageCropBox(pageIndex, llx, lly, urx, ury) number, ... 设置 CropBox
cropMargins(left, right, top, bottom) number, ... 裁剪所有页面边距

擦除 / 涂白

方法 参数 描述
eraseRegion(pageIndex, llx, lly, urx, ury) number, ... 擦除区域
eraseRegions(pageIndex, rects) number, Float32Array 擦除多个区域
clearEraseRegions(pageIndex) number 清除待处理的擦除

注释与涂黑

方法 参数 描述
flattenPageAnnotations(pageIndex) number 扁平化页面上的注释
flattenAllAnnotations() 展平所有注释
applyPageRedactions(pageIndex) number 在页面上应用涂黑
applyAllRedactions() 应用所有涂黑

表单扁平化

方法 参数 描述
flattenForms() 将所有表单字段扁平化到页面内容中
flattenFormsOnPage(pageIndex) number 扁平化特定页面的表单

合并与嵌入

mergeFrom(data) -> number

从另一个 PDF 合并页面。返回合并的页数。

参数 类型 描述
data Uint8Array 源 PDF 文件字节

embedFile(name, data) -> void

将文件附加到 PDF。

参数 类型 描述
name string 附件文件名
data Uint8Array 文件内容

图片操作

方法 参数 描述
repositionImage(pageIndex, name, x, y) number, string, number, number 移动图片
resizeImage(pageIndex, name, w, h) number, string, number, number 调整图片大小
setImageBounds(pageIndex, name, x, y, w, h) number, string, ... 设置图片边界

渲染

方法 参数 返回值 描述
renderPage(pageIndex, dpi?) number, number Uint8Array 将页面渲染为 PNG 字节
flattenToImages(dpi?) number Uint8Array 将所有页面扁平化为基于图像的 PDF

保存

saveToBytes() -> Uint8Array

将编辑后的 PDF 保存为字节。

saveEncryptedToBytes(password, ownerPassword?, allowPrint?, allowCopy?, allowModify?, allowAnnotate?) -> Uint8Array

使用 AES-256 加密保存。

参数 类型 默认值 描述
password string 用户密码
ownerPassword string user password 所有者密码
allowPrint boolean true 允许打印
allowCopy boolean true 允许复制
allowModify boolean false 允许修改
allowAnnotate boolean true 允许添加注释

free()

释放 WASM 内存。处理完文档后务必调用此方法。


WasmPdf

用于创建新 PDF 的工厂类。

import { WasmPdf } from "pdf-oxide-wasm";

静态方法

WasmPdf.fromMarkdown(content, title?, author?) -> WasmPdf

从 Markdown 文本创建 PDF。

参数 类型 默认值 描述
content string Markdown 内容
title string 文档标题
author string 文档作者

WasmPdf.fromHtml(content, title?, author?) -> WasmPdf

从 HTML 创建 PDF。

WasmPdf.fromText(content, title?, author?) -> WasmPdf

从纯文本创建 PDF。

WasmPdf.fromImageBytes(data) -> WasmPdf

从图片字节创建单页 PDF。

参数 类型 描述
data Uint8Array 图片文件字节(JPEG、PNG)

WasmPdf.fromMultipleImageBytes(imagesArray) -> WasmPdf

从多张图片创建多页 PDF,每页一张图片。

参数 类型 描述
imagesArray Uint8Array[] 图片文件字节数组

实例方法

toBytes() -> Uint8Array

获取 PDF 字节数据。

size -> number

PDF 大小(字节,只读属性)。

const pdf = WasmPdf.fromMarkdown("# Hello World\n\nThis is a PDF.");
console.log(`PDF size: ${pdf.size} bytes`);
writeFileSync("output.pdf", pdf.toBytes());

功能可用性

某些功能需要原生依赖,在 WebAssembly 中不可用:

功能 WASM 说明
文本提取 Yes 完全支持
结构化提取 Yes 字符、文本段
PDF 创建 Yes Markdown、HTML、文本、图片
PDF 编辑 Yes 元数据、旋转、尺寸、擦除
表单字段 Yes 读取、写入、导出、扁平化
Search Yes 完全正则支持
加密 Yes AES-256 读写
Annotations Yes 读取、扁平化、涂黑
合并 PDF Yes 从另一个 PDF 合并页面
嵌入文件 Yes 将文件附加到 PDF
Page labels Yes 读取页面标签范围
XMP metadata Yes 读取 XMP 元数据
OCR No 需要原生 ONNX 运行时
数字签名 No 需要原生加密库
页面渲染 No 需要原生 tiny-skia
Barcodes No 需要原生渲染
Office 转换 No 需要原生 LibreOffice

错误处理

所有可能失败的方法都会抛出 JavaScript Error 对象:

try {
  const doc = new WasmPdfDocument(new Uint8Array([0, 1, 2]));
} catch (e) {
  console.error(`Failed to open: ${e.message}`);
}

TypeScript

完整的类型定义包含在包中:

import { WasmPdfDocument, WasmPdf } from "pdf-oxide-wasm";

const doc: WasmPdfDocument = new WasmPdfDocument(bytes);
const text: string = doc.extractText(0);
const pdf: WasmPdf = WasmPdf.fromMarkdown("# Hello");