ASP.NET Core 8 API从PrintDocument迁移至Microsoft.Maui.Graphics的打印疑问
ASP.NET Core 8 Web API跨平台打印迁移说明与POC示例
微软推荐使用Microsoft.Maui.Graphics的核心含义
PrintDocument是Windows专属API,无法在跨平台的ASP.NET Core环境中正常运行。微软推荐Microsoft.Maui.Graphics的逻辑是:它提供了跨平台的统一图形渲染能力,可以用一套代码生成打印所需的文本、图形、布局内容,再结合不同平台的打印触发机制完成打印。
MAUI本身的打印能力依赖底层平台的原生打印服务,而Microsoft.Maui.Graphics负责的是内容的跨平台绘制,而非直接提供打印调用接口。对于ASP.NET Core Web API这种服务端场景,有两种典型路径:
- 跨平台路径:服务端用
Microsoft.Maui.Graphics生成PDF/图片格式的可打印内容,返回给客户端,由客户端调用自身平台的打印功能(比如浏览器打印PDF、桌面应用调用系统打印API)。 - Windows专属路径:如果API仅部署在Windows环境,可结合
Microsoft.Maui.Graphics生成内容,再调用Windows原生打印API(如System.Printing)直接在服务端完成打印,兼容原有PrintDocument的使用逻辑,但失去跨平台特性。
跨平台打印内容生成POC
这个示例通过Microsoft.Maui.Graphics生成测试打印内容并导出为PDF,API返回PDF文件后,可由客户端发起打印。
步骤1:安装依赖NuGet包
Install-Package Microsoft.Maui.Graphics Install-Package Microsoft.Maui.Graphics.Skia
步骤2:代码实现
using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Skia; using System.IO; public class PrintContentGenerator { public byte[] GenerateTestPrintPage() { // A4纸尺寸(96DPI下约794x1123像素) int pageWidth = 794; int pageHeight = 1123; // 使用Skia渲染器创建画布 using var bitmapContext = new SkiaBitmapExportContext(pageWidth, pageHeight, 96); ICanvas canvas = bitmapContext.Canvas; // 绘制页面背景 canvas.FillColor = Colors.White; canvas.FillRectangle(0, 0, pageWidth, pageHeight); // 绘制标题 canvas.Font = new Font("Arial", 24, FontWeight.Bold); canvas.TextColor = Colors.Black; canvas.DrawString("跨平台测试打印页", 50, 50, pageWidth - 100, HorizontalAlignment.Center); // 绘制正文文本 canvas.Font = new Font("Arial", 12); canvas.DrawString("此内容由Microsoft.Maui.Graphics跨平台生成,可导出为PDF供客户端打印", 50, 150, pageWidth - 100, HorizontalAlignment.Left); // 绘制测试图形 canvas.StrokeColor = Colors.DarkBlue; canvas.StrokeSize = 2; canvas.DrawRectangle(50, 200, pageWidth - 100, 120); canvas.DrawString("测试图形区域", 50, 240, pageWidth - 100, HorizontalAlignment.Center); // 导出为PDF字节数组 using var stream = new MemoryStream(); bitmapContext.WriteToStream(stream, ImageFormat.Pdf); return stream.ToArray(); } } // API控制器 [ApiController] [Route("api/print")] public class PrintController : ControllerBase { private readonly PrintContentGenerator _contentGenerator; public PrintController(PrintContentGenerator contentGenerator) { _contentGenerator = contentGenerator; } [HttpGet("generate-test-page")] public IActionResult GetTestPrintPage() { byte[] pdfBytes = _contentGenerator.GenerateTestPrintPage(); return File(pdfBytes, "application/pdf", "TestPrintPage.pdf"); } }
Windows专属服务端直接打印POC
如果你的API仅部署在Windows服务器,可结合Microsoft.Maui.Graphics生成内容,调用Windows原生打印API直接发起打印任务。
步骤1:安装依赖NuGet包
Install-Package Microsoft.Maui.Graphics Install-Package Microsoft.Maui.Graphics.Skia Install-Package System.Printing
步骤2:代码实现
using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Skia; using System.IO; using System.Printing; using System.Windows.Media; using System.Windows.Media.Imaging; public class WindowsPrintService { public void SubmitTestPrintJob() { // 生成打印内容为Bitmap int pageWidth = 794; int pageHeight = 1123; using var bitmapContext = new SkiaBitmapExportContext(pageWidth, pageHeight, 96); ICanvas canvas = bitmapContext.Canvas; // 绘制内容(同跨平台示例) canvas.FillColor = Colors.White; canvas.FillRectangle(0, 0, pageWidth, pageHeight); canvas.Font = new Font("Arial", 24, FontWeight.Bold); canvas.DrawString("Windows服务端测试打印页", 50, 50, pageWidth - 100, HorizontalAlignment.Center); // 转换为WPF BitmapImage(适配Windows打印API) using var stream = new MemoryStream(); bitmapContext.WriteToStream(stream, ImageFormat.Png); stream.Seek(0, SeekOrigin.Begin); var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.StreamSource = stream; bitmapImage.EndInit(); // 获取默认打印机队列 PrintQueue printQueue = LocalPrintServer.GetDefaultPrintQueue(); PrintTicket printTicket = printQueue.DefaultPrintTicket; // 创建打印视觉对象 var visual = new DrawingVisual(); using (DrawingContext dc = visual.RenderOpen()) { // 适配打印机页面尺寸 PageMediaSize pageSize = printTicket.PageMediaSize; dc.DrawImage(bitmapImage, new System.Windows.Rect(0, 0, pageSize.Width.Value, pageSize.Height.Value)); } // 提交打印任务 using var printDocument = new System.Windows.Documents.PrintDocument(); printDocument.DocumentPaginator = new SinglePagePaginator(visual); printDocument.Print(printTicket); } } // 自定义单页分页器 public class SinglePagePaginator : System.Windows.Documents.DocumentPaginator { private readonly Visual _printVisual; private readonly Size _pageSize; public SinglePagePaginator(Visual visual) { _printVisual = visual; _pageSize = new Size(8.5 * 96, 11 * 96); // 8.5x11英寸,96DPI } public override bool IsPageCountValid => true; public override int PageCount => 1; public override Size PageSize { get => _pageSize; set => _pageSize = value; } public override IDocumentPaginatorSource Source => null; public override DocumentPage GetPage(int pageNumber) { return new DocumentPage(_printVisual, PageSize, new Rect(PageSize), new Rect(PageSize)); } } // API控制器 [ApiController] [Route("api/print")] public class PrintController : ControllerBase { private readonly WindowsPrintService _printService; public PrintController(WindowsPrintService printService) { _printService = printService; } [HttpPost("print-test-page")] public IActionResult PrintTestPage() { if (!OperatingSystem.IsWindows()) { return BadRequest("此打印功能仅支持Windows操作系统"); } _printService.SubmitTestPrintJob(); return Ok("打印任务已提交至默认打印机"); } }
内容的提问来源于stack exchange,提问作者Axel Samyn
相关产品推荐
相关产品推荐

