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打印:
- 在Blazor端将HTML转换为PDF字节流
- 将字节流保存为本地临时文件
- 调用安卓
PrintManager打印该PDF文件
此方案需处理HTML到PDF的样式兼容问题,但适合需要离线保存PDF的场景。
三、关键注意事项
- 确保打印的HTML内容包含内联CSS,避免依赖外部样式文件加载失败
- 动态生成的模态框内容,需确认渲染完成后再调用打印
- 安卓4.4(API 19)以下版本不支持WebView打印,需做版本判断
内容的提问来源于stack exchange,提问作者AMB
相关产品推荐
相关产品推荐

