1

アプリケーションから印刷するページに「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;
}
4

0 に答える 0