PDFの画像化

PDFやPSなどのファイルはGhostScriptを使うことで、PNGJpegなどの画像に変換することができる

一番上のサイトを見ればC#を使って画像ファイルに変換することができる。
また、DLLを使って変換するなんてのもある

こっちのほうがやや敷居が高いかも知れない



ただ、画像に変換したファイルを再びC#のプログラム内で利用したい場合、一旦記憶媒体に書き込むのは無駄である。そこで標準出力に変換した画像データを書き込んでもらうことでメモリ上でやり取りする方法を考えた。基本的には「素直研究所 技術開発部C#でGhostscriptを使ってPDFのページイメージをJpegファイルに保存する方法」のパクリなのだが、出力先に-を指定することで標準出力に出力させ、それをC#で拾い、それをImageクラスで読み込みPictureBoxに表示することをやってみた

string strPdfPath = @"PDF.pdf";
string strGSPath = @"C:\gs\gs8.64\bin\gswin32c.exe";
int ShowPage = 2;
int Resolution = 300;
string Format = "pngalpha";
string Password = null;
using (Process ghostscript = new Process())
{
    {
        var StartInfo = ghostscript.StartInfo;
        StartInfo.FileName = strGSPath;
        {
            StartInfo.Arguments = " -q";
            StartInfo.Arguments += " -dSAFER";
            StartInfo.Arguments += " -dBATCH";
            StartInfo.Arguments += " -dNOPAUSE";
            StartInfo.Arguments += " -sDEVICE=" + Format.ToString();
            StartInfo.Arguments += " -r" + Resolution.ToString();
            StartInfo.Arguments += " -sOutputFile=-";
            StartInfo.Arguments += " -dFirstPage=" + ShowPage;
            StartInfo.Arguments += " -dLastPage=" + ShowPage;
            if (!string.IsNullOrEmpty(Password))
                StartInfo.Arguments += "-sPDFPassword =" + Password;
            StartInfo.Arguments += " " + strPdfPath;
        }
        StartInfo.CreateNoWindow = true;
        StartInfo.UseShellExecute = false;
        StartInfo.RedirectStandardOutput = true;
    }
    ghostscript.Start();
    using (var output = ghostscript.StandardOutput.BaseStream)
    {
        this.pictureBox.Image = Image.FromStream(output);
    }
    //ghostscript.WaitForExit();
}

これはいろいろ役立つかもしれない。圧縮効率が悪いPDFを読み込んで画像に変換し、それを減色し、再びPDFに直せばサイズが小さくなるかもしれない。



ただしGhostScriptをインストールしてないといけないのと、画像の抽出はできていないのが難点かな




画像抽出はこちらを参考にしてください