まめ - たんたんめん

備忘録 C# / WPF 多め

C# 印刷機能(Microsoft Print to PDF)を使ってC#から画像をPDF化する

画像をPDF化する方法を調べていたところ印刷機能(Microsoft Print to PDF)からPDFを作成する機能を見つけたのでこれをC#から呼び出しbat処理するためにC#で呼び出すサンプルです。 以下のサンプルではディレクトリを指定した場合は含まれる画像ファイルをまとめてPDF化します。

using System.Drawing;
using System.IO;

// ※プリンタAPIを使うには System.Drawing.Commonを参照に追加する必要がある
using System.Drawing.Printing;
using System.Linq;

namespace Print
{
    internal class Program
    {
        public static void Main(string[] args)
        {
           // Image.FromFileが処理できる形式のみ対応
            string[] extensions =
            {
                "BMP",
                "GIF",
                "JPG",
                "JPEG",
                "PNG",
            };
            
            // コマンドライン引数を処理
            foreach (var filepath in args)
            {
                var output = $"{Path.GetFileNameWithoutExtension(filepath)}.pdf";
                var directory = Directory.GetParent(filepath).FullName;

                if (Directory.Exists(filepath))
                {
                    PrintImages(directory, output, Directory
                        .EnumerateFiles(filepath, "*.*", SearchOption.AllDirectories)
                        .Where(x => extensions.Any(y => x.ToUpper().EndsWith(y)))
                        .ToArray());
                }
                else if (extensions.Any(x => filepath.ToUpper().EndsWith(x)))
                {
                    PrintImages(directory, output, filepath);
                }
            }
        }

        private static void PrintImages(string outputDir, string outputFileName, params string[] files)
        {
            PrintDocument doc = new PrintDocument() 
            {    
                PrinterSettings = new PrinterSettings() 
                {
                    // Windows10 から利用可能
                    PrinterName = "Microsoft Print to PDF",
                    MaximumPage = files.Length,
                    ToPage = files.Length,

                    // 縦向き印刷
                    DefaultPageSettings =
                    {
                        Landscape = false,
                    },

                    //出力先をfileに指定する
                    PrintToFile = true,
                    PrintFileName = Path.Combine(outputDir, outputFileName + ".pdf"),
                }
            };
            
            // サイズはA4
            doc.DefaultPageSettings.PaperSize = doc.PrinterSettings.PaperSizes.OfType<PaperSize>().First(x => x.Kind == PaperKind.A4);

            // 余白無し
            doc.DefaultPageSettings.Margins = new Margins(0,0,0,0);

            int currentPageIndex = 0;
            doc.PrintPage += (s, e) =>
            {
                // 画像をページに描き込む
                using (var image = Image.FromFile(files[currentPageIndex]))
                {
                    e.Graphics.DrawImage(image,e.MarginBounds);
                }

               // 次の画像があるか判定し印刷の続行 / 停止を判断する
                currentPageIndex++;
                if (currentPageIndex >= files.Length)
                    e.HasMorePages = false;
                else
                    e.HasMorePages = true;
            };
            
            doc.Print();            
        }
    }
}