You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:36:07