.net c# 从控制台应用程序向打印机发送文件
.net c# sending a file to the printer from a console application
我正在 .Net Framework 4.8 中编写控制台应用程序,它将 运行 作为 Windows 服务。在此控制台应用程序中应该可以将文件发送到打印机(安装在与 Windows 服务 运行ning 所在的同一台电脑上)。但是我发现这非常具有挑战性并且还没有找到合适的解决方案。我无法控制电脑上还安装了什么(例如 Adobe Acrobat Reader)。以下是我已经尝试过的:
- 使用 .net 中的 PrintDocument class(这似乎是为了创建需要在 运行 时打印的内容,而不是针对已经存在的文件)
- 使用 System.Printing(这不能用于 windows 文档中所述的服务 here)
- 使用动词 'print' 和 'printto' 的流程,如 Stack overflow post
中所述
- 我最终使用了 this Nuget 包。例如,它适用于 .txt 和 .pdf 但不适用于 .docx 文件。我希望能够打印不同种类的文件。
我做错了什么?我认为这是直截了当的,但显然不是。可以这么说,这让我觉得我是在从错误的角度看待它。
是否有可用的示例或 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 等。
我正在 .Net Framework 4.8 中编写控制台应用程序,它将 运行 作为 Windows 服务。在此控制台应用程序中应该可以将文件发送到打印机(安装在与 Windows 服务 运行ning 所在的同一台电脑上)。但是我发现这非常具有挑战性并且还没有找到合适的解决方案。我无法控制电脑上还安装了什么(例如 Adobe Acrobat Reader)。以下是我已经尝试过的:
- 使用 .net 中的 PrintDocument class(这似乎是为了创建需要在 运行 时打印的内容,而不是针对已经存在的文件)
- 使用 System.Printing(这不能用于 windows 文档中所述的服务 here)
- 使用动词 'print' 和 'printto' 的流程,如 Stack overflow post 中所述
- 我最终使用了 this Nuget 包。例如,它适用于 .txt 和 .pdf 但不适用于 .docx 文件。我希望能够打印不同种类的文件。
我做错了什么?我认为这是直截了当的,但显然不是。可以这么说,这让我觉得我是在从错误的角度看待它。 是否有可用的示例或 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 等。