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

PDF Printer(PDF印刷)

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

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

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

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

PDF Printer 機能概要

C#サンプルC/C++サンプル

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

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

価格見積り

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

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

  NuGetでのインストール手順

この場合は参照設定などの必要はありません。 評価用ライセンスは こちら から取得してください。

C# サンプル

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

以下のサンプルは、PDF文書の全ページを1っのプリンターで印刷します。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
using System;
using Pdftools.PdfPrint;

namespace SimplePrint
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string inputPath = "input.pdf";
                string printerName = "プリンター名";
                int firstPage = 1;
                int lastPage = -1;

                // PdfPrinterオブジェクト作成
                using (Printer printer = new Printer())
                {
                    // 指定されたプリンターへの出力
                    if (!printer.PrintFile(inputPath, printerName, "", firstPage, lastPage))
                        throw new Exception(String.Format("入力ファイル {0} 印刷できません。\n" + 
                            "{1} (エラー: 0x{2:x}).", inputPath, printer.ErrorMessage, printer.ErrorCode));
                }

                Console.WriteLine("終了");
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
Printer()インスタンス生成
PrintFile( )指定のPDF文書のすべてのページを、指定したプリンターで印刷します。
サンプルの場合は、デフォルトのプリンターで印刷します。
引数には以下の値を指定します。
第一引数印刷するPDFファイル名 (インターネット上のPDFを指定する場合)
第二引数プリンター名
null(または空文字)を指定すると、デフォルトのプリンター
第三引数PDFが暗号化されている場合のパスワード
暗号化されていない場合は、null(または空文字)を指定
第四引数印刷を開始するページ番号
第五引数印刷する最終のページ番号
-1を指定すると、最後のページまで印刷

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

このサンプルは、複数のPDF文書のページを1っのプリンターで印刷します。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
using System;
using Pdftools.PdfPrint;

namespace MultiDocOnePrinter
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string printerName = "Microsoft XPS Document Writer";
                string[] inputPaths = { "input1.pdf", "input2.pdf" };

                // PdfPrinterオブジェクト作成
                using (Printer printer = new Printer())
                {
                    // プリンターを開く
                    if (!printer.OpenPrinter(printerName))
                        throw new Exception(String.Format("プリンター {0} を開けません。\n" + 
                            "{1} (エラー: 0x{2:x}).", printerName, printer.ErrorMessage, printer.ErrorCode));

                    // 印刷ジョブ開始
                    if (!printer.BeginDocument("My print job."))
                        throw new Exception(String.Format("プリンターに接続できません。\n" + 
                            "{0} (エラー: 0x{1:x}).", printer.ErrorMessage, printer.ErrorCode));

                    // 全入力ファイル
                    foreach (string path in inputPaths)
                    {
                        // 入力ファイルを開く
                        if (!printer.Open(path, ""))
                            throw new Exception(String.Format("入力ファイル {0} を開けません。\n" + 
                                "{1} (エラー: 0x{2:x}).", path, printer.ErrorMessage, printer.ErrorCode));

                        // 入力ファイルの全ページ
                        for (int pageNo = 1; pageNo <= printer.PageCount; pageNo++)
                        {
                            // 入力ファイル各ページ
                            if (!printer.PrintPage(pageNo))
                                throw new Exception(String.Format("ページ {0} を プリンター {1} に印刷できません。\n" +
                                    "{2} (エラー: 0x{3:x}).", pageNo, printerName, printer.ErrorMessage, printer.ErrorCode));
                        }

                        // 入力ファイルを閉じる
                        printer.Close();
                    }

                    // プリントジョブ終了
                    if (!printer.EndDocument())
                        throw new Exception(String.Format("プリントジョブを終了できません。\n" + 
                            "{0} (エラー: 0x{1:x}).", printer.ErrorMessage, printer.ErrorCode));
                }

                Console.WriteLine("終了");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
Printer()インスタンス生成
OpenPrinter( )プリンターとの接続を開始します。引数には、プリンター名を指定します。null(または空文字)を指定すると、デフォルトのプリンターとなります。
BeginDocument( )印刷ジョブを開始します。引数に指定した名前のジョブになります。
Open( )印刷するPDF文書を開きます。 (インターネット上のPDFを開く場合
第一引数印刷するPDFファイル名
第二引数暗号化した場合のパスワード
暗号化していない場合は、null(または空文字)を指定します
PrintPage( )指定のページを印刷します。ここでは全ページを印刷します。
ClosePDF文書を閉じます。
「PDF文書を開く => 印刷するページを指定 => PDFを閉じる」の処理を、印刷するすべてのPDF文書に対して繰り返し実行します。
EndDocument印刷ジョブを終了します。

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

このサンプルは、1っのPDF文書のページを指定して複数のプリンター(複数の印刷ジョブ)で印刷します。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
using System;
using Pdftools.PdfPrint;

namespace OneDocMultiPrinter
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string inputPath = "input.pdf";
                string firstPrinterName = "Microsoft XPS Document Writer";
                string secondPrinterName = "Microsoft Print to PDF";
                int pageNumber = 1;

                // PdfPrinterオブジェクト作成
                using (Printer printer = new Printer())
                {
                    // 入力ファイルを開く
                    if (!printer.Open(inputPath, ""))
                        throw new Exception(String.Format("入力ファイル {0} を開けません。\n" + 
                            "{1} (エラー: 0x{2:x}).", inputPath, printer.ErrorMessage, printer.ErrorCode));

                    // 最初のプリンターを開く
                    if (!printer.OpenPrinter(firstPrinterName))
                        throw new Exception(String.Format("プリンター {0} を開けません。\n" + 
                            "{1} (エラー: 0x{2:x}).", firstPrinterName, printer.ErrorMessage, printer.ErrorCode));

                    // 最初の印刷ジョブ開始
                    if (!printer.BeginDocument("My first print job."))
                        throw new Exception(String.Format("プリンターに接続できません。\n" +
                                "{0} (エラー: 0x{1:x}).", printer.ErrorMessage, printer.ErrorCode));

                    // 先頭のページだけを印刷
                    if (!printer.PrintPage(pageNumber))
                        throw new Exception(String.Format("入力ファイル {1} のページ {0} をプリンター {2} に印刷できません。\n" + 
                            "{3} (エラー: 0x{4:x}).", pageNumber, inputPath, firstPrinterName, printer.ErrorMessage, printer.ErrorCode));

                    // 最初の印刷ジョブ終了
                    if (!printer.EndDocument())
                        throw new Exception(String.Format("最初の印刷ジョブを終了できません。\n" + 
                            "{0} (エラー: 0x{1:x}).", printer.ErrorMessage, printer.ErrorCode));

                    // 最初のプリンターを閉じる
                    printer.ClosePrinter();

                    // 2番目のプリンターを開く
                    if (!printer.OpenPrinter(secondPrinterName))
                        throw new Exception(String.Format("Printer {0} could not be opened. {1} " + 
                            "(エラー: 0x{2:x}).", secondPrinterName, printer.ErrorMessage, printer.ErrorCode));

                    // 2番目の印刷ジョブ開始
                    if (!printer.BeginDocument("My second print job."))
                        throw new Exception(String.Format("プリンターに接続できません。\n" + 
                            "{0} (エラー: 0x{2:x}).", printer.ErrorMessage, printer.ErrorCode));

                    // 2ページ以降の全て
                    for (int pageNo = 2; pageNo <= printer.PageCount; pageNo++)
                    {
                        // ページを印刷
                        if (!printer.PrintPage(pageNo))
                            throw new Exception(String.Format("ページ {0} をプリンター {1} に印刷できません。\n" + 
                                "{2} (エラー: 0x{3:x}).", pageNo, secondPrinterName, printer.ErrorMessage, printer.ErrorCode));
                    }

                    // 2番目の印刷ジョブ終了
                    if (!printer.EndDocument())
                        throw new Exception(String.Format("2番目の印刷ジョブを終了できません。\n" + 
                            "{0} (エラー: 0x{1:x}).", printer.ErrorMessage, printer.ErrorCode));

                    // 2番目のプリンターを閉じる
                    printer.ClosePrinter();

                    // 入力ファイルを閉じる
                    printer.Close();
                }

            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
Printer()インスタンス生成
Open印刷するPDF文書を開きます。 (インターネット上のPDFを開く場合
第一引数印刷するPDFファイル名
第二引数暗号化した場合のパスワード
暗号化していない場合は、null(または空文字)を指定します
OpenPrinterプリンターとの接続を開始します。引数には、プリンター名を指定します。null(または空文字)を指定すると、デフォルトのプリンターとなります。
BeginDocument印刷ジョブを開始します。引数に指定した名前のジョブになります。
PrintPage指定のページを印刷
EndDocument印刷ジョブを終了します。
ClosePrinterプリンターとの接続を終了します。
「プリンターを開く => 印刷ジョブを開始 => 印刷するページを指定 => 印刷ジョブを終了 => プリンターを閉じる」の処理を、印刷させたいプリンターすべてに繰り返します。
ClosePDF文書を閉じます。

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

このサンプルは、ローカルで利用できるプリンターのプロパティを取得します。
取得したプロパティを指定することで、プリンターのトレーや用紙のサイズを指定できます。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
using System;
using System.IO;
using Pdftools.PdfPrint;

namespace ListPrinters
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 出力ファイル
                string txtFilePath = "output.txt";

                // PdfPrinterオブジェクト作成
                using (Printer printer = new Printer())
                {
                    // ローカルプリンターのリストを格納するテキストファイル
                    using (StreamWriter writer = new StreamWriter(txtFilePath))
                    {
                        writer.WriteLine("ローカルプリンターのリスト:");
                        writer.WriteLine("----------------------------------------");

                        // 全ローカルプリンター
                        for (int printerNo = 0, printerCount = printer.GetPrinterCount(""); printerNo < printerCount; printerNo++)
                        {
                            string printerName = printer.GetPrinter(printerNo);
                            writer.WriteLine("プリンター {0}: {1}", printerNo + 1, printerName);

                            // プリンターを開く
                            if (!printer.OpenPrinter(printerName))
                                throw new Exception(String.Format("プリンター {0} をオープンできません。\n" + 
                                "{1} (エラー: 0x{2:x}).", printerName, printer.ErrorMessage, printer.ErrorCode));

                            // Duplex Mode (両面印刷)リスト
                            writer.WriteLine("  両面印刷:");
                            for (int i = 0, n = printer.GetDuplexModeCount(printerName); i < n; i++)
                                writer.WriteLine("    - {0}", printer.GetDuplexMode(i));

                            // トレー リスト
                            writer.WriteLine("  トレー:");
                            for (int i = 0, n = printer.GetBinCount(printerName); i < n; i++)
                                writer.WriteLine("    - {0}", printer.GetBin(i));

                            // 用紙サイズリスト
                            writer.WriteLine("  用紙サイズ:");
                            for (int i = 0, n = printer.GetPaperCount(printerName); i < n; i++)
                                writer.WriteLine("    - {0}", printer.GetPaper(i));

                            // Media types リスト
                            writer.WriteLine("  Media Types:");
                            for (int i = 0, n = printer.GetMediaTypeCount(printerName); i < n; i++)
                                writer.WriteLine("    - {0}", printer.GetMediaTypeName(i));

                            // プリンターを閉じる
                            printer.ClosePrinter();

                            writer.WriteLine("----------------------------------------");
                        }
                    }
                }

                Console.WriteLine("終了");
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
Printer()インスタンス生成
OpenPrinterプリンターとの接続を開始します。引数には、プリンター名を指定します。
GetDuplexModeCount()プリンターのDuplex Mode(両面印刷)の総数
GetDuplexMode()プリンターのDuplex Mode(両面印刷)の内容
GetBinCount()プリンターのBin(トレー)の総数
GetBin()プリンターのBin(トレー)の内容
GetPaperCount()プリンターの用紙の総数
GetPaper()プリンターの用紙の内容
GetMediaTypeCount()プリンターのMedia Type(印刷媒体)の総数
GetMediaTypeName()プリンターのMedia Type(印刷媒体)名
ClosePrinterプリンターとの接続を終了します。

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

このサンプルは、文書に透かし(Watermark)を追加して印刷します。

このサンプルコード(評価ライセンスおよびライブラリを含む)をダウンロード 
using System;
using Pdftools.PdfPrint;

namespace Watermarks
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string inputPath = "input.pdf";
                string watermarkText = "承認済み";

                // PdfPrinterオブジェクト作成
                using (Printer printer = new Printer())
                {
                    string printerName = printer.DefaultPrinter;
                    if (String.IsNullOrEmpty(printerName))
                        throw new Exception(String.Format("既定のプリンターがありません。"));

                    // 入力ファイルを開く
                    if (!printer.Open(inputPath, ""))
                        throw new Exception(String.Format("入力ファイル {0} を開けません。\n" + 
                            "{1} (エラー: 0x{2:x}).", inputPath, printer.ErrorMessage, printer.ErrorCode));

                    // プリンターを開く
                    if (!printer.OpenPrinter(printerName))
                        throw new Exception(String.Format("プリンター {0} を開けません。\n" + 
                            "{1} (エラー: 0x{2:x}).", printerName, printer.ErrorMessage, printer.ErrorCode));

                    // 印刷ジョブ開始
                    if (!printer.BeginDocument("Watermark print job."))
                        throw new Exception(String.Format("プリンターに接続できません。\n" + 
                            "{0} (エラー: 0x{1:x}).", printer.ErrorMessage, printer.ErrorCode));

                    printer.Center = true;
                    printer.PaperSize = -2;

                    // 全ページを印刷
                    for (int pageNo = 1; pageNo <= printer.PageCount; pageNo++)
                    {
                        // 奇数ページの全てに「透かし」(Watermark)を追加
                        if (pageNo % 2 == 1)
                        {
                            printer.PageNo = pageNo;
                            float width = printer.PageWidth;
                            float height = printer.PageHeight;
                            float fontSize = (float)Math.Sqrt(width * width + height * height) / 
                                             watermarkText.Length;
                            printer.WatermarkBold = true;
                            printer.WatermarkOutline = true;
                            printer.WatermarkFontName = "MS 明朝";
                            printer.WatermarkFontSize = fontSize;
                            printer.WatermarkColor = 0xCCCCCC;
                            printer.WatermarkXPos = width / 5;
                            printer.WatermarkYPos = (height - height / 5 + fontSize / 2);
                            printer.WatermarkAngle = (float)Math.Atan((double)height / width);
                            printer.AddWatermarkText(watermarkText);
                        }
                        else
                        {
                            // 透かしの設定を削除
                            printer.DeleteWatermarks();
                        }

                        // ページを印刷
                        if (!printer.PrintPage(pageNo))
                            throw new Exception(String.Format("入力ファイル {1} のページ {0} をプリンター {2} に印刷できません。\n" +
                                    "{3} (ErrorCode: 0x{4:x}).", pageNo, inputPath, printerName, printer.ErrorMessage, printer.ErrorCode));
                    }

                    // 入力ファイルを閉じる
                    printer.Close();

                    // 印刷ジョブ終了
                    if (!printer.EndDocument())
                        throw new Exception(String.Format("印刷ジョブを終了出ません。\n" +
                            "{0} (ErrorCode: 0x{1:x}).", printer.ErrorMessage, printer.ErrorCode));
                }

                Console.WriteLine("終了");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
Printer()インスタンス生成
DefaultPrinter既定のプリンター名を取得
Open()印刷するPDF文書を開きます。 (インターネット上のPDFを開く場合
第一引数印刷するPDFファイル名
第二引数暗号化した場合のパスワード
暗号化していない場合は、null(または空文字)を指定します
OpenPrinter()プリンターとの接続を開始します。引数には、プリンター名を指定します。
BeginDocument()印刷ジョブを開始します。引数に指定した名前のジョブになります。
PageCount開いているPDF文書のページ数を取得
PageWidth、PageHeightページの幅、高さを取得
DeleteWatermarks()透かしの設定を削除
PrintPage指定のページを印刷
Close()PDF文書を閉じます。
EndDocument()印刷ジョブを終了します。

インターネット上のPDF文書を指定して印刷する方法

PDF Printerは、PDF文書を指定する際にHTTPプロトコルでファイルを指定できます。以下の形式で指定します。
http://[username:password@]domain[:port][/resource]
"username"および"password"は基本認証(Basic Authentication)のユーザー名とパスワード指定です。
このように指定すると、ネットワーク上のPDF文書を直接指定のプリンターで印刷できます。複数のPDF文書を指定する場合は、ローカルのPDFとネットワーク(Web)上の(リモート)PDFを混在させることもできます。
具体的には、以下のようにファイルを指定します。
printer.PrintFile("https://www.pdf-tools.trustss.co.jp/data/Receipt2.pdf", null, null, 1, -1);
または、
printer.Open("https://www.pdf-tools.trustss.co.jp/data/Receipt2.pdf", null);

サンプルコード

C# PDF Printer 印刷 サンプル(日本語)

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

ライブラリは、nuget.orgから「PDFTools.PdfPrinter」パッケージをインストールできます。 NuGetでのインストール手順

ご質問、お問い合わせ

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

PDF-Tools C#サンプル

PDF Toolsとは

PDF/Aとは