トラスト・ソフトウェア・システム
トラスト・ソフトウェア・システム

PDF to PDF/A Converter(PDF/Aへ変換) C++サンプル

「PDF to PDF/A Converter」ソフトは、PDF文書をPDF/A(PDFの長期保存フォーマット)に変換する機能をアプリケーションに追加するための(API)ライブラリです。

PDF/A変換
入力の文書を解析すると共に変換します。解析の結果はログに出力されます。
フォントが埋め込まれていない場合などは、システムのフォントまたは指定のフォントを埋め込みます。

電子署名・タイムスタンプ
必要に応じて電子署名およびタイムスタンプ(RFC3161)を適用します。

機能概要はこちらです。
他にC#VB6.0 および Java のサンプルを公開しています。
無償評価版(リンク先は英語)はこちらです。 ダウンロード手順
PDF to PDF/A Converter ソフト 購入(価格)

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

 ライブラリ(評価版API)は無償でダウンロード(試用)できますので、PDF to PDF/A Converterダウンロード手順を参照してダウンロードください。
 ファイルをダウンロードしてから、インストールもしくは適当なフォルダーに解凍します。以下のようなフォルダーができあがりますので、適宜ご利用ください。
binライブラリやライセンスマネージャーなど
doc使用説明書やjavadocなど
includeC/C++用のヘッダー(.h)ファイル
jarCNVA.jar(Javaのラッパー)
libC/C++用のlibファイル
samples各種開発言語のサンプル
サンプルの実行前に、bin/Pdf2PdfAPI.dllをサンプル実行イメージと同じフォルダーにコピーしてください。また、無償評価版と共にダウンロードしたライセンスキーをbin/LicenseManager.exeを使って登録してください。 ライセンスキーの登録方法はこちらです。

C++による 解説とサンプル

PDF/A文書
PDF/A規格に準拠していて、変更ができません。
 (変換前のPDF文書変換後のPDF文書
 「PDF to PDF/A Converter(PDF/A変換)」ライブラリ(API)を使って、左のようなPDF/A文書をPDF文書から作成します。

 「PDF to PDF/A Converter」ではPDF/Aへの変換ばかりではなく、電子署名やタイムスタンプを施すことができます。「電子署名」を参照してください。電子署名では、その位置を指定指定や、電子署名への印影ができます。
PDFまたはPDF/A文書へのより高機能な電子署名やタイムスタンプを追加する場合は、「PDF Security」を利用してください。

PDF からPDF/A への変換 サンプル・コード

ファイル「Recept2.pdf」(PDF)を「Recept2a.pdf」(PDF/A)に変換するサンプルです。
#include <stdio.h>
#include "pdf2pdfapi_c.h"

#pragma comment(lib,"pdf2pdfapi.lib")

int main()
{
    TPdf2Pdf*  pDocument;
    int        iRetVal = 0;

    Pdf2PdfInitialize();

    if(!Pdf2PdfGetLicenseIsValid()){
        printf("No valid license key found.\n");
        return 10;
    }

    pDocument = Pdf2PdfCreateObject();

    // 解析とレポートを有効にする
    Pdf2PdfSetConvertAlways(pDocument,1);
    Pdf2PdfSetReportDetails(pDocument, 1);
    Pdf2PdfSetReportSummary(pDocument, 1);
    Pdf2PdfSetPostAnalyze(pDocument, 1);
    Pdf2PdfSetCompliance(pDocument, ePDFA1a);

    // 変換
    if(!Pdf2PdfConvert(pDocument, "Receipt2.pdf", "", "Receipt2a.pdf", "Receipt2.log")){
        printf("Analysis in PDF/A compliant or output file could not be created.\n");
        switch(iRetVal=Pdf2PdfGetErrorCode(pDocument)){
        case PDF_E_FILEOPEN:
            printf("ファイルを開けない\n");
            break;
        case PDF_E_FILECREATE:
            printf("ファイルを作成できない\n");
            break;
        case PDF_E_STOPPED:
            printf("解析が中止された\n");
            break;
        default:
            printf("変換エラー (0x%X)\n", iRetVal);
            break;
        }
    }else{
        switch(iRetVal=Pdf2PdfGetErrorCode(pDocument)){
        case PDF_E_CONVERSION:
            printf("変換処理でエラーが発生した\n");
            break;
        case PDF_E_POSTANALYSIS:
            printf("変換処理で解析エラーが発生した\n");
            break;
        case PDF_E_CONFORMANCE:
            printf("文書が要求された標準に準拠していない\n");
            break;
        default:
            printf("ポスト解析 (0x%X)\n", iRetVal);
            break;
        }
    }

    // 後始末
    Pdf2PdfDestroyObject(pDocument);
    Pdf2PdfUnInitialize();
    return iRetVal;
}
Pdf2PdfInitialize 初期化
Pdf2PdfCreateObject PDF文書を扱うインスタンスを生成します。戻り値がハンドルとなります。
Pdf2PdfSetConvertAlways第二引数に、真偽(1または0)を設定します。
真(0以外)を設定すると、入力文書がPDF標準に準拠していなくとも変換します。
Pdf2PdfSetReportDetails第二引数に、真偽(1または0)を設定します。
真(0以外)を設定すると、変換ステップにおいてページごとのPDF標準準拠違反をログファイルに書き出します。ReportSummaryよりも詳細な情報が提供されます。
Pdf2PdfSetReportSummary第二引数に、真偽(1または0)を設定します。
真(0以外)を設定すると、変換ステップおよび変換後の解析ステップにおけるエラーや警告がログファイルに書き込まれます。
Pdf2PdfSetPostAnalyze第二引数に、真偽(1または0)を設定します。
真(0以外)を設定すると、作成したPDF出力ファイルを解析し、指定された準拠性のレベルを満たしているか否かを確認します。この分析の結果がはログファイルに書き込まれます。
 入力ファイルの解析で問題を検出できなったにもかかわらず、変換中に問題が検出される場合があります。それは、入力パラメータ(例えば、ICCプロファイルなど)に依存しているような場合に起こりえます。変換後の解析では、このような変換中に検出された出力ファイル内のエラーを提供します。
 ポスト解析は、文書が変換できた場合のみ実行されます。
Pdf2PdfSetCompliance このプロパティには、PDFの準拠性のレベルを指定します。指定できるのは以下の値です。
設定値レベル
ePDFA1aPDF/A-1a
ePDFA1bPDF/A-1b
ePDFA2aPDF/A-2a
ePDFA2bPDF/A-2b
ePDFA2uPDF/A-2u
ePDFA3aPDF/A-3a
ePDFA3bPDF/A-3b
ePDFA3uPDF/A-3u
Pdf2PdfConvert  変換を実行します。各引数には以下の値を指定します。
第二引数入力の(変換される)PDFファイル (インターネット上のPDF文書を開く場合
第三引数PDFデータの暗号化パスワード
パスワードを指定しない場合は、空の文字列を指定します。
第四引数出力のPDFファイル名
第五引数ログファイル名
エラーなどが書き込まれます。

インターネット(Web)上のファイルを指定する方法

入力のPDFファイル指定の際に以下の形式で指定すると、インターネット上のPDFファイルを直接変換できます。
http://[username:password@]domain[:port][/resource]
"username"および"password"は基本認証(Basic Authentication)のユーザー名とパスワード指定です。
先のサンプルで"Pdf2PdfConvert( )"のコードを以下のように変更すると、Web上のPDFを変換しローカルに新しいPDFファイルを作成します。
// 変換
if(!Pdf2PdfConvert(pDocument, "http://www.pdf-tools.trustss.jp/data/Receipt2.pdf", "", "Receipt2a.pdf", "Receipt2.log"))
{
 ...
}

電子署名

 PDF to PDF Converterを使って、PDF文書に電子署名できます。さらに必要があれば、タイムスタンプも追加できます。 追加された、電子署名やタイムスタンプはAcrobat Readerで検証できます(プラグインは必要ありません)。
 電子署名(Sign)するには、署名者(Signer)の証明書を指定するだけで簡単に追加されます。以下のように変換前に証明書のCN(Common Name)などを指定します。
Pdf2PdfSetCertificateName(pDocument, "Taro Yamada");
Pdf2PdfSetIssuer(pDocument, "CA21-5");
Pdf2PdfSetSignatureSerialNumber(pDocument, "15 a3");
Pdf2PdfSetSignatureReason(pDocument,TEXT("Received"));
Pdf2PdfSetSignatureRectangle(pDocument, 390, 613, 120, 52);
Pdf2PdfSetCertificateName( )証明書の所有者名(CN:Common Name)を指定します。発行者とシリアル番号で証明書を指定した場合は、自由な文字列を指定できます。
Pdf2PdfSetIssuer( )証明書の発行者名(Issuer)を指定します。名前だけで証明書を一意に選択できる場合は省略できます。
Pdf2PdfSetSignatureSerialNumber( )証明書のシリアル番号を指定します。証明書の発行者名と共に指定します。
Pdf2PdfSetSignatureReason( )署名の理由を指定します。[省略可]
日本語で表示する場合は、PDF Securityを利用してください。
Pdf2PdfSetSignatureRectangle( )署名領域をX座標、Y座標、幅、高さの順に指定します。[省略可]
A4サイズの場合、左下はX=0,Y=0で右上は、X=595,Y=842です。省略すると、署名領域はページの左下になります。
PDF/A 電子署名 署名したPDFデータはこちらです。
PDF文書の署名検証方法はこちらです。
 署名領域は、既定の背景色が利用されます。背景色や文字サイズなどを変えたい場合は、PDF Securityを使って署名します。
CryptoAPIで選択した電子証明書で署名する方法は別途解説しています。

印影の付いた電子署名

 PDF to PDF Converterでは、電子署名の領域に印影を追加できます。印影の画像を用意した上で、以下のようなコードを変換前に実行します。(この印影は、「電子印鑑」や「電子押印」などと同じ意味です。)
Pdf2PdfSetSignatureImageFileNameA(pDocument, "hanko.png");
 第二引数に印影画像のファイル名を指定します。

PDF/A 電子署名 印影 印影付き署名PDFデータはこちらです。
PDF文書の署名検証方法はこちらです。
 画像の形式は、PNGのほかにTIFやJPEG,GIF形式など利用できます。ただし、カラー プロファイルをPDF文書と同じにします。

 印影付き署名PDFデータはこちらです。  印影は、署名領域内に表示されます。 表示位置などを変える場合は、Pdf2PdfSetSignatureRectangle( )で指定します。

 Adobe AcrobatでのPDF文書の署名検証方法はこちらを参照してください。

タイムスタンプ

 Pdf to PDF Converterでは、タイムスタンプを追加できます。以下のコードを変換前に実行します。
Pdf2PdfSetTimeStampURL(pDocument,"http://ca21.trustss.jp/tsa/");
タイムスタンプ局(TSA)のURLを指定します。
指定したタイムスタンプのURLは、テスト用のタイムスタンプを発行するTSAです。このTSAは無償・無登録で自由に使えますが、負荷によってはレスポンスが低下します。

 署名とタイムスタンプを施したPDFデータはこちらです。

 Adobe AcrobatでのPDF文書の署名検証方法はこちらです。

ログファイルの例

 MS-Wordで作成した文書をAcrobatで通常のPDFに変換し、それをPDF/A文書に変換した際のログファイルの例を以下に記します。
- Opening file c:\pdf2pdfconv\Receipt2.pdf.
- Analyzing c:\pdf2pdfconv\Receipt2.pdf.
"c:\pdf2pdfconv\Receipt2.pdf", 0, 64, 0x0A09C882, "The property 'xmpMM:subject' is not defined in schema 'XMP Media Management Schema'.", 1
"c:\pdf2pdfconv\Receipt2.pdf", 0, 64, 0x0A09C881, "The schema description for namespace 'pdfx:' (http://ns.adobe.com/pdfx/1.3/) is missing.", 6
"c:\pdf2pdfconv\Receipt2.pdf", 0, 64, 0x8341052B, "The required XMP property 'pdfaid:part' is missing.", 1
"c:\pdf2pdfconv\Receipt2.pdf", 0, 64, 0x8341052B, "The required XMP property 'pdfaid:conformance' is missing.", 1
"c:\pdf2pdfconv\Receipt2.pdf", 1, 65, 0x03418614, "A device-specific color space (DeviceGray) without an appropriate output intent is used.", 1
"c:\pdf2pdfconv\Receipt2.pdf", 1, 0, 0x83410612, "The document does not conform to the requested standard.", 1
- Setting output intent profile C:\Windows\system32\spool\drivers\color\sRGB Color Space Profile.icm.
- Conversion events.
  - Parts of the XMP metadata could not be repaired and had to be removed.
* Conversion errors in c:\pdf2pdfconv\Receipt2a.pdf.
- File c:\pdf2pdfconv\Receipt2.pdf processed.
 変換前の解析では、PDF文書にいくつかの問題(PDF/Aに変換するためにメタデータが欠落しているなど)があることが示されています。
 変換後には、上記の問題が解決(メタデータが修正もしくは削除)されたことで正しく変換できたことが示されています。変換されたPDF文書は、指定された規格に準拠しています。

エラーについて

 変換前のエラーと変換後のエラーが報告されます。以下にその例を示します。
返還前のエラー
エラーコード内容
PDF_E_FILE_OPEN入力ファイルがオープンできなかった
PDF_E_FILE_CREATE出力ファイルを生成できない
PDF_E_STOPED解析を中止した
変換後のエラー (ポスト解析が実施された場合のみ報告される)
エラーコード内容
PDF_E_CONVERSIONPDFからPDF/Aの変換でエラーが発生
PDF_E_METADATAXMPメタデータが部分で削除されたか、修正できない
PDF_E_POST_ANALYSIS出力文書のポスト解析でエラー
PDF_E_CONFORMANCE文書が規格に準拠していない
SIG_CREA_E_CERT指定された電子証明書が見つからない
なお、エラーは、以下のコードを追加すると抑制できます。
// Error Mask
Pdf2PdfSetConversionErrorMask(pDocument,
              ePDFConversionErrorVisualDiff
            + ePDFConversionErrorOCGRemoved
            + ePDFConversionErrorTranspRemoved
            + ePDFConversionErrorEFRemoved
            + ePDFConversionErrorLinearization
            + ePDFConversionErrorSigCrea);

サンプルコード

 このサンプルには、電子署名のコードが含まれています。電子証明書がなければ実行できませんので、電子署名を施さない場合はその部分を削除してください。
 C++ PDF Converter サンプル (MS Visual Studio 2008 Project) PDFcnvCpp.zip

ご質問、お問い合わせ

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

(記載の会社名および製品名は、各社の登録商標および商標です。)
PDF製品 C++サンプル
PDF Security
PDF Validator
PDF to PDF/A Converter
PDF to Image Converter
PDF Imager-LP
Image to PDF Converter
PDF Printer
PDF Viewer
PDF Viewer-L
PDF Prep Tool Suite
PDF Optimization
PDF Command Line Suite
PDF Extract
PDF Easy Parse
株)トラスト・ソフトウェア・システム
暗号化・電子署名・タイムスタンプ ライブラリ作成します。
お問い合わせください。