Help us understand the problem. What is going on with this article?

C#でPDFを直接印刷する処理を実装する。

More than 5 years have passed since last update.

Foxit J-Reader

ググってみるとFoxit J-Readerのコマンドで印刷する方法を一番よく目にするが、Foxit J-Readerをインストールする必要があるのでできれば、この方法は避けたい。

GhostScript

GhostScriptを使えば出来そう。

Wikipediaによると

Ghostscript(ゴーストスクリプト)は、PostScript や Portable Document Format (PDF) などアドビシステムズのページ記述言語用のインタプリタおよび、それを基にしたソフトウェアパッケージのことである。

とのこと。 良く分からんが、色々調べるとPDFをPNG、JPEG、TIFとかの画像ファイルに変換する機能があるらしいのでそれを利用する。

GhostSciprtのDLLを使ってPDFを画像ファイルに変換

参考にしたのはこの記事(How To Convert PDF to Image Using Ghostscript API)。

記事にはサンプルコードが書かれているが、サンプルコードをダウンロードできるので、ダウンロードしてそのまま流用する。

実装

GhostSciptをC#から使用する為の準備

  1. プロジェクトを作っておく。
  2. GhostSciprtをダウンロードしてインストール。
  3. インストールフォルダにgsdll32.dllがあるので、作成したプロジェクトのフォルダにコピーする。
  4. プロジェクトのプロパティでビルド時にDLLが出力先フォルダにコピーされるようにビルドイベントにコマンドを記述する。こんな感じCopy /Y "$(SolutionDir)lib\GhostScript\gsdll32.dll" "$(TargetDir)"

  5. 参考記事からソースをダウンロード。(※CodePejectのアカウントが必要)

  6. ダウンロードしたソースからPDFConvert.csをプロジェクトフォルダ内にコピー。

変換と印刷処理

処理の大まかな流れはこんな感じ。

  1. GhostScriptでPDFを画像に変換
  2. System.Drawing.Printing.PrintDocumentオブジェクトを生成
  3. PrintDocument.Print()メソッドで印刷
  4. イベントハンドラの引数に渡されるGraphicsオブジェクトを使ってPrintDocument.PrintPageイベント内で変換した画像を書き込む

サンプルコード

//
// Convert PDF to Image.
//
var src = @"path\to\src.pdf";
var dst = @"path\to\dst.tif";
PdfConvert pc = new PdfConvert();
pc.OutputFormat = "tifflzw";  // TIFF
pc.Convert(src, dst);

//
// Create PrintDocumnt object and execute print.
//
using (var pd = new PrintDocument())
{
    pd.DocumentName = "sample";
    pd.PrintPage += new PrintPageEventHandler((s, e) =>
    {
      using (var img = Image.FromFile(dst))
      {
        e.Graphics.DrawImage(img, e.MarginBounds);
      }
      e.HasMorePages = false;
    });
    pd.Print();
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away