C# PrintQueue AddJob printingHandle 抛出空异常

Posted

技术标签:

【中文标题】C# PrintQueue AddJob printingHandle 抛出空异常【英文标题】:C# PrintQueue AddJob printingHandle throws null exception 【发布时间】:2017-12-15 17:32:20 【问题描述】:

我正在尝试使用 C# 打印文件。我在列出所有打印机方面取得了一些进展,然后编写了一些简单的逻辑来选择正确的打印机:

var server = new PrintServer();
var queues = server.GetPrintQueues(new[]  EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections ).ToList();

int count = 0;
foreach (var q in queues)

    Console.WriteLine(count++ + " " + q.Name);


int iSelection = 0;
while (true)

    Console.Write("Select printer: ");
    string selection = Console.ReadLine();
    if (int.TryParse(selection, out iSelection) && iSelection >= 0 && iSelection < queues.Count())
    
        break;
    
    else
    
        Console.WriteLine("Bad selection, try again.");
    

下一步,至于我在这个网站上看到的帖子,你需要选择特定的队列,然后添加一个作业,抓取作业流,然后写入到流中(至少是这样我想尝试一下,除非错了?)

var queue = queues[iSelection];
var job = queue.AddJob(@".\Test.txt");
var stream = job.JobStream;
var file = File.ReadBytes(@".\Test.txt");
stream.Write(file, 0, file.Length);

当我这样做时,程序在AddJob 处崩溃。具体来说,

System.ArgumentNullException: 'Value cannot be null, Parameter name: printingHandler'

现在,我想我明白问题所在了。昨天我一直在玩 System.Drawing.Printing.PrintDocument,但我正在尝试找到一种解决方案,让我可以打印文件,而不是手动将它们绘制出来并打印出来。最终,未来的目标是能够打印出文本和 PDF 文件(我希望这个解决方案可以让我打开一个 PDF 文件并将字节转储到这个流中,但我不知道那是不是正确的方法?)

无论如何,我认为我得到的异常类似于 PrintDocument 的 PrintPageEventHandler,我需要向 PrintQueue 添加一个回调,以某种方式告诉它字体、颜色、字体大小等。问题是我看不到 PrintQueue允许我为它添加一个句柄来解决这个问题。

我可以做些什么来修复这个异常?

【问题讨论】:

如果没有看到AddJob 方法,我们无法回答这个问题。我猜它有一个默认为null的可选参数,但它不处理该参数为null的情况。 请澄清“打印文件”和“绘制文件然后打印”之间的区别。你想have another application print the file吗? @DourHighArch,我正在尝试让这个应用程序打印文件,或者如果每台 Windows 机器都有一些本机应用程序可以处理它,我想如果我可以指定的话会更好打印机。使用 PrintDocument 对象,您必须提供对属性PrintPage 的回调。我希望有某种方法可以向它扔一个文件,它会知道如何打印出来。抱歉,如果我不能更好地解释自己,我对此知之甚少,也不知道如何正确提问。 【参考方案1】:

我也遇到了这个问题。最终我发现我们需要调用所选PrintQueue 实例的Refresh(),然后再调用AddJob()

【讨论】:

以上是关于C# PrintQueue AddJob printingHandle 抛出空异常的主要内容,如果未能解决你的问题,请参考以下文章

(原)torch中threads的addjob函数使用方法

System.Printing.PrintQueue QueueStatus 未更新

从 Windows Form1 访问 printQueue 类

PrintQueue或PrintTicket是否有任何属性或方法来确定所选的打印机是虚拟打印机?

'UInt32 System.Printing.PrintQueue.GetDpiX(System.Printing.ILegacyDevice)问题解决方法

gin结合cron,实现定时任务