チュートリアル
簡単にライブラリーを使用するためのチュートリアルコレクション

C++ で画像を OFD(Open Fixed-layout Document)形式に変換する処理は、ドキュメント処理システムにおいてよくある要件の一つです。特に中国語圏では、OFD は公式文書のアーカイブ、交換、配布に広く使用される標準フォーマットとなっています。実際の開発では、スキャンした文書や画像ファイルを OFD ドキュメントに変換し、統一的に保存・管理したり、電子文書管理システムや自動化ワークフローに統合したりするケースが多くあります。
画像から OFD への変換処理を低レベルから実装する場合、画像形式の解析、ページサイズの設定、ドキュメント構造の構築など、複雑な処理を実装する必要があります。また、生成されるファイルが OFD 仕様に準拠していることを保証する必要もあります。
Spire.PDF for C++ を使用すれば、シンプルな API を利用して画像を OFD に簡単に変換できます。このライブラリは PNG、JPG、BMP、TIFF、EMF などの一般的な画像形式をサポートしており、ドキュメント構造の生成や描画処理も自動的に行われます。
本記事では、C++ で画像を OFD ドキュメントへ変換する方法を解説し、単一画像の変換、複数画像を用いた複数ページ OFD の生成、さらにバッチ変換の実装例も紹介します。
クイックナビゲーション
OFD は XML ベースの固定レイアウト文書形式であり、PDF と似た機能を持ちながら、中国語環境における文字セットや政府文書規格に対応するよう最適化されています。
画像を OFD に変換する処理は、本質的には OFD 仕様に準拠したドキュメント構造を作成し、そのページ内に画像を埋め込むことを意味します。
画像を OFD に変換する代表的な利用シナリオには以下があります。
一般的な実装フローは以下の通りです。
C++ で画像を OFD に変換する前に、まず Spire.PDF for C++ をインストールして設定する必要があります。
Spire.PDF を C++ プロジェクトに追加する最も簡単な方法は NuGet を利用することです。
NuGet を使用すると、ライブラリファイルと依存関係が自動的にダウンロード・設定されます。
インストール手順:
インストール後、コードでライブラリを読み込みます。
#include "Spire.Pdf.o.h"
または、
Spire.PDF for C++ をダウンロード し、include と lib ディレクトリをプロジェクトに設定して手動で統合することも可能です。
詳細は以下のガイドを参照してください。
C++ アプリケーションに Spire.PDF for C++ を統合する方法
以下のサンプルコードは、単一の画像ファイルを OFD ドキュメントへ変換する方法を示しています。コードではまず PDF ドキュメントオブジェクトを作成し、画像を読み込み、ページに描画した後、最終的に OFD 形式で保存します。
#include "Spire.Pdf.o.h"
using namespace Spire::Pdf;
int main()
{
// 新しい PDF ドキュメントを作成します
PdfDocument* ofd = new PdfDocument();
// 画像ファイルを読み込みます
auto image = PdfImage::FromFile(L"Sample.jpg");
// 画像のサイズに基づいてページサイズを計算します
float pageWidth = image->GetWidth();
float pageHeight = image->GetHeight();
// 画像サイズに一致するページを追加します
auto page = ofd->GetPages()->Add(new SizeF(pageWidth, pageHeight));
// ページ上に画像を描画します
page->GetCanvas()->DrawImage(image, 0, 0, pageWidth, pageHeight);
// OFD ファイルとして保存します
ofd->SaveToFile(L"ImageToOfd.ofd", FileFormat::OFD);
// リソースを解放します
delete ofd;
return 0;
}
以下の図は、元画像から生成された OFD ドキュメントの表示例です。

PdfDocument ドキュメントオブジェクトを表し、ページの作成や最終的な OFD ファイルの出力を行います。
PdfImage::FromFile() 指定パスから画像ファイルを読み込み、ページ上に描画可能な画像オブジェクトを作成します。
PdfDocument::GetPages()->Add() ドキュメントに新しいページを追加します。本例では画像サイズに合わせてページサイズを設定しています。
PdfCanvas::DrawImage() 指定された位置とサイズで画像をページキャンバスに描画します。
SaveToFile()
ドキュメントをディスクに保存し、FileFormat::OFD を指定することで OFD 形式で出力します。
この方法により、画像を正しい比率のまま OFD ページ内に表示でき、元画像の品質を維持できます。
ofd->GetPageSettings()->SetMargins(0.0);
余白を残す場合:
ofd->GetPageSettings()->SetMargins(10.0);
ページの余白を適切に設定することで、ページレイアウトの見栄えをコントロールできます。
注意:コード実行時に C++ のバージョン互換性の問題が発生する場合、以下の方法で対応できます。
_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING を追加ISO C++14 標準 (/std:c++14) に設定文書のアーカイブやバッチ処理のシナリオでは、複数の画像を 1 つの OFD ファイルに統合する必要があることがよくあります。以下の例では、複数ページからなる OFD 文書を作成し、各ページに異なる画像を配置する方法を示します。
コードは画像ファイルのリストを順に処理し、各画像に対して個別のページを作成します。ページサイズは画像の寸法に基づいて設定され、画像は対応するページに描画されます。
#include "Spire.Pdf.o.h"
#include <vector>
#include <filesystem>
#include <algorithm>
using namespace Spire::Pdf;
namespace fs = std::filesystem;
int main()
{
// 新しい PDF ドキュメントを作成します(OFD として保存するため)
PdfDocument* ofd = new PdfDocument();
// 画像フォルダを指定します
std::wstring folderPath = L"./images";
// フォルダを走査します
for (const auto& entry : fs::directory_iterator(folderPath))
{
if (!entry.is_regular_file())
continue;
std::wstring path = entry.path().wstring();
std::wstring ext = entry.path().extension().wstring();
// 比較しやすいように小文字へ変換します
std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower);
// 対応している画像形式かどうかを判定します
if (ext == L".png" || ext == L".jpg" || ext == L".jpeg" || ext == L".bmp")
{
// 画像を読み込みます
auto image = PdfImage::FromFile(path.c_str());
// 画像サイズを取得します
float pageWidth = image->GetWidth();
float pageHeight = image->GetHeight();
// ページを作成します
auto page = ofd->GetPages()->Add(new SizeF(pageWidth, pageHeight));
// 画像を描画します
page->GetCanvas()->DrawImage(image, 0, 0, pageWidth, pageHeight);
}
}
// OFD ファイルとして保存します
ofd->SaveToFile(L"multi_page_document.ofd", FileFormat::OFD);
// リソースを解放します
delete ofd;
return 0;
}
生成された OFD ドキュメントでは、各画像が独立したページに配置されます。

この実装では、画像ファイルのコレクションを順に処理し、各画像ごとに独立したページを作成して適切なサイズで描画します。生成された OFD 文書は、1 つのファイル内にすべての元画像の順序とレイアウトを保持します。
注意:#include <filesystem> は C++17 以降の標準でのみ使用可能です。
多くの実務的な文書ワークフローでは、ページは通常 標準ページサイズ に従う必要があり、画像の元のサイズをそのまま使用することはありません。たとえば、スキャンした契約書、表、報告書などは、A4 や Letter などの標準ページフォーマットに統一することが求められます。
これを実現するには、まず固定サイズのページを作成し、画像を縦横比を維持したままスケーリングして、ページ内に適切に収めます。
以下の例では、縦横比を保持しつつ、画像を固定ページサイズに合わせて縮小・拡大する方法を示します。
#define NOMINMAX
#include "Spire.Pdf.o.h"
#include <algorithm>
using namespace Spire::Pdf;
int main()
{
// 新しい PDF ドキュメントを作成します
PdfDocument* ofd = new PdfDocument();
// 固定サイズのページ(例:A4)を追加します
PdfPageBase* page = ofd->GetPages()->Add(PdfPageSize::A4);
// 画像を読み込みます
auto image = PdfImage::FromFile(L"Sample.jpg");
// ページのサイズを取得します
float pageWidth = page->GetCanvas()->GetClientSize().GetWidth();
float pageHeight = page->GetCanvas()->GetClientSize().GetHeight();
// 画像のサイズを取得します
float imgWidth = image->GetWidth();
float imgHeight = image->GetHeight();
// アスペクト比を維持したスケーリング比率を計算します
float scale = std::min(pageWidth / imgWidth, pageHeight / imgHeight);
float scaledWidth = imgWidth * scale;
float scaledHeight = imgHeight * scale;
// ページ上にスケーリング後の画像を描画します
page->GetCanvas()->DrawImage(image, 0, 0, scaledWidth, scaledHeight);
// OFD ファイルとして保存します
ofd->SaveToFile(L"FixedPageSize.ofd", FileFormat::OFD);
// リソースを解放します
delete ofd;
return 0;
}
以下のスクリーンショットは、画像が固定ページサイズ(A4)に合わせてスケーリングされ、縦横比が保持される様子を示しています。

この方法により、異なるサイズの画像であっても標準化された文書レイアウト内に統一して配置でき、元の比率を維持して画像の歪みを防ぐことができます。同じ技術は、複数の画像から多ページの OFD 文書を生成する場合にも適用可能です。
自動化文書処理システムでは、多数の画像ファイルを一括で OFD 文書に変換する必要があることがよくあります。コードの再利用性を高めるため、変換処理のロジックを独立した関数としてカプセル化し、複数のファイルをループで処理する方法が有効です。
以下の例では、基本的なエラー処理と進捗表示を含む、シンプルなバッチ処理の実装方法を示しています。
#include "Spire.Pdf.o.h"
#include <vector>
#include <iostream>
#include <filesystem>
#include <algorithm>
using namespace Spire::Pdf;
namespace fs = std::filesystem;
void ConvertImageToOFD(const std::wstring& inputPath, const std::wstring& outputPath)
{
// 新しい PDF ドキュメントを作成します(OFD を生成するため)
PdfDocument* ofd = new PdfDocument();
try
{
// 画像ファイルを読み込みます
auto image = PdfImage::FromFile(inputPath.c_str());
// ページサイズを計算します(画像サイズと一致させます)
float pageWidth = image->GetWidth();
float pageHeight = image->GetHeight();
// 画像サイズに一致するページを追加します
auto page = ofd->GetPages()->Add(new SizeF(pageWidth, pageHeight));
// ページ上に画像を描画します
page->GetCanvas()->DrawImage(image, 0, 0, pageWidth, pageHeight);
// OFD ファイルとして保存します
ofd->SaveToFile(outputPath.c_str(), FileFormat::OFD);
std::wcout << L"変換完了:" << inputPath << L" -> " << outputPath << std::endl;
}
catch (const std::exception& ex)
{
std::wcout << L"変換中にエラーが発生しました:" << inputPath << L" : " << ex.what() << std::endl;
}
// ドキュメントを解放します
delete ofd;
}
int main()
{
// 走査する画像フォルダを定義します
std::wstring folderPath = L"./images";
// フォルダ内のすべてのファイルを走査し、自動的に変換を実行します
for (const auto& entry : fs::directory_iterator(folderPath))
{
// 通常のファイルのみ処理します
if (!entry.is_regular_file())
continue;
fs::path filePath = entry.path();
std::wstring ext = filePath.extension().wstring();
// 拡張子を小文字に変換して比較しやすくします
std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower);
// 対応している画像形式かどうかを判定します
if (ext == L".png" || ext == L".jpg" || ext == L".jpeg" || ext == L".bmp")
{
// 入力画像のパスを取得します
std::wstring inputPath = filePath.wstring();
// 対応する OFD の出力パスを生成します(画像と同じ名前)
fs::path outputPath = filePath.parent_path() / (filePath.stem().wstring() + L".ofd");
// 変換を実行します
ConvertImageToOFD(inputPath, outputPath.wstring());
}
}
std::wcout << L"一括変換が完了しました。" << std::endl;
return 0;
}
このバッチ処理方式は、以下の利点を提供します:
この実装では、各画像を独立して処理するため、個別の変換失敗が全体のバッチ処理を中断することはありません。
画像ファイルのパスが正しくアクセス可能であることを確認してください。画像を読み込む際は、絶対パスを使用するか、作業ディレクトリを確認することを推奨します:
// 信頼性を高めるために絶対パスを使用
auto image = PdfImage::FromFile(L"C:\\Documents\\scanned_invoice.png");
PdfDocument や PdfImage オブジェクトは適切に解放し、メモリリークを防いでください。使用後は動的に割り当てたオブジェクトを必ず削除します:
delete ofd;
Spire.PDF は PNG、JPEG、BMP、EMF、TIFF などの一般的な画像形式をサポートしています。入力ファイルがサポート対象であることを確認してください。サポートされていない形式の場合は、事前に画像処理ライブラリで対応形式に変換してください。
画像のサイズに基づいてページを作成する場合、大きすぎる画像は OFD 文書の閲覧や印刷に問題を引き起こす可能性があります。大きな画像にはサイズ制限や縮小処理を行うことを推奨します:
#define NOMINMAX
#include <algorithm>
// 最大ページサイズの制限を適用
const float MAX_WIDTH = 1000.0f;
const float MAX_HEIGHT = 1400.0f;
float pageWidth = std::min(static_cast<float>(image->GetWidth()), MAX_WIDTH);
float pageHeight = std::min(static_cast<float>(image->GetHeight()), MAX_HEIGHT);
中文文字や特殊文字を含むファイルパスを扱う場合は、std::wstring のようなワイド文字列を使用し、正しいエンコーディングを保証してください。これにより、ファイル操作での文字化けやエラーを防げます。
一部の環境でコンパイル問題が発生する場合、以下の方法で対応可能です:
_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING を追加ISO C++14 標準 (/std:c++14) に設定本記事では、Spire.PDF for C++ を使用して画像を OFD 文書に変換する方法を紹介しました。シンプルな API 呼び出しにより、単一画像の変換、多数画像からの多ページ文書生成、さらにはバッチ処理による変換などを容易に実現できます。
この技術は、スキャン文書のデジタル化、電子文書管理、そして自動化された文書処理ワークフローにおいて幅広く応用可能です。
OFD 変換に加えて、Spire.PDF for C++ は PDF 文書の作成、編集、変換、さまざまな形式への出力など、豊富な機能を提供します。本ライブラリを利用することで、開発者は複雑な文書処理タスクを効率的に実行しつつ、生成される文書が業界標準に準拠していることを保証できます。
フル機能を体験したい場合は、30 日間無料ライセンスを申請 してください。
必要ありません。Spire.PDF は、画像から OFD への変換を単独で実行でき、Adobe Acrobat やその他の外部 PDF ソフトウェアに依存する必要はありません。
Spire.PDF は、PNG、JPEG、BMP、EMF、TIFF などの一般的な画像形式に対応しています。
はい。Spire.PDF はサーバー環境向けに最適化されており、大量の画像変換タスクを効率的に処理できます。
可能です。Spire.PDF では、ページキャンバス上にテキストや画像を描画できるため、OFD にエクスポートする前に透かしを追加することができます。
関連チュートリアル:
影響ありません。変換プロセス中、元の画像の解像度と品質は保持され、ページサイズも画像の大きさに応じて自動で調整されます。
PDF は、標準的な形式で文書を転送するのに非常に適しています。どのデバイスやソフトウェアを使用して表示しても、文書形式は変わりません。しかし PDF ファイルは編集が難しい。PDF のスプレッドシートを処理する必要がある場合は、通常は Excel 形式に変換して Excel で編集するのが最も簡単です。この記事では、Spire.PDF for C++ を使用して C++ で PDF を Excel に変換する方法について説明します。
Spire.PDF for C++ をアプリケーションに組み込むには、2つの方法があります。一つは NuGet 経由でインストールする方法、もう一つは当社のウェブサイトからパッケージをダウンロードし、ライブラリをプログラムにコピーする方法です。NuGet 経由のインストールの方が便利で、より推奨されます。詳しくは、以下のリンクからご覧いただけます。
Spire.PDF for C++ を C++ アプリケーションに統合する方法
Spire.PDF for C++ は、PDF を XLSX などの文書形式に変換するための PdfDocument->SaveToFile() メソッドを提供します。変換する前に、PdfDocument->GetConvertOptions->SetPdfToXlsxOptions() メソッドを使用して変換オプションを設定できます。このメソッドは XlsxLineLayoutOptions オブジェクトをパラメーターとして使用します。XlsxLineLayoutOptions クラスのコンストラクタには、次の 5 つのパラメーターがあり、PDF を Excel に変換する方法を制御することができます。
#include "Spire.Pdf.o.h";
using namespace Spire::Pdf;
int main() {
//PdfDcoumentオブジェクトを作成する
PdfDocument* doc = new PdfDocument();
//PDFドキュメントをロードする
doc->LoadFromFile(L"input.pdf");
//XlsxLineLayoutOptionsオブジェクトを作成する
XlsxLineLayoutOptions* options = new XlsxLineLayoutOptions(true, true, false, true, false);
//PDFからXLSXへの変換オプションを設定する
doc->GetConvertOptions()->SetPdfToXlsxOptions(options);
//PDFドキュメントをExcelに保存する
doc->SaveToFile(L"output/PdfToExcel.xlsx", FileFormat::XLSX);
doc->Close();
delete doc;
}
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。
PDF 形式は多くの場合に適していますが、画像に変換する必要がある場合もあります。PDF を画像に変換することで、ソーシャルメディアに公開したり、画像表示しかできないデバイスにアップロード・転送することができます。また、Word ドキュメントや PowerPoint プレゼンテーションにも埋め込むことが可能です。この記事では、Spire.PDF for C++ を使用して C++ で PDF を画像に変換する方法について説明します。
Spire.PDF for C++ をアプリケーションに組み込むには、2つの方法があります。一つは NuGet 経由でインストールする方法、もう一つは当社のウェブサイトからパッケージをダウンロードし、ライブラリをプログラムにコピーする方法です。NuGet 経由のインストールの方が便利で、より推奨されます。詳しくは、以下のリンクからご覧いただけます。
Spire.PDF for C++ を C++ アプリケーションに統合する方法
Spire.PDF for C++ の PdfDocument->SaveAsImage(int pageIndex) メソッドは特定のページを画像ストリームに変換することをサポートします。ストリームは、PNG、JPG、BMP などの目的の拡張子を持つ画像ファイルとして保存できます。詳細な手順は次のとおりです。
#include "Spire.Pdf.o.h";
using namespace Spire::Pdf;
using namespace std;
int main() {
//入力と出力のパスを指定する
wstring inputFile = L"C:\\Users\\Administrator\\Desktop\\sample.pdf";
wstring outputFile = L"C:\\Users\\Administrator\\Desktop\\Output\\ToImage";
//PdfDocumentオブジェクトを作成する
PdfDocument* doc = new PdfDocument();
//PDFファイルをロードする
doc->LoadFromFile(inputFile.c_str());
//特定のページを画像に変換する
Stream* image = doc->SaveAsImage(0, PdfImageType::Bitmap);
//画像を.jpgファイルに書き込む
wstring fileName = outputFile + L".jpg";
image->Save(fileName.c_str());
doc->Close();
delete doc;
}
PDF 全体を個別の画像として保存するには、変換部分をループ文に入れるだけです。以下に詳細な手順を示します。
#include "Spire.Pdf.o.h";
using namespace Spire::Pdf;
using namespace std;
int main() {
//入力と出力のパスを指定する
wstring inputFile = L"C:\\Users\\Administrator\\Desktop\\sample.pdf";
wstring outputFile = L"C:\\Users\\Administrator\\Desktop\\Output\\ToImg-";
//PdfDocumentオブジェクトを作成する
PdfDocument* doc = new PdfDocument();
//PDFファイルをロードする
doc->LoadFromFile(inputFile.c_str());
//ファイルのページをループする
for (int i = 0; i < doc->GetPages()->GetCount(); i++) {
//特定のページを画像として保存
Stream* image = doc->SaveAsImage(i);
//画像を.jpgファイルに書き込む
wstring fileName = outputFile + to_wstring(i) + L".jpg";
image->Save(fileName.c_str());
}
doc->Close();
delete doc;
}
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。
PDF 文書は、異なるデバイスでコンテンツを同じように表示することができ、共有や転送が容易です。しかし、PDF 文書は編集に適しておらず、PDF 文書の内容や書式を変更するのは非常に困難な場合があります。このため、多くの人が PDF 文書を編集しやすい Word 文書に変換し、文書内の内容を簡単に変更できるようにすることを選択しています。
この記事では、Spire.PDF for C++ を使用して、固定レイアウト モードまたは流動構造モードのいずれかで PDF ファイルを Word 文書に変換する方法について説明します。
Spire.PDF for C++ をアプリケーションに組み込むには、2つの方法があります。一つは NuGet 経由でインストールする方法、もう一つは当社のウェブサイトからパッケージをダウンロードし、ライブラリをプログラムにコピーする方法です。NuGet 経由のインストールの方が便利で、より推奨されます。詳しくは、以下のリンクからご覧いただけます。
Spire.PDF for C++ を C++ アプリケーションに統合する方法
デフォルトでは、PdfDocument->SaveToFile() メソッドを使用して、変換オプションを設定せずに PDF ファイルを Word 文書に変換した場合、出力 Word 文書のコンテンツ配置は固定レイアウトになります。PDF ファイルを固定レイアウトモードで Word 文書に変換するための詳細な手順は以下の通りです。
#include "Spire.Pdf.o.h"
using namespace Spire::Pdf;
int main()
{
//PdfDocumentのオブジェクトを作成する
PdfDocument* pdf = new PdfDocument();
//PDFファイルを読み込む
pdf->LoadFromFile(L"C:/私たちの間の距離.pdf");
//ドキュメントをDocファイルとして保存する
pdf->SaveToFile(L"Output/PDFからWordへの変換.doc", FileFormat::DOC);
//ドキュメントをDocxファイルとして保存する
pdf->SaveToFile(L"Output/PDFからWordへの変換.docx", FileFormat::DOCX);
pdf->Close();
delete pdf;
}
Spire.PDF for C++ では、PdfDocument->GetConvertOptions()->SetPdfToDocOptions(true, true) メソッドで、変換モードをフローブル構造モードに変更できます。流動構造モードで PDF ファイルから Word 文書に変換する詳細な手順は以下の通りです。
#include "Spire.Pdf.o.h"
using namespace Spire::Pdf;
int main()
{
//PdfDocumentのオブジェクトを作成する
PdfDocument* pdf = new PdfDocument();
//PDFファイルを読み込む
pdf->LoadFromFile(L"C:/私たちの間の距離.pdf");
//変換モードを構造流動モードに変更する
pdf->GetConvertOptions()->SetPdfToDocOptions(true, true);
//ドキュメントをDocファイルとして保存する
pdf->SaveToFile(L"Output/PDFからWordへの変換.doc", FileFormat::DOC);
//ドキュメントをDocxファイルとして保存する
pdf->SaveToFile(L"Output/PDFからWordへの変換.docx", FileFormat::DOCX);
pdf->Close();
delete pdf;
}
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。