Word ドキュメントを OFD(Open Fixed-layout Document)に変換する処理は、特に中国市場向けの C++ アプリケーションではよく求められます。例えば、公文書の提出、アーカイブ、またはレイアウトを厳密に維持する必要がある帳票出力などです。ただし、この変換を安定して実装するのは意外と簡単ではありません。従来の Microsoft Office(COM)に依存する方法は、サーバー環境では不安定になりやすく、デプロイや運用の負担も大きくなります。 本記事では、Spire.Doc for C++ を使用して、プログラムで Word を OFD に変換する方法を解説します。基本的な文書変換から、特定のページのみを OFD 形式で書き出すといった高度なシナリオまでカバーします。 Word を OFD に変換する理由 なぜ Spire.Doc for C++ を選ぶのか Spire.Doc for C++ のセットアップ C++ による基本的な Word を OFD に変換 高度な Word を OFD に変換する設定 特定のページを OFD に変換する OFD 変換設定をカスタマイズする よくある質問 (FAQs) Word を OFD に変換する理由 Word は編集には便利ですが、中国向けの公文書やアーカイブ用途では OFD が標準として広く採用されています。Word を OFD に変換することで、次のようなメリットがあります。 国家標準への対応: OFD は中国の国家標準(GB/T 33190)であり、政府提出や公式文書で広く利用されています。 レイアウトを完全に保持: フォントや段落、ページ構成を崩さず、どの環境でも同じ見た目を維持できます。 クロスプラットフォームで安定表示: OS やビューアの違いによる表示崩れを防ぎます。 長期保存に適したフォーマット: 公文書や契約書など、長期間の保管が必要な用途に適しています。 セキュリティと信頼性: デジタル署名や改ざん防止機能により、文書の信頼性を高められます。 特にバックエンド処理や自動化されたドキュメント生成のシナリオでは、OFD 形式への変換は実用的かつ重要なステップになります。 なぜ Spire.Doc for C++ を選ぶのか C++ で Word を OFD に変換する方法には、COM 自動化、外部ツールの呼び出し、または .docx フォーマットの手動解析など、いくつかのアプローチがあります。しかし、それぞれにプラットフォームの制約、環境依存、あるいは膨大な実装コストといったデメリットがあります。 Spire.Doc for C++ は、これらの問題の大部分を解決します。 Microsoft Office のインストールが不要: ライブラリが内部で変換処理を行うため、サーバーサイドでのデプロイが可能です。 クロスプラットフォーム: Windows と Linux の両方で動作します。これは、サービスをコンテナ環境や Linux ベースの環境で実行する場合に重要です。 レイアウトを高精度に再現: 表、画像、ヘッダー、フッター、フォントスタイルが、出力される OFD に確実に保持されます。 扱いやすい API: コアとなる変換ロジックが簡潔で、ドキュメントオブジェクトモデルのすべてを事前に理解する必要がありません。 複数の Word 形式をサポート: DOC、DOCX、DOCM、DOTX、DOTM などに対応しています。 Spire.Doc for C++ のセットアップ 変換を始める前に、開発環境とプロジェクトが適切に構成されていることを確認してください。 NuGet パッケージマネージャー経由でインストール Visual Studio でプロジェクトを開きます。 「ツール」 -> 「NuGet パッケージ マネージャー」 -> 「ソリューションの NuGet パッケージの管理...」に移動します。 "Spire.Doc.Cpp" を検索します。 「インストール」をクリックします。 手動インストール 公式サイトから最新バージョンの Spire.Doc for C++ をダウンロードします。 パッケージを解凍します。 Visual Studio プロジェクトで Include ディレクトリのパスを追加し、lib ディレクトリをリンクするように設定します。DLL ファイルが実行ファイルと同じディレクトリ、またはシステムパスにあることを確認してください。 詳細な手順については、C++ アプリケーションに Spire.Doc for C++ を統合する方法を参照してください。 基本的な C++ プロジェクトの設定 インストール後、コードを記述する前に以下の準備を行ってください。 ヘッダーのインクルード: #include "Spire.Doc.o.h" 必要な名前空間の追加: using namespace Spire::Doc; C++ による基本的な Word を OFD に変換 プロジェクトの準備ができれば、Word を OFD に変換する処理は、わずか数行のコードで実現できます。 以下に完全な C++ の例を示します。 #include "Spire.Doc.o.h" #include <iostream> using namespace Spire::Doc; int main() { // Document オブジェクトを作成 Document* document = new Document(); try { // Word ファイルを読み込む document->LoadFromFile(L"C:UsersTommyDesktopSample.docx"); // OFD 形式で保存 document->SaveToFile(L"C:UsersTommyDesktopSample.ofd", FileFormat::OFD); // ドキュメントを閉じる document->Close(); std::cout << "変換に成功しました!" << std::endl; } catch (const std::exception& ex) { // エラーハンドリング std::cerr << "エラーが発生しました: " << ex.what() << std::endl; delete document; return -1; } // メモリの解放 delete document; return 0; } コードの解説: Document オブジェクトを作成します。 LoadFromFile() で Word ドキュメントを読み込みます。 SaveToFile() で FileFormat::OFD を指定し、ドキュメントを OFD ファイルとして変換・保存します。 高度な Word を OFD に変換する設定 Spire.Doc for C++ では、特定のページのみを書き出したり、画像の圧縮率やフォントの埋め込みを調整したりすることで、変換プロセスを詳細に制御できます。 特定のページを OFD に変換する Word ドキュメントの特定のページだけを OFD 形式に変換したい場合があります。以下の例では、特定のページを抽出して別個の OFD ファイルとして保存する方法を示します。 #include "Spire.Doc.o.h" #include <iostream> using namespace Spire::Doc; int main() { // スマートポインタを使用して Document オブジェクトを作成 intrusive_ptr<Document> document = new Document(); try { document->LoadFromFile(L"C:UsersTommyDesktopSample.docx"); // 1ページ目から3ページ目までを抽出(インデックスは0から始まります) intrusive_ptr<Document> newDoc = document->ExtractPages(0, 3); // 抽出したページを OFD として保存 newDoc->SaveToFile(L"C:UsersTommyDesktopSample_Partial.ofd", FileFormat::OFD); document->Close(); newDoc->Close(); std::cout << "特定ページの抽出と変換に成功しました!" << std::endl; } catch (const std::exception& ex) { std::cerr << "エラーが発生しました: " << ex.what() << std::endl; return -1; } return 0; } コードの解説: intrusive_ptr は、Document オブジェクトのメモリを自動管理するスマートポインタです。メモリリークを防ぎ、コードを簡潔にします。 ExtractPages(0, 3) は、0ベースのインデックスで1~3ページ目を抽出し、新しい Document オブジェクトを生成します。 OFD 変換設定をカスタマイズする 生成される OFD のファイルサイズを小さくしたり、異なる環境でもフォントが正しく表示されるようにしたりするために、変換設定を調整できます。 #include "Spire.Doc.o.h" #include <iostream> using namespace Spire::Doc; int main() { intrusive_ptr<Document> document = new Document(); try { document->LoadFromFile(L"C:UsersTommyDesktopSample.docx"); // JPEG 画像の品質を75%に設定(0-100の範囲) document->SetJPEGQuality(75); // フォント埋め込み設定用のリストを作成 intrusive_ptr<ToPdfParameterList> parameters = new ToPdfParameterList(); // すべてのフォントをドキュメントに埋め込む parameters->SetIsEmbeddedAllFonts(true); document->SaveToFile(L"C:UsersTommyDesktopSample.ofd", FileFormat::OFD); document->Close(); std::cout << "カスタマイズ設定での変換に成功しました" << std::endl; } catch (const std::exception& ex) { std::cerr << "エラー: " << ex.what() << std::endl; return -1; } return 0; } SetJPEGQuality(75): ドキュメント内の JPEG 画像の圧縮品質を設定し、ファイルサイズを調整します。 SetIsEmbeddedAllFonts(true): 使用されているすべてのフォントを埋め込みます。これにより、フォントがインストールされていない環境でも正しく表示されます。 よくある質問 (FAQs) Q1. 変換を実行するために Microsoft Word をインストールする必要がありますか? A: いいえ、必要ありません。Spire.Doc for C++ は独立して動作し、システムに Word がインストールされていなくても変換が可能です。 Q2. Word ドキュメントの特定のページだけを OFD に変換するにはどうすればよいですか? A: 前述の通り、ExtractPages() メソッドを使用して必要なページを新しい Document オブジェクトとして抽出し、それを OFD 形式で保存してください。 Q3. 変換後の OFD でフォントが正しく表示されないのはなぜですか? A: これは通常、必要なフォントがシステムにインストールされていない場合に発生します。保存前に SetIsEmbeddedAllFonts(true) を呼び出してフォントを埋め込むことで解決できます。 Q4. 生成される OFD のファイルサイズを小さくするには? A: 画像の圧縮を有効にするか、SetJPEGQuality() を使用して画質を下げることでファイルサイズを削減できます。 Q5. OFD と PDF の違いは何ですか? A: OFD は中国の電子文書国家標準であり、PDF は国際標準です。OFD は中国の電子政府や公式ワークフローで広く採用されています。どちらの形式もドキュメントのレイアウトと書式を保持します。 結論 C++ で Word ドキュメントを OFD に変換する機能は、信頼性の高い文書共有や中国国家標準への準拠が必要なアプリケーションにとって不可欠です。Spire.Doc for C++ を使用すれば、Microsoft Office に依存することなく、プログラムで簡単にこの変換を実装できます。本ガイドで紹介したように、全文書の変換だけでなく、特定ページの抽出や詳細なカスタマイズも可能であり、実務における C++ ドキュメント処理の強力なソリューションとなります。