我正在尝试使用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的任何内容允许我为它添加一个句柄来解决这个问题。
我该怎么做才能解决此异常?
答案 0 :(得分:1)
我也遇到了这个问题。最终,我发现我们需要调用选定的Refresh()
实例中的PrintQueue
并在调用AddJob()
之前。