【问题标题】:Is it possible to print documents from a .net core 3.1 Windows Service?是否可以从 .net core 3.1 Windows 服务打印文档?
【发布时间】:2021-01-04 13:55:06
【问题描述】:

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

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

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

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

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

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

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

我意识到我可以将假脱机程序转换为控制台应用程序,然后从计划任务运行它,但 Windows 服务模型似乎只需安装和忘记就更简单(它注定要用于 PC 下一个到仓库中的打印机)

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

【问题讨论】:

  • 我一直在使用 System.Drawing.Printing 作为 ASP.NET Core 服务器。你试过使用这个库吗?当然,我还没有在 .NET Core 中编写过服务,所以我不太确定这是否会有所作为。
  • 感谢 GN,但您的应用程序有 GUI 吗? System.Drawing.Printing 上的文档特别声明它不能可靠地用于 Windows 服务
  • 我没有打印服务的 GUI。但是,我确实通过代码手动创建位图,然后将其作为打印作业发送。 (用于二维码打印)

标签: c# pdf .net-core printing windows-services


【解决方案1】:

令人难以置信的是,我们确实设法实现了不可能的任务 - 从 .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;
}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2021-05-06
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多