.net c# 从控制台应用程序向打印机发送文件

.net c# sending a file to the printer from a console application

我正在 .Net Framework 4.8 中编写控制台应用程序,它将 运行 作为 Windows 服务。在此控制台应用程序中应该可以将文件发送到打印机(安装在与 Windows 服务 运行ning 所在的同一台电脑上)。但是我发现这非常具有挑战性并且还没有找到合适的解决方案。我无法控制电脑上还安装了什么(例如 Adob​​e Acrobat Reader)。以下是我已经尝试过的:

我做错了什么?我认为这是直截了当的,但显然不是。可以这么说,这让我觉得我是在从错误的角度看待它。 是否有可用的示例或 Nuget 包来帮助我实现这一目标? 如果您需要任何其他信息,请问我。

听起来您需要一个库来支持通过 windows 服务或控制台应用程序对您感兴趣的各种文件格式进行栅格化和渲染。您可以查看 Leadtools.Document.sdk nuget 包(请注意我是该供应商的员工)。

我继续组织了一个项目来测试它,它对我有用。我能够打印 sdk 支持的 150 多种文件格式中的任何一种。有关支持的文件格式的完整列表,请参阅 here

示例代码如下:

using (var document = DocumentFactory.LoadFromFile(@"filename.docx", new LoadDocumentOptions()))
    PrintDocument(document);

static void PrintDocument(LEADDocument document)
{
   using (var printDocument = new PrintDocument())
   {
      printDocument.PrinterSettings.MinimumPage = 1;
      printDocument.PrinterSettings.MaximumPage = document.Pages.Count;
      printDocument.PrinterSettings.FromPage = 1;
      printDocument.PrinterSettings.ToPage = document.Pages.Count;
      printDocument.PrinterSettings.PrinterName = "Adobe PDF";
      printDocument.DefaultPageSettings = new PageSettings();

      var pageNumber = printDocument.PrinterSettings.FromPage;

      printDocument.PrintPage += (object sender, PrintPageEventArgs e) => PrintPageHandler(e, document, printDocument, ref pageNumber);
      printDocument.Print();
   }
}

private static void PrintPageHandler(PrintPageEventArgs e, LEADDocument document, PrintDocument printDocument, ref int pageNumber)
{
   PrintPage(document, pageNumber, e);
   pageNumber++;

   e.HasMorePages = (pageNumber <= printDocument.PrinterSettings.ToPage);
   if (!e.HasMorePages)
      pageNumber = 1;
}

static void PrintPage(LEADDocument document, int pageNumber, PrintPageEventArgs e)
{
   var page = document.Pages[pageNumber - 1];

   // Get page size in pixels
   var pixelSize = page.SizeToPixels(page.Size);
   // Convert to DPI
   var size = LeadSizeD.Create(pixelSize.Width * 96.0 / page.Resolution, pixelSize.Height * 96.0 / page.Resolution).ToLeadSize();
   // Fit in the margin bounds
   var destRect = LeadRect.Create(e.MarginBounds.X, e.MarginBounds.Y, e.MarginBounds.Width, e.MarginBounds.Height);
   destRect = RasterImage.CalculatePaintModeRectangle(size.Width, size.Height, destRect, RasterPaintSizeMode.Fit, RasterPaintAlignMode.Center, RasterPaintAlignMode.Center);

   // Get the page image
   using (var rasterImage = page.GetImage())
   using (var bitmap = RasterImageConverter.ConvertToImage(rasterImage, ConvertToImageOptions.None))
      e.Graphics.DrawImage(bitmap, destRect.X, destRect.Y, destRect.Width, destRect.Height);
}

在比较了不同的打印库(和 pdf 操作)后,我们选择了 Gembox.Pdf 来满足要求。这使我们能够从 windows 服务打印 pdf、png、jpg 等。