PDF Printer(PDF印刷) C++サンプル

PDF Printer(PDF印刷)

「PDF Printer」ライブラリはPDFばかりではなくTIFFやJPEG画像を各種のプリンタードライバーを介して印刷します。

PostScriptプリンターはやPCLプリンターをサポートしています。

ローカルプリンター、リモートプリンターおよびインターネット上のプリンターのいずれにも印刷できます。

プリンターの各種プロパティ(用紙トレー、用紙サイズ、複数ページ印刷など)を詳細に設定でき、 印刷ジョブを詳細にコントロールできます。

PDF Printer 機能概要

C#サンプルC/C++

他のサンプル(英文) - ダウンロードしたサンプルコードには評価用ライセンスキーが含まれます。

無償評価版(リンク先は英語)

価格見積り

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

ライブラリ(評価版API)は無償でダウンロード(試用)できます。
ファイルをダウンロードしてから、適当なフォルダーに解凍します。
以下のようなフォルダーができますので適宜利用します。
binライブラリやライセンスマネージャーなど
doc使用説明書やjavadocなど
includeC/C++用のヘッダー(.h)ファイル
jar PRNA.jar(Javaのラッパー)
libC/C++用のlibファイル
samples各種開発言語のサンプル
無償評価版と共にダウンロードしたライセンスキーをbin/LicenseManager.exeを使って登録してください。

C/C++ サンプル

1っのPDF文書を1っのプリンターで印刷

PDF文書の全てのページを1っのプリンターで印刷するサンプルです。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
#include <stdio.h>
#include <Windows.h>
#include "Printer_c.h"

int main()
{
    // 初期化
    PDFPrnInitialize();

    // プリンターと入力ファイル
    TCHAR* szPrinterName = _T("プリンター名");
    TCHAR* szInputPath = _T("input.pdf");

    // インスタンス生成
    TPDFPrinter pPrinter = PDFPrnCreateObject();

    // 印刷
    PDFPrnPrintFile(pPrinter, szInputPath, szPrinterName, NULL, 1, -1);

    // 後始末
    PDFPrnDestroyObject(pPrinter);
    PDFPrnUnInitialize();

    return 0;
}
PDFPrnInitialize初期化
PDFPrnCreateObjectインスタンス生成
PDFPrnPrintFile 指定のPDF文書のすべてのページを、指定したプリンターで印刷
サンプルの場合は、デフォルトのプリンターで印刷します。
引数には以下の値を指定します。
第一引数インスタンスのハンドル
第二引数印刷するPDFファイル名 (参照:インターネット上のファイルを指定
第三引数プリンター名
NULL("")文字を指定はデフォルトプリンターでの印刷
第四引数PDFが暗号化されている場合のパスワード
暗号化されていない場合は、null("")文字を指定
第五引数印刷を開始するページ番号
第六引数印刷する最終のページ番号
-1を指定すると、最後のページまで印刷
PDFPrnDestroyObjectインスタンスを開放
PDFPrnUnInitializeライブラリを終了

複数のPDF文書を1っのプリンターで印刷

複数のPDF文書の全ページを単一ジョブとして印刷するサンプルです。
印刷ジョブを複数に分割することもできます。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
#include <stdio.h>
#include <windows.h>
#include "Printer_c.h"

int main()
{
    int iReturnValue = 0;

    // ライブラリを初期化
    PDFPrnInitialize();

    // プリンターと入力ファイル
    TCHAR* szPrinterName = _T("プリンター名");
    TCHAR* szInputPaths[] = { _T("input1.pdf"), _T("input2.pdf"), _T("input3.pdf") };
    int nInputPaths = sizeof(szInputPaths) / sizeof(TCHAR*);

    // インスタンス生成
    TPdfPrinter* pPrinter = PDFPrnCreateObject();

    // 指定のプリンターを開く
    if (!PDFPrnOpenPrinter(pPrinter, szPrinterName))
    {
        _tprintf(_T("プリンター %s を開けません。\n%s (エラー: 0x%08x).\n"), szPrinterName, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 印刷ジョブを開始
    if (!PDFPrnBeginDocument(pPrinter, _T("My print job.")))
    {
        _tprintf(_T("プリンターに接続できません。\n%s (エラー: 0x%08x).\n"), PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 入力ファイルを繰り返す
    for (int i = 0; i < nInputPaths; i++) {
        // 入力ファイルを開く
        if (!PDFPrnOpen(pPrinter, szInputPaths[i], _T("")))
        {
            _tprintf(_T("入力ファイル %s を開けません。\n%s (エラー: 0x%08x).\n"), szInputPaths[i], PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
            iReturnValue = 1;
            goto cleanup;
        }

        // 入力ファイルの全ページ
        for (int iPage = 1; iPage <= PDFPrnGetPageCount(pPrinter); iPage++)
        {
            // Print pages of input file
            if (!PDFPrnPrintPage(pPrinter, iPage))
            {
                _tprintf(_T("ページ %d をプリンター %s に印刷できません。\n%s (エラー: 0x%08x).\n"), iPage, szPrinterName, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
                iReturnValue = 1;
                goto cleanup;
            }
        }

        // 入力ファイルを閉じる
        PDFPrnClose(pPrinter);
    }

    // 印刷ジョブを終了
    if (!PDFPrnEndDocument(pPrinter))
    {
        _tprintf(_T("印刷ジョブを終了できません。\n%s (エラー: 0x%08x)."), PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    _tprintf(_T("終了\n"));

    // 後始末
cleanup:
    PDFPrnClosePrinter(pPrinter);
    PDFPrnDestroyObject(pPrinter);
    PDFPrnUnInitialize();

    return iReturnValue;
}
PDFPrnInitialize初期化
PDFPrnCreateObjectインスタンス生成
PDFPrnOpenPrinterプリンターとの接続を開始します。引数には、プリンター名を指定します。
PDFPrnBeginDocument印刷ジョブを開始します。引数に指定した名前のジョブになります。
PDFPrnOpen印刷するPDF文書を開く。 (インターネット上のファイルを開く場合
PDFPrnPrintPage印刷するページを指定
PDFPrnClosePDF文書を閉じる。
「PDF文書を開く => 印刷するページを指定 => PDFを閉じる」の処理を、印刷するすべてのPDF文書に対して繰り返し実行
PDFPrnEndDocument印刷ジョブを終了
PDFPrnClosePrinterプリンターとの接続を終了
PDFPrnDestroyObjectインスタンスを開放
PDFPrnUnInitializeライブラリを終了

1っのPDF文書を複数のプリンターで印刷する

1っのPDF文書の指定されたページをそれぞれ別のプリンター(複数の印刷ジョブ)で印刷するサンプルです。
プリンターごとに別の印刷ジョブを作成します。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
#include <stdio.h>
#include <windows.h>
#include "Printer_c.h"

int main()
{
    int iReturnValue = 0;

    // ライブラリ初期化
    PDFPrnInitialize();

    // プリンターと入力ファイル
    TCHAR* szInputPath = _T("input.pdf");
    TCHAR* szFirstPrinterName = _T("プリンター1名");
    TCHAR* szSecondPrinterName = _T("プリンター2名");
    int iPageNumber = 1;

    // インスタンス生成
    TPdfPrinter* pPrinter = PDFPrnCreateObject();

    // 入力ファイルを開く
    if (!PDFPrnOpen(pPrinter, szInputPath, _T("")))
    {
        _tprintf(_T("入力ファイル %s をオープンできません。\n%s (エラー: 0x%08x).\n"), szInputPath, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
    }

    // 最初のプリンターを開く
    if (!PDFPrnOpenPrinter(pPrinter, szFirstPrinterName))
    {
        _tprintf(_T("プリンター %s をオープンできません。\n%s (エラー: 0x%08x).\n"), szFirstPrinterName, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 最初のプリンタージョブを開始
    if (!PDFPrnBeginDocument(pPrinter, _T("My first print job.\n")))
    {
        _tprintf(_T("プリンターに接続できません。\n%s (エラー: 0x%08x).\n"), PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 入力ファイルの指定ページを印刷
    if (!PDFPrnPrintPage(pPrinter, iPageNumber))
    {
        _tprintf(_T("ファイル %s の %d ページを %s に印刷できません。\n%s (エラー: 0x%08x).\n"), szInputPath, iPageNumber, szFirstPrinterName, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 最初のプリンタージョブを終了
    if (!PDFPrnEndDocument(pPrinter))
    {
        _tprintf(_T("プリンター %s への印刷を失敗\n%s (エラー: 0x%08x).\n"), szFirstPrinterName, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 最初のプリンターを閉じる
    PDFPrnClosePrinter(pPrinter);

    // 2番目のプリンターを開く
    if (!PDFPrnOpenPrinter(pPrinter, szSecondPrinterName))
    {
        _tprintf(_T("プリンター %s をオープンできません。\n%s (エラー: 0x%08x).\n"), szSecondPrinterName, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 2番目のプリンタージョブを開始
    if (!PDFPrnBeginDocument(pPrinter, _T("My second print job.\n")))
    {
        _tprintf(_T("プリンターに接続できません。\n%s (エラー: 0x%08x).\n"), PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 2頁目から最後のページまでを印刷
    for (int iPage = 2; iPage < PDFPrnGetPageCount(pPrinter); iPage++)
    {
        // 入力ファイルの各ページを印刷
        if (!PDFPrnPrintPage(pPrinter, iPage))
        {
            _tprintf(_T("プリンター %s のページ %d を印刷できません。\n%s (エラー: 0x%08x).\n"), szSecondPrinterName, iPage, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
            iReturnValue = 1;
            goto cleanup;
        }
    }

    // 2番目のプリンターを閉じる
    PDFPrnClosePrinter(pPrinter);

    // 入力ファイルを閉じる
    PDFPrnClose(pPrinter);

    _tprintf(_T("終了\n"));

cleanup:
    PDFPrnClosePrinter(pPrinter);
    PDFPrnDestroyObject(pPrinter);
    PDFPrnUnInitialize();

    return iReturnValue;
}
PDFPrnInitialize初期化
PDFPrnCreateObjectインスタンス生成
PDFPrnOpen印刷するPDF文書を開く (インターネット上のファイルを開く場合
PDFPrnOpenPrinterプリンターとの接続を開始
PDFPrnBeginDocument印刷ジョブを開始(引数は任意の印刷ジョブ名)
PDFPrnPrintPage印刷するページを指定
PDFPrnEndDocument印刷ジョブを終了
PDFPrnClosePrinterプリンターとの接続を終了
PDFPrnClosePDF文書を閉じる
PDFPrnDestroyObjectインスタンスを開放
PDFPrnUnInitializeライブラリを終了

プリンターのプロパティを取得

ローカルプリンターのプロパティを取得するサンプルです。
これによって利用中のプリンターに指定できるプロパティを知ることができます。
複数ページモード、トレー、用紙サイズなどを取得します。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
#include <stdio.h>
#include <windows.h>
#include "Printer_c.h"

int main()
{
    int iReturnValue = 0;

    // ライブラリ初期化
    PDFPrnInitialize();

    //出力ファイル
    TCHAR* szTextFilePath = _T("output.txt");

    // インスタンス生成
    TPdfPrinter* pPrinter = PDFPrnCreateObject();

    // 有効なローカルプリンターのリストを出力するファイル生成
    FILE* pTxtFile;
    _tfopen_s(&pTxtFile, szTextFilePath, _T("w"));
    _ftprintf(pTxtFile, _T("ローカルホスト内の有効なプリンター:\n"));
    _ftprintf(pTxtFile, _T("-----------------------------------\n"));

    // 全ローカルプリンター
    for (int iPrinter = 0, nPrinters = PDFPrnGetPrinterCount(pPrinter, _T("")); iPrinter < nPrinters; iPrinter++)
    {
        TCHAR szPrinterName[256];
       _tcscpy_s(szPrinterName, 256, PDFPrnGetPrinter(pPrinter, iPrinter));
       _ftprintf(pTxtFile, _T("プリンター %d: %s\n"), iPrinter + 1, szPrinterName);

       // プリンターを開く
       if (!PDFPrnOpenPrinter(pPrinter, szPrinterName))
       {
           _tprintf(_T("プリンター %s を開けません。\n%s (エラー: 0x%08x).\n"), szPrinterName, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
           continue;
       }

        // プリンターの Duplex modes リスト
        _ftprintf(pTxtFile, _T("  Duplex Modes:\n"));
        for (int j = 0, n = PDFPrnGetDuplexModeCount(pPrinter, szPrinterName); j < n; j++)
            _ftprintf(pTxtFile, _T("   - %s\n"), PDFPrnGetDuplexMode(pPrinter, j));

        // プリンターのトレーリスト
        _ftprintf(pTxtFile, _T("  トレー:\n"));
        for (int j = 0, n = PDFPrnGetBinCount(pPrinter, szPrinterName); j < n; j++)
            _ftprintf(pTxtFile, _T("   - %s\n"), PDFPrnGetBin(pPrinter, j));

        // プリンターの用紙リスト
        _ftprintf(pTxtFile, _T("  用紙:\n"));
        for (int j = 0, n = PDFPrnGetPaperCount(pPrinter, szPrinterName); j < n; j++)
            _ftprintf(pTxtFile, _T("   - %s\n"), PDFPrnGetPaper(pPrinter, j));

        // プリンターのMedia typesリスト
        _ftprintf(pTxtFile, _T("  Media Types:\n"));
        for (int j = 0, n = PDFPrnGetMediaTypeCount(pPrinter, szPrinterName); j < n; j++)
            _ftprintf(pTxtFile, _T("   - %s\n"), PDFPrnGetMediaTypeName(pPrinter, j));

        // プリンターを閉じる
        PDFPrnClosePrinter(pPrinter);

        _ftprintf(pTxtFile, _T("-----------------------------------\n"));
    }

    _tprintf(_T("終了\n"));

    PDFPrnDestroyObject(pPrinter);
    PDFPrnUnInitialize();

    return iReturnValue;
}
PDFPrnInitialize()初期化
PDFPrnCreateObject()インスタンス生成
PDFPrnGetPrinterCount()ローカルのプリンター数、第二引数がNULLの場合はローカル指定
PDFPrnGetPrinter()プリンター名を取得
PDFPrnOpenPrinter()プリンターとの接続開始
PDFPrnGetDuplexModeCount()プリンターのDuplex Mode(両面印刷)の総数
PDFPrnGetDuplexMode()プリンターのDuplex Mode(両面印刷)の
PDFPrnGetBinCount()プリンターのBin(トレー)の総数
PDFPrnGetBin()プリンターのBin(トレー)の内容
PDFPrnGetPaperCount()プリンターの用紙の総数
PDFPrnGetPaper()プリンターの用紙の内容
PDFPrnGetMediaTypeCount()プリンターのMedia Type(印刷媒体)の総数
PDFPrnGetMediaTypeName()プリンターのMedia Type(印刷媒体)名
PDFPrnClosePrinter()プリンターを閉じる
PDFPrnDestroyObject()インスタンスを解放
PDFPrnUnInitialize()ライブラリを終了

PDF文書の印刷時に透かしを追加

文書に透かし(Watermark)を追加して印刷するサンプルです。
透かし(ページ番号や文書名、ロゴなど)を追加して印刷します。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
#include <stdio.h>
#include <windows.h>
#include <math.h>
#include "Printer_c.h"

int main()
{
    int iReturnValue = 0;

    // ライブラリ初期化
    PDFPrnInitialize();

    TCHAR* szInputPath = _T("input.pdf");
    TCHAR* szWatermarkText = _T("承認済み");

    // インスタンス生成
    TPdfPrinter* pPrinter = PDFPrnCreateObject();

    // 入力ファイルを開く
    if (!PDFPrnOpen(pPrinter, szInputPath, _T("")))
    {
        _tprintf(_T("入力ファイル %s を開けません。\n%s (エラー: 0x%08x).\n"), szInputPath, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 既定のプリンターを検索
    const TCHAR* szPrinterName = PDFPrnGetDefaultPrinter(pPrinter);
    if (szPrinterName == NULL || (_tcscmp(szPrinterName, _T("")) == 0))
    {
        _tprintf(_T("既定のプリンターがありません。\n"));
        iReturnValue = 1;
        goto cleanup;
    }

    // プリンターを開く
    if (!PDFPrnOpenPrinter(pPrinter, szPrinterName))
    {
        _tprintf(_T("プリンター %s を開けません。\n%s (エラー: 0x%08x).\n"), szPrinterName, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    // 印刷ジョブ開始
    if (!PDFPrnBeginDocument(pPrinter, _T("Watermark print job.")))
    {
        _tprintf(_T("プリンターに接続できません。\n%s (エラー: 0x%08x).\n"), PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    PDFPrnSetCenter(pPrinter, 1);
    PDFPrnSetPaperSize(pPrinter, -2);

    // 入力ファイルの各ページを印刷
    float fWidth;
    float fHeight;
    float fFontSize;
    for (int iPage = 1; iPage <= PDFPrnGetPageCount(pPrinter); iPage++)
    {
        // 透かしを奇数ページに追加
        if (iPage % 2 == 1)
        {
            PDFPrnSetPageNo(pPrinter, iPage);
            fWidth = PDFPrnGetPageWidth(pPrinter);
            fHeight = PDFPrnGetPageHeight(pPrinter);
            fFontSize = (float)sqrt(fWidth * fWidth + fHeight * fHeight) / _tcslen(szWatermarkText);

            PDFPrnSetWatermarkBold(pPrinter, 1);
            PDFPrnSetWatermarkOutline(pPrinter, 1);
            PDFPrnSetWatermarkFontName(pPrinter, _T("MS 明朝"));
            PDFPrnSetWatermarkFontSize(pPrinter, fFontSize);
            PDFPrnSetWatermarkColor(pPrinter, 0xCCCCCC);
            PDFPrnSetWatermarkXPos(pPrinter, fWidth / 5);
            PDFPrnSetWatermarkYPos(pPrinter, (fHeight - fHeight / 5 + fFontSize / 2));
            PDFPrnSetWatermarkAngle(pPrinter, (float)atan((double)fHeight / fWidth));
            PDFPrnAddWatermarkText(pPrinter, szWatermarkText);
        }
        else
        {
            // 透かしを削除
            PDFPrnDeleteWatermarks(pPrinter);
        }

        // ページを印刷
        if (!PDFPrnPrintPage(pPrinter, iPage))
        {
            _tprintf(_T("ファイル %s のページ %d をプリンター %s に印刷できません。\n%s (ErrorCode: 0x%08x).\n"), szInputPath, iPage, szPrinterName, PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
            iReturnValue = 1;
            goto cleanup;
        }
    }

    // 入力ファイルを閉じる
    PDFPrnClose(pPrinter);

    // 印刷ジョブを終了
    if (!PDFPrnEndDocument(pPrinter))
    {
        _tprintf(_T("印刷ジョブを終了失敗\n%s (エラー: 0x%08x)."), PDFPrnGetErrorMessage(pPrinter), PDFPrnGetErrorCode(pPrinter));
        iReturnValue = 1;
        goto cleanup;
    }

    _tprintf(_T("終了\n"));

cleanup:
    PDFPrnClosePrinter(pPrinter);
    PDFPrnDestroyObject(pPrinter);
    PDFPrnUnInitialize();

    return iReturnValue;
}
PDFPrnInitialize()初期化
PDFPrnCreateObject()インスタンス生成
PDFPrnOpen()入力ファイルを開く
PDFPrnGetDefaultPrinter()既定のプリンター名を取得
PDFPrnOpenPrinter()プリンターとの接続を開始
PDFPrnBeginDocument()印刷ジョブを開始
PDFPrnGetPageCount()開いているPDF文書のページ数を取得
PDFPrnGetPageWidth()
PDFPrnGetPageHeight()
ページの幅、高さを取得
PDFPrnDeleteWatermarks()透かしの設定を削除
PDFPrnPrintPage()指定のページを印刷
PDFPrnClose()PDF文書を閉じます。
PDFPrnEndDocument()印刷ジョブを終了
PDFPrnClosePrinter()プリンターを閉じる
PDFPrnDestroyObject()インスタンスを解放
PDFPrnUnInitialize()ライブラリを終了

インターネット(Web)上のPDF文書を直接印刷する

PDF Printerは、変換されるPDF文書を指定する際に、インターネット(Web)上のファイルを指定できます。
PDFファイルを指定する場合に、以下の形式で指定するとHTTPプロトコルでファイルにアクセスします。
http://[username:password@]domain[:port][/resource]
"username"および"password"は基本認証(Basic Authentication)のユーザー名とパスワード指定です。

このように指定すると、ネットワーク上のPDF文書を直接指定のプリンターで印刷できます。複数のPDF文書を指定する場合は、ローカルのPDFとネットワーク(Web)上の(リモート)PDFを混在させることもできます。
具体的には、以下のようにファイルを指定します。
PDFPrnOpen(pPrn, "https://www.pdf-tools.trustss.co.jp/data/Receipt2.pdf", NULL);

サンプルコード

C/C++ PDF 印刷 サンプル(日本語)

PDF 印刷 サンプル(英語、評価ライセンスおよびライブラリを含む)

ご質問、お問い合わせ

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

PDF-Tools C++サンプル

PDF Toolsとは

PDF/Aとは