PDF to PDF/A Converter(PDFをPDF/Aに変換) サンプル・ソースコード

PDF to PDF/A Converter

PDF Security 動作概要

PDF/Aへの変換
このツールは、入力の文書を解析しながら変換します。
フォントなどが埋め込まれていない場合は、自動的にそれを修正します。フォントを変更して埋め込むこともできます。
変換時の警告などはログファイルに残せますので、規格準拠の対策や文書管理に利用できます。

電子署名・タイムスタンプ
PDF/Aに電子署名・タイムスタンプを適用し、その電子署名を検証します。電子署名には印影の追加ができます。

メタ・データ
PDF/Aはメタデータ(属性-プロパティ-に示されるような、作成者、サブジェクト、作成日、などファイル内容を表す情報)が必須ですので自動で追加されます。
メタ・データを指定して追加できます。

PDF、PDF/Aの適合性チェックとログ
変換前にPDFの適合性をチェックし、変換後にはPDF/Aの適合性をチェックします。PDF Validatorと同じ機能です。
この適合性チェックの結果と共に、変換の際の警告やエラーなどをログファイルに残せます。

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


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

  NuGetでのインストール手順

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

PDF文書をPDF/Aに変換

画像をPDF/A-1aに変換するサンプルです。
別の規格を指定することができます。

C# C/C++ ダウンロード
// Converter生成
pConverter = Pdf2PdfCreateObject();

// PDF規格を設定
Pdf2PdfSetCompliance(pConverter, eCompliance);
Pdf2PdfSetAllowDowngrade(pConverter, 1);

// PDF/Aに変換
if (!Pdf2PdfConvert(pConverter, szInputPath, _T(""), szOutputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s を変換できません。 %s (エラーコード: 0x%08x)\n"),
        szInputPath, Pdf2PdfGetErrorMessage(pConverter), Pdf2PdfGetErrorCode(pConverter));
    iReturnValue = 1;
}
C# C/C++ ダウンロード
// Converter生成
using (Pdf2Pdf converter = new Pdf2Pdf())
{
    // PDF規格を設定
    converter.Compliance = compliance;
    converter.AllowDowngrade = true;

    // PDF/Aに変換
    if (!converter.Convert(inputPath, "", outputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} を変換できません。 " + 
            "{1} (エラーコード: 0x{2:x})", inputPath, converter.ErrorMessage, converter.ErrorCode));
}

PDF文書をPDF/Aに変換し、結果を検証

PDF文書をPDF/Aに変換し、その結果を検証するサンプルです。
検証する「変換エラー(アクションの削除y署名された文書の変換など)」を定義します。検証の結果はログファイルに事前検証の結果と共に出力されます。

C# C/C++ ダウンロード
// Converter生成
pConverter = Pdf2PdfCreateObject();

// PDF規格、ログ作成の設定
Pdf2PdfSetCompliance(pConverter, ePDFA2b);
Pdf2PdfSetReportSummary(pConverter, 1);

// 「変換エラー」として扱う項目を設定
Pdf2PdfSetConversionErrorMask(pConverter, (int)ePDFConversionErrorVisualDiff + (int)ePDFConversionErrorActionRemoved +
    (int)ePDFConversionErrorCorrupt + (int)ePDFConversionErrorDocSigned + (int)ePDFConversionErrorEFRemoved +
    (int)ePDFConversionErrorFontSubst + (int)ePDFConversionErrorStructureRemoved);

// ログファイル名
_tcscpy(szCopyFile, szOutputPath);
szLogFileName = _tcstok(szCopyFile, _T("."));
_tcscat(szLogFileName, _T("-log.txt"));

// 入力ファイルをPDF/Aに変換
if (!Pdf2PdfConvert(pConverter, szInputPath, _T(""), szOutputPath, szLogFileName))
{
    if (Pdf2PdfGetErrorCode(pConverter) == PDF_E_POSTANALYSIS)
    {
        // 作成後のエラー(Post Analysis Error)は出力されたファイルがPDF/Aではないことを示しています。
        // 作成後の解析(Post Analysis)の詳細はログファイルに記録されます。
        _tprintf(_T("出力ファイル %s はPDF/A規格に準拠していません。 %s (エラーコード: 0x%08x)\n"),
            szOutputPath, Pdf2PdfGetErrorMessage(pConverter), Pdf2PdfGetErrorCode(pConverter));
        iReturnValue = 1;
        goto cleanup;
    }
    else if (Pdf2PdfGetErrorCode(pConverter) == PDF_E_CONVERSION)
    {
        int errors = Pdf2PdfGetConversionErrors(pConverter);

        // 変換中に発生したすべての変換エラーを印刷
        _tprintf(_T("ファイルはPDF/Aに変換されましたが、次の変換エラーが発生しました (TPDFConversionError)参照\n"));

        for (int i = 1; i <= errors; i = 2 * i)
        {
            if ((i & errors) != 0)
            {
                _tprintf(_T("- 0x%05x\n"), i);
            }
        }

        // エラーが許容できるかどうかを判断
        _tprintf(_T("\n出力ファイルを確認して、許容できるかどうかを確認してください: [y/n] \n"));

        scanf("%s", str);
        if (_tcscmp(str, _T("y")) != 0)
        {
            _tprintf(_T("変換エラーによって結果が拒否されました。\n"));
            iReturnValue = 1;
            goto cleanup;
        }
    }
    else
    {
        _tprintf(_T("入力ファイル %s をPDF/Aに変換できません。 %s (エラーコード: 0x%08x).\n"),
            szInputPath, Pdf2PdfGetErrorMessage(pConverter), Pdf2PdfGetErrorCode(pConverter));
        iReturnValue = 1;
        goto cleanup;
    }
}
C# C/C++ ダウンロード
// Converter生成
using (Pdf2Pdf converter = new Pdf2Pdf())
{
    // PDF規格、ログ作成の設定
    converter.Compliance = PDFCompliance.ePDFA2b;
    converter.ReportSummary = true;

    // 「変換エラー」として扱う項目を設定
    converter.ConversionErrorMask = (int)PDFConversionError.ePDFConversionErrorVisualDiff + 
        (int)PDFConversionError.ePDFConversionErrorActionRemoved +
        (int)PDFConversionError.ePDFConversionErrorCorrupt + 
        (int)PDFConversionError.ePDFConversionErrorDocSigned +
        (int)PDFConversionError.ePDFConversionErrorEFRemoved + 
        (int)PDFConversionError.ePDFConversionErrorFontSubst + 
        (int)PDFConversionError.ePDFConversionErrorStructureRemoved;

    // 入力ファイルをPDF/Aに変換
    if (!converter.Convert(inputPath, "", outputPath, Path.ChangeExtension(outputPath, null) + "-log.txt"))
    {
        if (converter.ErrorCode == PDFErrorCode.PDF_E_POSTANALYSIS)
        {
            // 作成後のエラー(Post Analysis Error)は出力されたファイルがPDF/Aではないことを示しています。
            // 作成後の解析(Post Analysis)の詳細はログファイルに記録されます。
            throw new Exception(String.Format("出力ファイル {0} はPDF/A規格に準拠していません。 {1} " + 
                "(エラーコード: 0x{2:x})", outputPath, converter.ErrorMessage, converter.ErrorCode));
        }
        else if (converter.ErrorCode == PDFErrorCode.PDF_E_CONVERSION)
        {
            Array errors = Enum.GetValues(typeof(PDFConversionError));

            // 変換中に発生したすべての変換エラーを印刷
            Console.WriteLine("ファイルはPDF/Aに変換されましたが、次の変換エラーが発生しました:");
            foreach (PDFConversionError err in errors)
            {
                if (((int)err & converter.ConversionErrors) != 0)
                    Console.WriteLine("- " + err.ToString());
            }
            // エラーが許容できるかどうかを判断
            Console.WriteLine(Environment.NewLine + "出力ファイルを確認して、許容できるかどうかを" +
                "確認してください: [y/n] ");
            if (Console.ReadLine().ToLower() != "y")
                throw new Exception("変換エラーによって結果が拒否されました。");
        }
        else
           throw new Exception(String.Format("入力ファイル {0} をPDF/Aに変換できません。 " +
            "{1} (エラーコード: 0x{2:x}).", inputPath, converter.ErrorMessage, converter.ErrorCode));
    }
}

PDF文書をPDF/Aに変換して電子署名

PDF文書をPDF/Aに変換して電子署名するサンプルです。
このサンプルでは、Windows Cryptgraphic Providerの電子証明書をCN(Commn Name)で選択します。
他にPDF Securityで電子署名ができます。

C# C/C++ ダウンロード
// Converter生成
pConverter = Pdf2PdfCreateObject();

// PDF規格を設定
Pdf2PdfSetCompliance(pConverter, ePDFA2b);

// Windows Cryptographic Providerを使ったセッションを開始
if (!Pdf2PdfBeginSession(pConverter, ""))
{
    _tprintf(_T("Windows Cryptographic Providerに接続できません。 %s (エラーコード: 0x%08x).\n"),
        Pdf2PdfGetErrorMessage(pConverter), Pdf2PdfGetErrorCode(pConverter));
    iReturnValue = 1;
    goto cleanup;
}

// 署名オブジェクトを生成
pSignature = Pdf2PdfSignatureCreateObject();

// 電子証明書選択、署名
Pdf2PdfSignatureSetName(pSignature, szCertificate);
Pdf2PdfAddSignature(pConverter, pSignature);
Pdf2PdfSignatureDestroyObject(pSignature);

// 電子署名されたPDF/A文書を作成
if (!Pdf2PdfConvert(pConverter, szInputPath, _T(""), szOutputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s を変換できません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, Pdf2PdfGetErrorMessage(pConverter), Pdf2PdfGetErrorCode(pConverter));
    iReturnValue = 1;
}
C# C/C++ ダウンロード
// Converter生成
using (Pdf2Pdf converter = new Pdf2Pdf())
{
    // PDF規格を設定
    converter.Compliance = PDFCompliance.ePDFA2b;

    // Windows Cryptographic Providerを使ったセッションを開始
    if (!converter.BeginSession(""))
        throw new Exception(String.Format("Windows Cryptographic Providerに接続できません。 " +
            "{0} (エラーコード: 0x{1:x}).", converter.ErrorMessage, converter.ErrorCode));

    // 署名オブジェクトを生成
    using (Signature signature = new Signature())
    {
        // 電子証明書選択、署名
        signature.Name = certificate;
        converter.AddSignature(signature);

        // 電子署名されたPDF/A文書を作成
        if (!converter.Convert(inputPath, "", outputPath, ""))
            throw new Exception(String.Format("入力ファイル {0} を変換できません。 {1} " + 
                "(エラーコード: 0x{2:x}).", inputPath, converter.ErrorMessage, converter.ErrorCode));
    }

    // 後始末
    converter.EndSession();
    Pdf2Pdf.Terminate();
}

ご質問、お問い合わせ

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

PDF-Tools サンプル

PDF Toolsとは

PDF/Aとは