.NET控制台应用打印WPF对象时如何规避弹窗并设置输出文件名
问题原因
你遇到的文件名弹窗本质是当前绑定的PrintQueue为虚拟打印设备(如Microsoft Print to PDF、XPS Document Writer),这类设备默认需要用户指定输出路径;实体打印机本身不会触发该弹窗,若要实现全场景无交互打印,无需依赖PrintDialog控件,直接通过打印队列的写入接口操作即可。
解决方案
方案1:无交互打印到实体打印机
无需实例化PrintDialog,直接通过XpsDocumentWriter写入打印队列,全程无任何弹窗:
注意:控制台项目需要提前引用以下程序集:
ReachFramework、System.Printing、PresentationCore、PresentationFramework、WindowsBase
using System.Printing; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; [STAThread] static void Main(string[] args) { // 获取目标打印机队列 var printServer = new LocalPrintServer(); PrintQueue targetQueue = printServer.GetPrintQueue("你的实体打印机完整名称"); // 自定义打印参数 PrintTicket printTicket = targetQueue.DefaultPrintTicket; printTicket.PageOrientation = PageOrientation.Portrait; // 可按需配置纸张大小、打印份数、色彩模式等参数 // 构造待打印的WPF Visual Canvas printContent = new Canvas(); Rectangle r = new Rectangle(); r.Width = 100; r.Height = 100; r.Fill = new SolidColorBrush(Colors.Red); Canvas.SetTop(r, 0); Canvas.SetLeft(r, 0); printContent.Children.Add(r); // 强制渲染Visual避免空白 var pageSize = new System.Windows.Size(printTicket.PageMediaSize.Width.Value, printTicket.PageMediaSize.Height.Value); printContent.Measure(pageSize); printContent.Arrange(new System.Windows.Rect(0, 0, printContent.DesiredSize.Width, printContent.DesiredSize.Height)); printContent.UpdateLayout(); // 直接写入打印队列,无交互 var writer = PrintQueue.CreateXpsDocumentWriter(targetQueue); writer.Write(printContent, printTicket); }
方案2:无交互生成打印文件到指定路径
如果需要直接导出为XPS/PDF等打印文件,不需要走实体打印机,可直接写入到指定路径的XPS文件,全程无弹窗:
using System.IO; using System.Windows.Xps.Packaging; using System.Windows.Xps; [STAThread] static void Main(string[] args) { // 这里复用上面代码构造的printContent和printTicket Canvas printContent = BuildPrintContent(); PrintTicket printTicket = GetCustomPrintTicket(); // 直接输出到指定路径的XPS文件 string outputPath = @"C:\Output\MyPrintFile.xps"; using (var xpsDoc = new XpsDocument(outputPath, FileAccess.ReadWrite)) { XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDoc); writer.Write(printContent, printTicket); } // 若需要生成PDF,可将生成的XPS文件通过无交互方式发送到系统PDF打印机,或借助第三方库完成格式转换 }
注意事项
- 控制台应用的入口方法必须标注
[STAThread],否则WPF打印相关接口会报错 - 如果要打印多页内容,可构造
FixedDocument对象,将每页内容封装为FixedPage添加到文档中,再统一写入打印队列,比单次打印单个Visual灵活性更高 - 打印机名称可通过
LocalPrintServer.GetPrintQueues()遍历所有可用打印机获取,避免名称写错导致队列获取失败
内容的提问来源于stack exchange,提问作者frankborty
相关产品推荐
相关产品推荐

