近日,ONLYOFFICE 正式推出全新 PDF API,为 PDF 文档带来了宏支持。借助这套新增的 API 方法,您可以以编程方式与 PDF 文档交互,自动化处理那些原本需要手动完成的任务。本文将通过 3 个实用的宏示例,带你解锁这套 API 的核心能力与实战场景。

关于 ONLYOFFICE 文档
ONLYOFFICE 是一个开源项目,专注于高级和安全的文档处理,是在线办公解决方案的提供者,全球用户已超过1500万。
ONLYOFFICE 办公套件提供文本文档、电子表格、幻灯片、表单和 PDF 编辑器。ONLYOFFICE 文档高度兼容 MS Office 格式,并提供数百种格式化和样式工具,以及多种协作功能。在智能办公方面,它深度集成了 AI 插件功能,用户可在编辑器内直接调用任意 AI 模型(如 DeepSeek、ChatGPT、通义千问、Kimi 等),无需在不同网页或应用间反复切换。

全新 PDF API****方法概览
以下是 3 个宏示例中用到的 API 方法说明:
- GetPagesCount (): 返回 PDF 文档的总页数。
- GetPage (index): 通过索引获取指定页面对象,返回一个 ApiPage 对象。
- GetAllAnnots(): 返回指定页面上所有批注对象组成的数组。
- GetContents (): 获取批注的文本内容。
- GetAllDrawings (): 返回指定页面上所有绘图对象(形状、图表、图片)组成的数组。
- SetPosition (x, y): 通过绝对坐标,将绘图对象精准定位到页面指定位置。
- AddObject (object): 向指定页面添加绘图对象(形状、图表、图片)。
- Delete (): 从文档删除指定对象。
上述方法隶属于 ApiDocument、ApiPage、ApiBaseAnnotation 和 ApiDrawing 类,可与你已熟知的现有 Office API 方法搭配使用。
示例一:按关键词删除批注
第一个宏可自动查找并删除所有包含指定关键词的批注,以下是分步实现说明。
设置关键词和文档
const KEYWORD = "example";
const doc = Api.GetDocument();
const pagesCount = doc.GetPagesCount();
let deletedCount = 0;
首先,我们定义目标关键词:任何内容包含此词的注释都将被移除。接着,我们获取当前文档,并使用 GetPagesCount() 函数得到总页数。deletedCount 变量将用于追踪我们删除了多少个注释。
for (let i = 0; i < pagesCount; i++) {
const page = doc.GetPage(i);
const annots = page.GetAllAnnots();
if (!annots || annots.length === 0) continue;
通过 for 循环遍历文档的每一页。对每一页,使用 GetPage () 获取 ApiPage 页面对象,再通过 GetAllAnnots () 获取该页的所有批注。若当前页面无批注,则直接跳过,进入下一页循环。
匹配并删除批注
for (let j = annots.length - 1; j >= 0; j--) {
const annot = annots[j];
const contents = (annot.GetContents() || "").toLowerCase();
在每一页中,我们以逆向顺序遍历注释。逆向迭代很重要,因为在正向遍历数组时删除元素会导致索引偏移和元素跳过。对每个批注,通过 GetContents () 提取其文本内容,并转换为小写,以便进行不区分大小写的比较。
if (contents.includes(KEYWORD.toLowerCase())) {
annot.Delete();
deletedCount++;
}
若批注文本包含目标关键词,调用 Delete () 方法将其从文档中删除,并增加计数器的值
console.log("Deleted annotations containing keyword:", KEYWORD);
console.log("Total deleted:", deletedCount);
最后,宏会将搜索的关键词以及删除的批注总数记录到控制台。
完整宏代码:
(function () {
const KEYWORD = "example";
const doc = Api.GetDocument();
const pagesCount = doc.GetPagesCount();
let deletedCount = 0;
for (let i = 0; i < pagesCount; i++) {
const page = doc.GetPage(i);
const annots = page.GetAllAnnots();
if (!annots || annots.length === 0) continue;
for (let j = annots.length - 1; j >= 0; j--) {
const annot = annots[j];
const contents = (annot.GetContents() || "").toLowerCase();
if (contents.includes(KEYWORD.toLowerCase())) {
annot.Delete();
deletedCount++;
}
}
}
console.log("Deleted annotations containing keyword:", KEYWORD);
console.log("Total deleted:", deletedCount);
})();
宏运行后,文档中包含指定关键词的每一个注释都会被移除。要指定其他的关键词,只需更新代码顶部的 KEYWORD 变量即可。

示例二:删除所有绘图对象
此宏会扫描每一页并删除所有绘图对象,或仅删除特定类型。它使用 GetAllDrawings() 函数来获取每页上的所有视觉元素,并在删除前使用 GetClassType() 检查其类型。
顶部的 targetType 变量控制要删除的内容。将其设为"all"以删除所有绘图对象,或使用"shape"、"image"、"chart"来针对特定类型的绘图。
(function () {
const doc = Api.GetDocument();
const pagesCount = doc.GetPagesCount();
let totalDeleted = 0;
const targetType = "all";
for (let i = 0; i < pagesCount; i++) {
const page = doc.GetPage(i);
const drawings = page.GetAllDrawings();
for (let j = 0; j < drawings.length; j++) {
if (targetType === "all" || drawings[j].GetClassType() === targetType) {
drawings[j].Delete();
totalDeleted++;
}
}
}
console.log("Deleted " + totalDeleted + " drawing(s) from " + pagesCount + " page(s).");
})();
无论您是为了打印准备文档、移除过时的图表,还是在重新分发前去除图片:这个宏都能搞定。通过调整 targetType 变量,您可以在全面清理和选择性清理之间切换,而无需修改代码的其他部分。

示例三:为每一页添加水印
我们的最后一个宏创建了一个可自定义的水印形状,并将其放置在文档的每一页上。它使用 SetPosition() 将形状精确放置在页面坐标上,并使用 AddObject() 将其添加到每一页。
所有关键属性都在顶部定义为变量,便于调整水印文本、颜色、字体大小、位置和旋转角度。
(function () {
const doc = Api.GetDocument();
const pagesCount = doc.GetPagesCount();
const watermarkText = "DRAFT";
const bgColor = Api.CreateRGBColor(200, 200, 200);
const textColor = Api.CreateRGBColor(255, 255, 255);
const fontSize = 72;
const positionX = 1200000;
const positionY = 4000000;
const rotation = -45;
for (let i = 0; i < pagesCount; i++) {
const page = doc.GetPage(i);
const fill = Api.CreateSolidFill(bgColor);
const stroke = Api.CreateStroke(0, Api.CreateNoFill());
const watermark = Api.CreateShape("rect", 160 * 36000, 20 * 36000, fill, stroke);
watermark.SetPosition(positionX, positionY);
watermark.SetRotation(rotation);
const content = watermark.GetContent();
const para = content.GetElement(0);
para.SetJc("center");
const run = para.AddText(watermarkText);
run.SetFontSize(fontSize);
run.SetBold(true);
run.SetFill(Api.CreateSolidFill(textColor));
page.AddObject(watermark);
}
})();
水印由带有文本内容的标准形状构建,让您可以完全控制其外观:从微妙的背景标签到醒目的全页印章。您也可以尝试不同的形状大小、字体样式或旋转角度,为您的文档找到最合适的外观。

这三个宏只是一个起点:全新的 PDF API 为您自动化 PDF 工作流开启了更多可能性。您可以组合这些方法,构建更高级、更贴合您特定需求的宏。探索下方链接的 API 文档和宏示例,获取更多灵感。如果您有任何疑问或想分享您的成果,随时联系我们!
立即使用 ONLYOFFICE PDF API 实现自动化办公
对于开发者而言,ONLYOFFICE PDF API 提供了一套实用工具,可将 PDF 处理功能集成到现有系统中。欢迎使用 ONLYOFFICE PDF API ,自动化处理 PDF 内容。
立即使用
https://api.onlyoffice.com/zh-CN/docs/office-api/usage-api/pdf-api/