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

C# 以编程方式打印到虚拟打印机(XPS),c#,winforms,printing,print-preview,C#,Winforms,Printing,Print Preview,我将使用PrintDocument显示我的C#WinForms应用程序的一部分,几乎完成了,但我的打印机有问题。我使用以下代码捕获表单的图像,然后打印此图像,最后使用PrintPreviewDialog显示打印预览: PrintDocument doc = new PrintDocument(); doc.PrintPage += doc_PrintPage; doc.Print(); printPreviewDialog1.Document = doc; printPreviewDialog1

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

PrintDocument doc = new PrintDocument();
doc.PrintPage += doc_PrintPage;
doc.Print();
printPreviewDialog1.Document = doc;
printPreviewDialog1.ShowDialog();
这是
doc\u 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(虚拟打印机文件?)或任何其他不执行实际打印的方式?

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

更新: 在我脑海中,下面这样的事情可能会起作用:

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

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

我无法添加注释,因此无法给出答案。 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();
如果用户单击打印图标,结果将打印到临时文件夹中的文件中。只是为了确保以后可以删除该文件

不过,如果要创建不带打印按钮的打印预览对话框,请选中此主题


这是您想要的吗?

我已经测试过了,但是当我删除doc.print时,这意味着没有打印任何内容,因此没有可用的预览,是吗?如何显示预览?这仅在当前选择XPS打印机时有效