PDF Optimizer(PDF最適化) サンプル コード

PDF を最適化 概要

「PDF Optimizer」ソフトは、PDF文書を特定のアプリケーション(Web閲覧や文書交換など)向けにPDFファイルサイズを縮小します。

価格見積り

Web用設定
・表示や文書交換に不要なデータをPDFファイルから削除
・画像のダウンサンプリングや最適な再圧縮
・PDFファイルに埋め込まれたフォントを統合、サブセット化
・Web表示のためにリニアライズ
・色空間をRGBに変換

アーカイブ(文書保存)用設定
・文書の保存に不要なデータをPDFファイルから削除
・画像の最適な再圧縮
・PDFファイルに埋め込まれたフォントを統合、サブセット化

印刷用設定
・印刷に不要なデータをPDFファイルから削除
・画像のダウンサンプリングや最適な再圧縮
・PDFファイルに埋め込まれたフォントを統合、サブセット化
・色空間をCMYKに変換


「PDF Optimizer」機能概要

無償評価版(リンク先は英語)
以下のダウンロード(無償)ではで完全なソースコードライブラリおよびライセンスキーを入手できます。
製品マニュアル: ライブラリコマンドライン

無償評価版のダウンロードとインストール


C#開発環境 C/C++開発環境
1.Zipファイルをダウンロードする場合
ライブラリ(評価版API)は無償でダウンロードできます。
ファイルをダウンロードしてから適当なフォルダーに解凍してください。
以下のようなフォルダーができあがりますので、適宜ご利用ください。
binライブラリやライセンスマネージャーなど
doc使用説明書やjavadocなど
includeC/C++用のヘッダー(.h)ファイル
jar POLA.jar(Javaのラッパー)
libC/C++用のlibファイル
samples各種開発言語のサンプル
サンプルの実行前に参照設定などを行ってください。
無償評価版と共にダウンロードしたライセンスキーを bin/LicenseManager.exeを使って登録してください。
2.NuGetでインストールする場合
nuget.org から PdfTools.PdfOptimize をインストールします。

  NuGetでのインストール手順

この場合は参照設定などの必要はありません。
評価用ライセンスは 以下のソースコードまたは、こちら から取得してください。
C#開発環境 C/C++開発環境
ライブラリ(評価版API)は無償でダウンロードできます。
ファイルをダウンロードしてから適当なフォルダーに解凍してください。
以下のようなフォルダーができあがりますので、適宜ご利用ください。
binライブラリやライセンスマネージャーなど
doc使用説明書やjavadocなど
includeC/C++用のヘッダー(.h)ファイル
jar POLA.jar(Javaのラッパー)
libC/C++用のlibファイル
samples各種開発言語のサンプル
サンプルの実行前に参照設定などを行ってください。
無償評価版と共にダウンロードしたライセンスキーを bin/LicenseManager.exeを使って登録してください。

PDFファイルのサイズをアーカイブ用に縮小

PDF文書の表示内容を変更せずにファイルサイズを縮小するサンプルコードです。
縮小は、
  1. 冗長なオブジェクトの削除
  2. 埋め込まれたフォントをマージし未使用のグリフを削除
  3. リソースの最適化
  4. 画像タイプに応じて縮小
が実施されます。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// Archiveプロファイルを選択
PdfOptimizeSetProfile(pOptimizer, eOptimizationProfileArchive);

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // Archiveプロファイルを選択
    optimizer.Profile = PDFOptimizationProfile.eOptimizationProfileArchive;

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDFファイルのサイズを小さく

大きな画像が含まれたPDFファイルのサイズを小さくするサンプルです。
縮小は、スキャンされた画像のページ縮小、テキストの読みやすさを維持した縮小などです。 これらは、画像を前景・背景・マスクレイヤーに分割することで実現します。
前景と背景は大幅にダウンサンプリングされそして圧縮されます。
テキスト情報はロスレス圧縮されマスクに格納されます。
さらに、冗長なオブジェクトが削除、リソースの最適化、埋込フォントのマージが実施されます。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// MRCプロファイルを選択
PdfOptimizeSetProfile(pOptimizer, eOptimizationProfileMRC);

// MRC 背景と前景レイヤの解像度を指定
PdfOptimizeSetMrcLayerResolutionDPI(pOptimizer, fResolution);

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // MRCプロファイルを選択
    optimizer.Profile = PDFOptimizationProfile.eOptimizationProfileMRC;

    // MRC 背景と前景レイヤの解像度を指定
    optimizer.MrcLayerResolutionDPI = resolution;

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDFファイルのフォントサイズを縮小

複数の埋め込まれたフォントプログラムをマージし、使われていないグリフを削除します。
さらに、Type1フォントプログラムはCFF(Compact Font Formt)に変換します。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// 埋込フォントのサブセット指定およびマージ(結合)指定
PdfOptimizeSetSubsetFonts(pOptimizer, 1);
PdfOptimizeSetMergeEmbeddedFonts(pOptimizer, 1);

// Type1フォントをCFF(Compact Font Format)に変換設定
PdfOptimizeSetConvertToCFF(pOptimizer, 1);

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // 埋込フォントのサブセット指定およびマージ(結合)指定
    optimizer.SubsetFonts = true;
    optimizer.MergeEmbeddedFonts = true;

    // Type1フォントをCFF(Compact Font Format)に変換設定
    optimizer.ConvertToCFF = true;

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("Input file {0} cannot be closed. " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDFファイルの画像を縮小

PDFファイルに埋め込まれた画像をダウンサンプリングして再圧縮することで、ファイルサイズを縮小します。
このサンプルでは、目的の解像度を設定し、圧縮タイプをOptimiserが自動的に選択するよう指定します。
非可逆圧縮タイプの画像品質を指定することもできます。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// 必要な圧縮タイプを設定
PdfOptimizeSetBitonalCompressions(pOptimizer, eComprAttemptGroup4 | eComprAttemptJBIG2 | eComprAttemptSource);
PdfOptimizeSetContinuousCompressions(pOptimizer, eComprAttemptJPEG | eComprAttemptJPEG2000 | eComprAttemptSource);
PdfOptimizeSetIndexedCompressions(pOptimizer, eComprAttemptFlate | eComprAttemptLZW | eComprAttemptSource);

// ダウンサンプリングするターゲット解像度を設定
PdfOptimizeSetResolutionDPI(pOptimizer, fResolution);

// 解像度がターゲット解像度の130%を超える場合に、画像をダウンサンプリングする設定
PdfOptimizeSetThresholdDPI(pOptimizer, 1.3f * PdfOptimizeGetResolutionDPI(pOptimizer));

// 二値画像の高解像度を設定
PdfOptimizeSetBitonalResolutionDPI(pOptimizer, 1.2f * fResolution);
PdfOptimizeSetBitonalThresholdDPI(pOptimizer, 
    1.3f * PdfOptimizeGetBitonalResolutionDPI(pOptimizer));

// 画像品質設定(不可逆圧縮の場合)
PdfOptimizeSetImageQuality(pOptimizer, iQuality);

// 画像の見えない部分をクリップする(切り取る)設定
PdfOptimizeSetClipImages(pOptimizer, 1);

// 画像の色空間を可能な限り複雑でないものに変換する設定
PdfOptimizeSetReduceColorComplexity(pOptimizer, 1);

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath, 
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // 必要な圧縮タイプを設定
    optimizer.BitonalCompressions = PDFComprAttempt.eComprAttemptGroup4 | 
        PDFComprAttempt.eComprAttemptJBIG2 | PDFComprAttempt.eComprAttemptSource;
    optimizer.ContinuousCompressions = PDFComprAttempt.eComprAttemptJPEG | 
        PDFComprAttempt.eComprAttemptJPEG2000 | PDFComprAttempt.eComprAttemptSource;
    optimizer.IndexedCompressions = PDFComprAttempt.eComprAttemptFlate | 
        PDFComprAttempt.eComprAttemptLZW | PDFComprAttempt.eComprAttemptSource;

    // ダウンサンプリングするターゲット解像度を設定
    optimizer.ResolutionDPI = resolution;

    // 解像度がターゲット解像度の130%を超える場合に、画像をダウンサンプリングする設定
    optimizer.ThresholdDPI = (float)1.3 * optimizer.ResolutionDPI;

    // 二値画像の高解像度を設定
    optimizer.BitonalResolutionDPI = (float)1.2 * resolution;
    optimizer.BitonalThresholdDPI = (float)1.3 * optimizer.BitonalResolutionDPI;

    // 画像品質設定(不可逆圧縮の場合)
    optimizer.ImageQuality = quality;

    // 画像の見えない部分をクリップする(切り取る)設定
    optimizer.ClipImages = true;

    // 画像の色空間を可能な限り複雑でないものに変換する設定
    optimizer.ReduceColorComplexity = true;

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDF文書を印刷用に縮小

PDFファイル全体のサイズを縮小しフォントをマージおよびサブセット化してより小さなスプールファイルを作成することで、プリンターのメモリ使用量を減少させます。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// 印刷プロファイルを選択
PdfOptimizeSetProfile(pOptimizer, eOptimizationProfilePrint);

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // 印刷の最適化指定
    optimizer.Profile = PDFOptimizationProfile.eOptimizationProfilePrint;

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません {1} " +
                "(エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません {1} " +
                "(エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDFファイルをWeb用に最適化

PDFファイルのサイズを縮小して、Webサーバーのメモリ使用量を削減すると共にダウンロード時間を減らします。
出力PDFファイルはリニアライズされます。リニアライズとは、PDF文書全体がダウンロードされる前にそのコンテンツが表示されるようにすることです。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// Web/e-mailプロファイルを選択
PdfOptimizeSetProfile(pOptimizer, eOptimizationProfileWeb);

// Auto-linearization(自動リニアライズ)を無効
PdfOptimizeSetAutoLinearize(pOptimizer, 0);

// リニアライズを指定
PdfOptimizeSetLinearize(pOptimizer, bLinearize);

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // WebとE-メールの最適化指定
    optimizer.Profile = PDFOptimizationProfile.eOptimizationProfileWeb;

    // Auto-Linearization(自動リニアライズ)を無効
    optimizer.AutoLinearize = false;

    // リニアライズを指定
    optimizer.Linearize = linearize;

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDF文書の注釈を通常コンテンツに変更

全ての注釈のインタラクティビティ(対話機能)が削除されます。
すなわち、注釈とフォームがPDF文書から削除され、その替わりに同様の視覚的外観が同じ位置に配置されます。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// 注釈やフォームを削除し通常の枠や文字などへの変換指定
PdfOptimizeSetStrip(pOptimizer, eStripAnnots | eStripFormsAnnots);

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath, 
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath, 
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath, 
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T(("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // 注釈やフォームを削除し通常の枠や文字などへの変換指定
    optimizer.Strip = PDFStripType.eStripAnnots | PDFStripType.eStripFormsAnnots;

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDF文書の補足情報を削除

PDF文書に含まれる不必要な情報を削除します。
このサンプルで削除する情報は、
  1. 代替画像
  2. メタデータ
  3. 出力インテント
  4. 文書構造ツリー
  5. サムネール
です。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// PDF文書の「追加情報」を削除する指定
PdfOptimizeSetStrip(pOptimizer, eStripAlternates | eStripMetadata | eStripOutputIntents | 
    eStripStructTree | eStripThumb);

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // PDF文書の「追加情報」を削除する指定
    optimizer.Strip = PDFStripType.eStripAlternates | PDFStripType.eStripMetadata | 
        PDFStripType.eStripOutputIntents | PDFStripType.eStripStructTree | PDFStripType.eStripThumb;

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDF文書を暗号化

暗号化されたPDF文書を作成します。このPDF文書を開くにはパスワードが必要になります。
ここでは、PDF文書をユーザーパスワードを入力して開くと注釈を作成できますが、
全ての操作(変更や印刷など)を実施するには所有者(オーナー)パスワードが必要です。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを作成その際に、ユーザーパスワードとオーナーパスワードを指定
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(szUserPassword), _T(szOwnerPassword),
    ePermAnnotate))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath, 
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 出力ファイルを作成その際に、ユーザーパスワードとオーナーパスワードを指定
    if (!optimizer.SaveAs(outputPath, userPassword, ownerPassword, PDFPermission.ePermAnnotate))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDF文書から画像やフォントファイルを抽出

PDF文書に埋め込まれた全ての画像とフォントファイルを抽出します。
画像の形式やフォントのタイプによって保存されるファイルの形式が違います。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// フォントファイルと、画像ファイルを抽出する指定
PdfOptimizeSetExtractFonts(pOptimizer, 1);
PdfOptimizeSetExtractImages(pOptimizer, 1);

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath, 
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// フォントと画像を抽出
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("フォントと画像を抽出できません。 %s (エラーコード: 0x%08x).\n"), 
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath, 
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // フォントファイルと、画像ファイルを抽出する指定
    optimizer.ExtractFonts = true;
    optimizer.ExtractImages = true;

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // フォントと画像を抽出
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("フォントと画像を抽出できません。 " +
            "{0} (エラー: 0x{1:x}).", optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDFに文書情報を追加

PDF文書のタイトル、所有者、件名、作成者、作成アプリをメタデータとして追加します。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// PDFファイルの Author, Title, Subject, Creator, Producer に値をセット
PdfOptimizeSetInfoEntry(pOptimizer, _T("Author"), _T(szAuthor));
PdfOptimizeSetInfoEntry(pOptimizer, _T("Title"), _T(szTitle));
PdfOptimizeSetInfoEntry(pOptimizer, _T("Subject"), _T(szSubject));
PdfOptimizeSetInfoEntry(pOptimizer, _T("Creator"), _T(szCreator));
PdfOptimizeSetInfoEntry(pOptimizer, _T("Producer"), _T(szProducer));

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    printf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了");

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // PDFファイルの Author, Title, Subject, Creator, Producer に値をセット
    optimizer.SetInfoEntry("Author", author);
    optimizer.SetInfoEntry("Title", title);
    optimizer.SetInfoEntry("Subject", subject);
    optimizer.SetInfoEntry("Creator", creator);
    optimizer.SetInfoEntry("Producer", producer);

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー: 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

PDFに文書のバージョンを更新

出力されるPDF文書の最小バージョンを設定します。
指定できるバージョンは「1.1」から「1.7」です。入力文書のバージョンより高いバージョンを指定した場合に出力文書に反映されます。

C#C/C++ ダウンロード
// Optimizer生成
pOptimizer = PdfOptimizeCreateObject();

// 出力ファイルのバージョンを指定
if (!PdfOptimizeSetVersion(pOptimizer, szVersion))
{
    _tprintf(_T("バージョン %s を出力ファイル %s にセットできません。 %s (エラーコード: 0x%08x).\n"),
        szVersion, szOutputPath, PdfOptimizeGetErrorMessage(pOptimizer),
        PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをオープン
if (!PdfOptimizeOpen(pOptimizer, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// PDFファイルを出力
if (!PdfOptimizeSaveAs(pOptimizer, szOutputPath, _T(""), _T(""), ePermNoEncryption))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}

// 入力ファイルをクローズ
if (!PdfOptimizeClose(pOptimizer))
{
    _tprintf(_T("入力ファイル %s をクローズできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfOptimizeGetErrorMessage(pOptimizer), PdfOptimizeGetErrorCode(pOptimizer));
    iReturnValue = 1;
    goto cleanup;
}
_tprintf(_T("終了");

C#C/C++ ダウンロード
// Optimizerオブジェクト生成
using (Optimizer optimizer = new Optimizer())
{
    // 出力ファイルのバージョンを指定
    if (!optimizer.SetVersion(version))
        throw new Exception(String.Format("The version {0} of the output file {1} cannot be set. " +
            "{2} (エラー: 0x{3:x}).", version, outputPath, optimizer.ErrorMessage, 
            optimizer.ErrorCode));

    // 入力ファイルをオープン
    if (!optimizer.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // PDFファイルを出力
    if (!optimizer.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption))
        throw new Exception(String.Format("出力ファイル {0} を作成できません " +
            "{1} (エラー 0x{2:x}).", outputPath, optimizer.ErrorMessage, optimizer.ErrorCode));

    // 入力ファイルをクローズ
    if (!optimizer.Close())
        throw new Exception(String.Format("入力ファイル {0} をクローズできません " +
            "{1} (エラー: 0x{2:x}).", inputPath, optimizer.ErrorMessage, optimizer.ErrorCode));
}
Console.WriteLine("終了");

ご質問、お問い合わせ

メールで support@TrustSS.co.jp 宛てにお送りください。
または、質問のページからお送りいただくようお願いします。ご要望も承っております。

PDF-Tools サンプル

PDF Toolsとは

PDF/Aとは