You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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这种服务端场景,有两种典型路径:

  1. 跨平台路径:服务端用Microsoft.Maui.Graphics生成PDF/图片格式的可打印内容,返回给客户端,由客户端调用自身平台的打印功能(比如浏览器打印PDF、桌面应用调用系统打印API)。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:55:08