アプリケーションから印刷するページに「1/7ページ」のようなページ番号を付けられるようにしたい。そのため、2パス印刷ルーチンを実装しました。最初のパスはファイルに出力され、完了すると自動的にキャンセルされます。最初のパスからの合計ページ数は、データをプリンターに送信する2番目のパスで使用されます。
2種類のPrintDocumentsを生成するコードは次のとおりです
public static PrintDocument CreatePrintDocument(PrinterConfiguration printerConfig)
{
PrintDocument document = new PrintDocument();
document.PrinterSettings.PrinterName = printerConfig.PrinterName;
document.DefaultPageSettings.Landscape = printerConfig.IsLandscape;
document.PrintController = new StandardPrintController();
return document;
}
public static PrintDocument CreatePrintDocumentThatCancelsPrint(PrinterConfiguration printerConfig)
{
PrintDocument document = CreatePrintDocument(printerConfig);
document.PrinterSettings.PrintToFile = true;
document.PrinterSettings.PrintFileName = CreateTempFileName();
document.EndPrint += (sender, e) => { e.Cancel = true; };
return document;
}
問題は、PrintToFileが常に機能するとは限らないことです。1台のWindowsXPテストコンピュータで、Win32Exceptionが発生します-最初のパスを実行すると、ハンドルが無効になります。そのため、少しグーグルした後、コードからのPrintDocument.PrintToFileの設定はサポートされていないことがわかりました。
「PrintToFileプロパティはPrintDialogによってのみ使用され、プログラムで設定することはできません。」 http://msdn.microsoft.com/en-us/library/system.drawing.printing.printersettings.printtofile.aspx
では、プリンターに直接印刷して、EndPrintイベントでキャンセルしてみませんか?そうすると、「XPS Document Writer」プリンターに印刷する場合、ユーザーは1回目と2回目のパスの両方で「名前を付けて保存」の質問を受け取ります。
したがって、問題は次のとおりです。「XPSドキュメントライター」に印刷するときに[名前を付けて保存]ダイアログを2回表示せずに、2パス印刷を実行するにはどうすればよいですか。
解像度
JonBが指摘したように、PreviewPrintControllerは、選択したプリンターとのサイレントインタラクションを可能にするプリントコントローラーであるため、代わりにPreviewPrintControllerを確認する必要がありました。
public static PrintDocument CreatePrintDocument(PrinterConfiguration printerConfig)
{
PrintDocument document = new PrintDocument();
document.PrinterSettings.PrinterName = printerConfig.PrinterName;
document.DefaultPageSettings.Landscape = printerConfig.IsLandscape;
document.PrintController = new StandardPrintController();
return document;
}
public static PrintDocument CreatePrintDocumentThatCancelsPrint(PrinterConfiguration printerConfig)
{
PrintDocument document = new PrintDocument();
document.PrinterSettings.PrinterName = printerConfig.PrinterName;
document.DefaultPageSettings.Landscape = printerConfig.IsLandscape;
document.PrintController = new PreviewPrintController();
document.EndPrint += (sender, e) => { e.Cancel = true; };
return document;
}