C++で開発したアプリケーションに「Word文書をPDFとして出力したい」という要件が発生することは少なくありません。帳票出力やレポート生成機能など、実務的なシーンで必要になるケースが多いです。
しかし、C++でWord文書の変換処理を一から実装するのは現実的ではありません。OfficeのCOMオートメーションを使う方法もありますが、Windows環境に限定されるうえ、Microsoft Officeのインストールが前提となります。また、サーバー環境でのCOMオートメーション利用は、Microsoft自身が推奨していないという背景もあります。
本記事では、こうした制約を回避しつつWord文書をPDFに変換する方法の一つとして、C++向けの文書処理ライブラリを用いた実装手法を紹介します。
Word文書をPDFに変換する主な方法
実装に入る前に、C++からWord文書をPDFに変換する代表的なアプローチを整理しておきます。
| 手法 | メリット | デメリット |
|---|---|---|
| COMオートメーション | 変換精度が高い、追加コストなし | Windows限定、Office要インストール、サーバー利用に制約 |
| サードパーティライブラリ | Office不要、クロスプラットフォーム | ライセンスコストが発生する場合あり、ライブラリごとに精度差 |
| 外部コマンドラインツール | オープンソースで無料、実装が容易 | プロセス起動コスト、エラーハンドリングが煩雑 |
本記事では、この中からサードパーティライブラリを用いた手法について、具体的な実装例を示します。
なぜ専用ライブラリを使うのか
文書形式の変換処理を自前で実装することが困難な理由は、以下の点に集約されます。
- 仕様の複雑さ:DOCXはXMLベースの複合文書形式であり、PDFはページ記述言語として全く異なる構造を持つ
- レイアウトの再現:フォント、段落、表、画像の配置を正確に変換するには高度なレンダリングエンジンが必要
- 継続的な仕様変更:Officeのバージョンアップに伴い仕様が拡張される
これらの課題に対応するため、文書変換機能を提供するライブラリを活用するのが現実的な選択肢となります。ここでは一例として、Spire.Doc for C++を取り上げます。このライブラリはMicrosoft Officeに依存せずにWord文書の作成・編集・変換が可能なC++ネイティブAPIを提供しています。
環境構築
入手方法
Spire.Doc for C++は、以下のいずれかの方法でプロジェクトに導入できます。
-
NuGetパッケージマネージャー経由
Visual Studioの「NuGetパッケージの管理」からSpire.Doc.Cppを検索してインストール -
手動での組み込み
配布パッケージを入手し、インクルードディレクトリとライブラリファイルをプロジェクトに追加
評価目的であれば、一時ライセンスを申請することで機能制限なく試用できます。評価版のまま使用すると、生成されるPDFに評価メッセージを示す透かしが付加されます。本番環境での利用にはライセンスの適用が必要です。
必要なインクルード
プロジェクトに以下のインクルードを追加します。
#include "Spire.Doc.o.h"
using namespace Spire::Doc;
基本的な変換処理
Word文書をPDFに変換する基本的なコードは、以下のようになります。
#include "Spire.Doc.o.h"
using namespace Spire::Doc;
using namespace std;
int main() {
// 入力ファイルと出力ファイルのパスを指定
wstring inputFilePath = L"C:\\documents\\sample.docx";
wstring outputFilePath = L"C:\\output\\result.pdf";
// Documentオブジェクトを生成
intrusive_ptr<Document> document = new Document();
// Word文書を読み込み
document->LoadFromFile(inputFilePath.c_str());
// PDFとして保存
document->SaveToFile(outputFilePath.c_str(), FileFormat::PDF);
document->Close();
return 0;
}
上記のコードで行っている処理は以下の3ステップです。
-
Documentオブジェクトを生成 -
LoadFromFileメソッドでWord文書を読み込み -
SaveToFileメソッドで出力形式をFileFormat::PDFに指定して保存
intrusive_ptrは参照カウント方式のスマートポインタで、メモリ管理を自動化します。
応用的な変換オプション
実務では、より細かい要件に対応するため、変換オプションを指定したいケースがあります。以下に主なオプションを紹介します。
見出しをPDFのブックマークとして保持する
Word文書の見出し構造をPDFのしおり(ブックマーク)として引き継ぐには、ToPdfParameterListクラスを使用します。
#include "Spire.Doc.o.h"
using namespace Spire::Doc;
using namespace std;
int main() {
wstring inputFilePath = L"C:\\documents\\sample.docx";
wstring outputFilePath = L"C:\\output\\result_with_bookmarks.pdf";
intrusive_ptr<Document> document = new Document();
document->LoadFromFile(inputFilePath.c_str());
// PDF変換パラメータを設定
intrusive_ptr<ToPdfParameterList> parameters = new ToPdfParameterList();
// Wordの見出しからPDFのブックマークを生成
parameters->SetCreateWordBookmarksUsingHeadings(true);
// 既存のWordブックマークをPDFに引き継ぐ場合は以下を使用
// parameters->SetCreateWordBookmarks(true);
document->SaveToFile(outputFilePath.c_str(), parameters);
document->Close();
return 0;
}
この設定により、PDF閲覧時に見出しから目的のセクションに素早く移動できるようになります。
フォントを埋め込む
変換先の環境に該当フォントがインストールされていない場合でも、文書の見た目を保持するには、使用フォントをPDFに埋め込みます。
intrusive_ptr<ToPdfParameterList> parameters = new ToPdfParameterList();
// すべてのフォントをPDFに埋め込む
parameters->SetIsEmbeddedAllFonts(true);
document->SaveToFile(outputFilePath.c_str(), parameters);
フォント埋め込みによりファイルサイズは増加しますが、配布先の環境に依存しない安定した表示が期待できます。
画像品質の調整
文書に含まれる画像の圧縮率を調整することで、ファイルサイズを制御できます。
// 画像品質を元の40%に圧縮(ファイルサイズ削減)
document->SetJPEGQuality(40);
// 元の品質を保持する場合
// document->SetJPEGQuality(100);
document->SaveToFile(outputFilePath.c_str(), FileFormat::PDF);
サポートされるファイル形式
参考までに、Spire.Doc for C++が対応している主なファイル形式を以下に示します。
| 形式 | 読み込み | 保存 | 用途 |
|---|---|---|---|
| DOC/DOCX | ✓ | ✓ | Word 97-2019対応 |
| - | ✓ | 配布・印刷向け | |
| HTML | ✓ | ✓ | Web表示 |
| RTF | ✓ | ✓ | リッチテキスト交換 |
| TXT | ✓ | ✓ | プレーンテキスト |
| XPS | - | ✓ | XML Paper Specification |
| EPUB | - | ✓ | 電子書籍 |
| SVG | - | ✓ | ベクター画像 |
| ODT | ✓ | ✓ | OpenDocument形式 |
注意点と制限事項
実装時に把握しておくべき点をまとめます。
ライセンスと評価版の制限
評価版では、生成されるPDFに評価版であることを示す透かしが挿入されます。本番環境で使用する場合は、ライセンスを適用する必要があります。一時ライセンスは評価目的で全機能を制限なく試せますが、有効期間は30日間です。
動作環境
- プラットフォーム:Windows、Linuxに対応(macOSについては公式ドキュメントで要確認)
- アーキテクチャ:64ビットアプリケーション向け
- Microsoft Office:不要(ライブラリ単体で動作)
スレッド安全性
マルチスレッド環境で同一のDocumentインスタンスを共有する場合は、適切な排他制御が必要です。各スレッドで独立したインスタンスを使用する方法が安全とされています。
おわりに
C++からWord文書をPDFに変換する手法として、専用ライブラリを活用するアプローチを紹介した。基本的な変換は数行のコードで実現でき、ブックマーク生成やフォント埋め込みといったオプション指定も可能である。クロスプラットフォーム対応やOfficeへの非依存は、サーバーサイドでのバッチ処理などにおいて利点となる。
どの手法を選択するかは、開発環境や求められる精度、予算によって変わってくる。本記事で示した実装例が、そうした判断材料の一つとなればと思う。