新しいONLYOFFICEのPDFエディターAPIでPDFコンテンツを操作する
ONLYOFFICEに新しいPDF APIが導入され、PDFでのマクロサポートが実現しました。これらの新しいメソッドを使うと、PDFドキュメントをプログラムで操作でき、手動で行っていた作業を自動化できます。この記事では、新しいAPIで何ができるかを示す実践的なマクロを3つ紹介していきます。

新しいPDF APIメソッド
3つのマクロ例で使用する新しいメソッドの概要をご紹介します。
- GetPagesCount() — PDFドキュメントの総ページ数を返します。
- GetPage(index) — インデックスで指定したページオブジェクト(ApiPage)を取得します。
- GetAllAnnots() — 指定したページ上のすべてのアノテーションオブジェクトの配列を返します。
- GetContents() — アノテーションのテキストコンテンツを取得します。
- GetAllDrawings() — すべての描画オブジェクト(図形、グラフ、画像)の配列を返します。
- SetPosition(x, y) — 絶対座標を使って、描画オブジェクトをページ上の任意の位置に配置します。
- AddObject(object) — 描画オブジェクト(図形、グラフ、画像)を特定のページに追加します。
- Delete() — 指定したオブジェクトをドキュメントから削除します。
これらのメソッドは、ApiDocument、ApiPage、ApiBaseAnnotation、ApiDrawingの各クラスに属しており、既存のOffice APIメソッドと組み合わせて使用できます。
例1:キーワードでアノテーションを削除する
最初のマクロは、特定のキーワードを含むアノテーションをすべて検索して削除します。順を追って解説していきましょう。
キーワードとドキュメントの設定
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変数を変更するだけです。

例2:すべての描画オブジェクトを削除する
このマクロはすべてのページをスキャンして描画オブジェクトをすべて削除します。または特定の種類のみを削除することも可能です。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変数を変えるだけで、全削除と選択削除を切り替えられ、その他のコードを変更する必要はありません。

例3:すべてのページに透かしを追加する
最後のマクロは、カスタマイズ可能な透かし図形を作成し、ドキュメントのすべてのページに配置します。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);
}
})();
透かしはテキストコンテンツを持つ標準的な図形から構成されており、控えめな背景ラベルからページ全体に広がる大きなスタンプまで、外観を自由にコントロールできます。図形のサイズやフォントスタイル、回転角度を変えながら、ドキュメントに最適な見た目を追求してみましょう。

この3つのマクロはあくまで出発点です。新しいPDF APIはPDFワークフローの自動化に向けたさらに多くの可能性を切り開いています。これらのメソッドを組み合わせることで、特定のニーズに合わせたより高度なマクロを構築できます。詳細は、以下のAPIドキュメントやマクロサンプルをぜひご覧ください。質問がある場合や、作ったものをシェアしたい場合は、お気軽にお問い合わせください!
ONLYOFFICEの無料アカウントを登録する
オンラインでドキュメント、スプレッドシート、スライド、フォーム、PDFファイルの閲覧、編集、共同作業

