0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C++ で Word 文書を OFD に変換する実装手法

0
Posted at

C++ で開発したアプリケーションにおいて、Word 文書を OFD(Open Fixed-layout Document)形式に変換したいという要件に直面することがあります。OFD は中国国家標準(GB/T 33190)として制定された固定レイアウト形式であり、中国国内の電子公文書や政府系システムへの提出用として広く採用されています。

C++ 標準ライブラリには Word 文書を OFD に変換する機能は含まれておらず、独自に実装することも現実的ではありません。本記事では、C++ から Word 文書を OFD に変換する際の実装アプローチについて解説します。

Word 文書を OFD に変換する技術的課題

Word 文書を OFD に変換する処理には、以下のような技術的課題があります。

文書構造の解析と変換

Word 文書(DOC / DOCX)は独自のバイナリ形式または XML ベースの複合形式で構成されています。これを OFD の構造に変換するには、以下を正確に処理する必要があります。

  • ページレイアウトの計算と保持
  • フォント情報の埋め込みまたは代替処理
  • 表、画像、ヘッダー・フッターなどの要素の再構築

OFD 形式の特殊性

OFD は中国の国家標準であり、国際標準である PDF とは仕様が異なります。対応しているライブラリは限られており、変換精度にも差があります。

実装アプローチの選択肢

C++ から Word 文書を OFD に変換する方法としては、以下のような選択肢があります。

手法 メリット デメリット
サードパーティライブラリ(例:Spire.Doc) Office 不要、組み込みが容易 ライセンスコストが発生する場合あり
外部コマンドラインツール 実装が比較的簡単 外部プロセス依存、環境構築が必要
中間形式を経由(Word → PDF → OFD) 汎用性が高い 二段階変換による品質劣化の可能性

本記事では、外部プロセスに依存せず C++ アプリケーションに直接組み込めるサードパーティライブラリを用いる手法について、Spire.Doc for C++ を具体例として実装方法を示します。このライブラリは Word 文書処理を目的とした C++ API であり、OFD 形式への変換にも対応しています。

環境構築

入手方法

Spire.Doc for C++ は、以下のいずれかの方法でプロジェクトに導入できます。

  1. NuGet パッケージマネージャー経由
    Visual Studio の「NuGet パッケージの管理」から Spire.Doc.Cpp を検索してインストール

  2. 手動での組み込み
    配布パッケージを入手し、インクルードディレクトリとライブラリファイルをプロジェクトに追加

評価目的であれば、一時ライセンスを申請することで機能制限なく試用できます。

必要なインクルード

#include "Spire.Doc.o.h"
#include <iostream>

using namespace Spire::Doc;

基本的な変換処理

Word 文書を OFD に変換する

以下は、Word 文書を OFD 形式に変換する基本的なコードです。変換自体は数行で完結します。

#include "Spire.Doc.o.h"
#include <iostream>

using namespace Spire::Doc;

int main()
{
    // Document オブジェクトを生成
    intrusive_ptr<Document> document = new Document();

    try {
        // Word 文書を読み込み
        document->LoadFromFile(L"C:\\documents\\sample.docx");

        // OFD 形式で保存
        document->SaveToFile(L"C:\\output\\result.ofd", FileFormat::OFD);

        document->Close();
        std::cout << "変換が完了しました。" << std::endl;
    }
    catch (const std::exception& ex) {
        std::cerr << "エラー: " << ex.what() << std::endl;
        return -1;
    }

    return 0;
}

上記のコードでは以下の処理を行っています。

  1. intrusive_ptr<Document> で Document オブジェクトを生成(スマートポインタによる自動メモリ管理)
  2. LoadFromFile メソッドで Word 文書を読み込み
  3. SaveToFile メソッドで出力形式を FileFormat::OFD に指定して保存

応用的な変換オプション

特定のページのみを OFD に変換する

文書全体ではなく、特定のページ範囲のみを OFD に変換したい場合は、ExtractPages メソッドを使用します。

#include "Spire.Doc.o.h"
#include <iostream>

using namespace Spire::Doc;

int main()
{
    intrusive_ptr<Document> document = new Document();

    try {
        document->LoadFromFile(L"C:\\documents\\report.docx");

        // 2 ページ目のみを抽出(インデックスは 0 から開始)
        intrusive_ptr<Document> extractedDoc = document->ExtractPages(1, 1);

        // 抽出したページを OFD として保存
        extractedDoc->SaveToFile(L"C:\\output\\page2.ofd", FileFormat::OFD);

        document->Close();
        extractedDoc->Close();

        std::cout << "指定ページの変換が完了しました。" << std::endl;
    }
    catch (const std::exception& ex) {
        std::cerr << "エラー: " << ex.what() << std::endl;
        return -1;
    }

    return 0;
}

ExtractPages メソッドの引数は(開始ページインデックス, 終了ページインデックス)です。インデックスは 0 から始まるため、ExtractPages(1, 1) は 2 ページ目のみを抽出します。

フォント埋め込みと画像圧縮の設定

変換先の環境に依存しない安定した表示を確保したい場合や、ファイルサイズを調整したい場合は、以下のオプションを指定できます。

#include "Spire.Doc.o.h"
#include <iostream>

using namespace Spire::Doc;

int main()
{
    intrusive_ptr<Document> document = new Document();

    try {
        document->LoadFromFile(L"C:\\documents\\proposal.docx");

        // 画像の JPEG 圧縮品質を設定(0 ~ 100、デフォルトは高品質)
        document->SetJPEGQuality(75);

        // PDF / OFD 変換パラメータを設定
        intrusive_ptr<ToPdfParameterList> parameters = new ToPdfParameterList();

        // 使用フォントを埋め込む
        parameters->SetIsEmbeddedAllFonts(true);

        // オプションを指定して OFD として保存
        document->SaveToFile(L"C:\\output\\proposal.ofd", parameters);

        document->Close();
        std::cout << "カスタム設定での変換が完了しました。" << std::endl;
    }
    catch (const std::exception& ex) {
        std::cerr << "エラー: " << ex.what() << std::endl;
        return -1;
    }

    return 0;
}
  • SetJPEGQuality:文書内の JPEG 画像の圧縮率を指定します。値を小さくするとファイルサイズは削減されますが、画質は低下します。
  • SetIsEmbeddedAllFonts:文書で使用されているすべてのフォントを出力ファイルに埋め込みます。変換先のシステムに該当フォントがインストールされていない場合でも、意図した表示を維持できます。

注意点と制限事項

動作環境

  • プラットフォーム:Windows、Linux に対応
  • アーキテクチャ:64 ビットアプリケーション向け
  • Microsoft Office:不要(ライブラリ単体で動作)

フォントの取り扱い

変換元の Word 文書で使用されているフォントが実行環境にインストールされていない場合、デフォルトでは代替フォントでレンダリングされます。これによりレイアウトが意図したものと異なる可能性があります。正確な表示が必要な場合は、前述の SetIsEmbeddedAllFonts(true) を指定してください。

メモリ使用量

大きな Word 文書を処理する場合、メモリ消費量が増加することがあります。複数文書を連続して処理する際は、各処理後に Close() を呼び出してリソースを解放することを推奨します。

評価版の制限

評価版では、生成される OFD に評価版であることを示す透かしが挿入されます。本番環境で使用する場合はライセンスの適用が必要です。

おわりに

本記事では、C++ 環境において Word 文書を OFD 形式に変換する一手法として、Spire.Doc for C++ を用いた実装例を示した。基本的な変換処理は数行のコードで完結し、ページ範囲の指定やフォント埋め込みといったオプションも利用可能である。

OFD は特定の地域や業界で必要とされる形式であり、対応するライブラリは PDF と比較すると限られている。実際の開発においては、要件に合致した変換精度が得られるかどうか、事前に対象文書を用いて検証することを推奨する。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?