是否可以从 .net core 3.1 Windows 服务打印文档?

Is it possible to print documents from a .net core 3.1 Windows Service?

tl;dr 如何从 .net Core 3.1 Windows 服务打印 pdf?

我创建了一个简单的打印后台处理程序 BackgroundService class,它被 运行 作为 Windows Service,并通过网络监控打印队列 api,都很开心

我在开始编写实际打印代码时发现的一个小问题是,.net core 似乎不希望人们打印 BackgroundService classes 中的文档。

System.Printing 的文档似乎无论如何都建议这样做。

Classes within the System.Printing namespace are not supported for use within a Windows service or ASP.NET application or service. Attempting to use these classes from within one of these application types may produce unexpected problems, such as diminished service performance and run-time exceptions.

System.Drawing.Printing 在其文档中有类似的说明,指出它也不能可靠地用于 Windows 服务。

BackgroundService Windows 服务打印是一件坏事 (tm)?是否有 System.Printing / System.Drawing.Printing 的明显替代方案,我的(简短)谷歌搜索未能找到?打印要求应该很简单,我有 pdf 字节数组数据,我只需要以某种方式使用打印机即可)。

我意识到我可以做一些事情,比如将假脱机程序转换为控制台应用程序,然后 运行 它来自计划任务,但是 Windows 服务模型似乎更简单安装后忘记(它用于仓库中打印机旁边的 PC)

任何有用的建议将不胜感激

令人难以置信的是,我们确实设法实现了不可能的事情 - 从 .net Core 3.1 Windows 服务打印 PDF。

我们使用FreeSpire.PDF v5.4.0 nuget package和下面的代码来打印预生成的pdf数据,到 Zebra 标签打印机。

bool printedOK = true;
string printErrorMessage = "";
try
{
    PdfDocument pdf = new PdfDocument(printJobResult.printJob.PrintData);
    pdf.PrintSettings.PrinterName = jobInfo.PrinterAddress;
    pdf.PrintSettings.DocumentName = jobInfo.Type == PrintJobType.Label ? $"Label {jobInfo.OrderNumber}" : $"DeliveryNote {jobInfo.OrderNumber}";                                    
    if(jobInfo.Type == PrintJobType.Label)
    {
        pdf.PrintSettings.PaperSize = new System.Drawing.Printing.PaperSize("Custom", _labelWidth, _labelHeight);
        pdf.PrintSettings.SetPaperMargins(2, 2, 2, 2);
    }
    pdf.PrintSettings.SelectSinglePageLayout(Spire.Pdf.Print.PdfSinglePageScalingMode.FitSize, true);
    _logger.LogDebug($"Paper Size - Width:{pdf.PrintSettings.PaperSize.Width} Height:{pdf.PrintSettings.PaperSize.Height} Name:{pdf.PrintSettings.PaperSize.PaperName} Kind:{pdf.PrintSettings.PaperSize.Kind} RawKind:{pdf.PrintSettings.PaperSize.RawKind}");

    pdf.Print();
}
catch (Exception ex)
{
    printErrorMessage = "Printing Error: " + ex.ToString();
    printedOK = false;
}

自我注意 - 请检查以下几点的详细信息...

较新版本的 FreeSpire.PDF 插件不允许打印,我相信即使是 5.4.0 版本也有限制(我认为可以打印 10 页),但出于我们的目的,5.4 .0 版本的插件允许我们创建一个整洁的小型交货标签打印后台处理程序,运行 作为仓库 PC 上的 Windows 服务。