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

Ted*_*Ted 6 c# printing pdf windows-services .net-core

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

我创建了一个简单的打印后台处理程序类,它作为Windows ServiceBackgroundService运行,并通过 Web API 监视打印队列,一切都非常愉快。

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

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

不支持在 Windows 服务或 ASP.NET 应用程序或服务中使用 System.Printing 命名空间中的类。尝试在这些应用程序类型之一中使用这些类可能会产生意外的问题,例如服务性能下降和运行时异常。

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

BackgroundServiceWindows 服务打印是一件坏事吗 (tm)?我的(简短的)谷歌搜索未能找到System.Printing/的明显替代品吗?System.Drawing.Printing打印要求应该非常简单,我有 pdf 字节数组数据,我只需要以某种方式到达打印机)。

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

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

Ted*_*Ted 2

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

我们使用FreeSpire.PDF v5.4.0 nuget 包和以下代码将预生成的 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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