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

Maui Blazor安卓端HTML打印失效,求WebView实现方案

安卓端MAUI Blazor HTML打印(含PDF)实现方案

一、基于WebView的原生实现步骤

1. 封装跨平台打印服务接口

在Blazor项目中定义统一的打印服务接口,用于桥接Blazor端与原生平台:

public interface IPrintService
{
    Task PrintHtmlAsync(string htmlContent);
}

2. 安卓平台实现打印服务

在项目的Platforms/Android目录下创建平台特定的实现类,利用安卓原生WebView和打印API:

[assembly: Dependency(typeof(AndroidPrintService))]
namespace YourAppNamespace.Platforms.Android
{
    public class AndroidPrintService : IPrintService
    {
        public async Task PrintHtmlAsync(string htmlContent)
        {
            var context = Android.App.Application.Context;
            var printManager = (PrintManager)context.GetSystemService(Context.PrintService);
            const string jobName = "文档打印任务";

            // 初始化WebView加载目标HTML
            var webView = new WebView(context);
            // 加载HTML内容,内联CSS确保样式完整
            webView.LoadDataWithBaseURL(null, htmlContent, "text/html", "UTF-8", null);

            // 等待WebView完全加载内容
            var loadCompletion = new TaskCompletionSource<bool>();
            webView.SetWebViewClient(new WebViewClient
            {
                public override void OnPageFinished(WebView view, string url)
                {
                    base.OnPageFinished(view, url);
                    loadCompletion.TrySetResult(true);
                }
            });
            await loadCompletion.Task;

            // 创建打印适配器并启动系统打印流程
            var printAdapter = webView.CreatePrintDocumentAdapter(jobName);
            var printSettings = new PrintAttributes.Builder().Build();
            printManager.Print(jobName, printAdapter, printSettings);
        }
    }
}

3. Blazor页面调用打印功能

在需要打印的组件中注入服务,通过JS获取模态框的HTML内容并触发打印:

@inject IPrintService PrintService
@inject IJSRuntime JSRuntime

<button @onclick="PrintModal">打印模态框内容</button>

<!-- 你的模态框内容 -->
<div id="printModal" class="modal">
    <h2>打印测试内容</h2>
    <p>这是模态框内需要打印的HTML内容</p>
    <ul>
        <li>支持列表样式</li>
        <li>支持内联CSS</li>
    </ul>
</div>

@code {
    private async Task PrintModal()
    {
        // 通过JS获取模态框的HTML字符串
        var html = await JSRuntime.InvokeAsync<string>("eval", "document.getElementById('printModal').innerHTML");
        // 拼接完整HTML结构(可选,添加全局样式)
        var fullHtml = $"<html><head><style>body {{ font-family: sans-serif; }}</style></head><body>{html}</body></html>";
        // 调用原生打印服务
        await PrintService.PrintHtmlAsync(fullHtml);
    }
}

4. 安卓权限配置

在Platforms/Android/AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.INTERNET" />

二、替代方案:直接生成PDF打印

如果需要更可控的PDF输出,可结合HTML转PDF库(如DinkToPdf、PdfSharp)先将HTML生成PDF文件,再调用安卓原生API打印:

  1. 在Blazor端将HTML转换为PDF字节流
  2. 将字节流保存为本地临时文件
  3. 调用安卓PrintManager打印该PDF文件

此方案需处理HTML到PDF的样式兼容问题,但适合需要离线保存PDF的场景。

三、关键注意事项

  • 确保打印的HTML内容包含内联CSS,避免依赖外部样式文件加载失败
  • 动态生成的模态框内容,需确认渲染完成后再调用打印
  • 安卓4.4(API 19)以下版本不支持WebView打印,需做版本判断

内容的提问来源于stack exchange,提问作者AMB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:45:32