C#で帳票毎にプリンタの印刷設定を保存する方法

Windows の printui.dll を使用して、プリンタの印刷設定をファイルに保存することができます。
また、ファイルに保存された印刷設定をプリンタに設定し直すこともできます。
(例えば1枚に2頁印刷する設定等。もちろんプリンタが対応している場合に限ります。)

この機能を使用すれば、帳票毎にプリンタの印刷設定を変更することが可能になります。

なお、printui.dll の呼び出しは rundll32.exe を用いて行います。

プリンタの印刷設定をファイルに保存するコマンド
rundll32.exe printui.dll,PrintUIEntry /Ss /n "プリンタ名" /a [ファイル名]
ファイルに保存した印刷設定をプリンタに設定し直すコマンド
printui.dll,PrintUIEntry /Sr /n "プリンタ名" /a [ファイル名]

ちなみに、下記のコマンドでプリンタの印刷設定ダイアログを表示することができます。

プリンタの印刷設定ダイアログを表示するコマンド
printui.dll,PrintUIEntry /e /n "プリンタ名"

これらのコマンドを C# から呼び出してプリンタ設定の保存/復元機能を実装します。

プリンタの設定をファイルに保存する関数をC#に実装する
/// <summary>
/// プリンタの印刷設定をファイルに保存する
/// </summary>
/// <param name="printerName">プリンタ名</param>
/// <param name="settingFileName">ファイル名</param>
public void SavePrinterSetting(string printerName, string settingFileName)
{
    try
    {
        var cmdOpt = string.Format(
            "printui.dll,PrintUIEntry /Ss /n \"{0}\" /a {1}"
                , printerName, settingFileName);
        using (var p = Process.Start("rundll32.exe", cmdOpt))
        {
            p.WaitForExit(30000);  //念のために30秒でタイムアウトさせて制御が戻ってくることを担保する
            p.Close();
        }
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex);
    }
}
ファイルに保存した印刷設定をプリンタに設定し直す関数をC#に実装する
/// <summary>
/// ファイルに保存した設定をプリンタに設定し直す
/// </summary>
/// <param name="printerName">プリンタ名</param>
/// <param name="settingFileName">ファイル名</param>
public void LoadPrinterSetting(string printerName, string settingFileName)
{
    try
    {
        var cmdOpt = string.Format(
        	"printui.dll,PrintUIEntry /Sr /n \"{0}\" /a {1}"
        		, printerName, settingFileName);
        using (var p = Process.Start("rundll32.exe", cmdOpt))
        {
            p.WaitForExit(30000);  //念のために30秒でタイムアウトさせて制御が戻ってくることを担保する
            p.Close();
        }
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex);
    }
}
プリンタの印刷設定ダイアログを表示する関数をC#に実装する
/// <summary>
/// プリンタの印刷設定ダイアログを表示する
/// </summary>
/// <param name="printerName">プリンタ名</param>
public void ShowPrinterDaialog(string printerName)
{
    try
    {
        var cmdOpt = string.Format(
        	"printui.dll,PrintUIEntry /e /n \"{0}\"", printerName);
        using (var p = Process.Start("rundll32.exe", cmdOpt))
        {
            p.WaitForExit(); //ユーザがクローズするまで待つのでタイムアウトさせない
            p.Close();
        }
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex);
    }
}

下記のように関数を呼び出して、動作を確認してみます。

//デフォルトプリンタを取得する ※System.Printing に対する参照設定が必要です。
System.Printing.PrintQueue printer = new System.Printing.LocalPrintServer().DefaultPrintQueue;

//デフォルトプリンタのプリンタ名をコンソールに出力する
Console.WriteLine(printer.FullName);

//①プリンタのダイアログを表示する
ShowPrinterDaialog(printer.FullName);

//②プリンタの設定をファイルに保存する
SavePrinterSetting(printer.FullName, "プリンタ設定保存.dat");

//③プリンタのダイアログを表示する
ShowPrinterDaialog(printer.FullName);

//④ファイルに保存した設定をプリンタに設定し直す
LoadPrinterSetting(printer.FullName, "プリンタ設定保存.dat");

//⑤プリンタのダイアログを表示する
ShowPrinterDaialog(printer.FullName);

①で表示された印刷設定ダイアログで設定を変更します。

②で①の印刷設定がファイルに保存されます。

③で表示された印刷設定ダイアログで①と異なる設定にします。

④で①の印刷設定がプリンタに設定し直されます。

⑤で表示された印刷設定ダイアログで現在の設定値を確認します。
③で設定された内容が①で設定された内容に変更されていることが確認できると思います。