以编程方式打印到虚拟打印机(XPS)

时间:2013-05-05 16:36:04

标签: c# winforms printing print-preview

我将使用PrintDocument显示我的C#WinForms应用程序的一部分,它几乎已经完成,但我的打印机出现问题。我使用以下代码捕获表单的图像,然后打印此图像,最后我使用PrintPreviewDialog显示打印预览:

PrintDocument doc = new PrintDocument();
doc.PrintPage += doc_PrintPage;
doc.Print();
printPreviewDialog1.Document = doc;
printPreviewDialog1.ShowDialog();

这是doc_PrintPage函数:

Bitmap bmp = new Bitmap(tabControl1.Width, tabControl1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
tabControl1.DrawToBitmap(bmp, new Rectangle(0, 0, tabControl1.Width, tabControl1.Height));
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
e.Graphics.DrawImage((Image)bmp, 0, 0);

调用doc.print()函数时,Microsoft OneNote程序会打开并显示我的打印表单,PrintPreviewDialog控件也会打开一个包含我预览的新表单。

我打算使用静音打印,这样就不会打开任何打印机程序(如OneNote设置为我的默认打印机)或打开物理打印机(我想如果我的用户连接了物理打印机,页面将会实际印刷!这不是我想要的)。我只是想显示一个没有任何打印的打印预览,有什么方法可以打印到XPS(虚拟打印机文件?)或任何其他没有实际打印的方式?

2 个答案:

答案 0 :(得分:2)

您必须设置/更改PrintDocument.PrinterSettings以设置特定的打印机,否则Print将不知道需要特定的打印机,并提示用户确认默认打印机或选择其他打印机。

更新

脱离我的头顶,类似下面的内容可能会起到作用:

PrinterSettings printerSettings = new PrinterSettings();
printerSettings.PrinterName = "Microsoft XPS Document Writer";
doc.PrinterSettings = printerSettings;

您可能需要尝试各种设置才能获得您想要的内容。

答案 1 :(得分:2)

我无法添加评论,因此无法回答。 如果您想确定打印输出不会以(虚拟)打印机结束,那么Peter Ritchie的建议是正确的。

我已经检查了PrintPreviewDialog,这就是我的工作:

PrintDocument doc = new PrintDocument();
doc.PrinterSettings.PrinterName = this.m_printingParameters.SelectedPrinterName;
doc.PrinterSettings.PrintFileName = Path.Combine(Path.GetTempPath(), "Temporary_result.xps");
doc.PrinterSettings.PrintToFile = true;
doc.PrintPage += doc_PrintPage;

PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
printPreviewDialog1.Document = doc;
printPreviewDialog1.ShowDialog();

如果用户点击打印图标,结果将打印到临时文件夹中的文件。只是为了确保您之后可以删除该文件。

但是,如果您想创建一个没有打印按钮的打印预览对话框,请查看此主题Disabling "print" button in .net print preview dialog

这是你在找什么?