Android:如何通过WebView打印带字体样式和大小的EditText内容
解决WebView打印EditText字体样式不生效的问题
问题核心在于:EditText的字体类型、大小等样式是以Spannable格式存储的,直接调用editText2.getText().toString()只会提取纯文本,丢失所有样式信息。哪怕改成text/html类型,没有对应的HTML标签,WebView也无法识别样式。
解决方案步骤:
- 将EditText的Spannable内容转换为带样式的HTML字符串
- 让WebView加载完整的HTML内容(包含样式标签)
修改后的代码示例:
void printFile(){ WebView myWebView = new WebView(getApplicationContext()); // 1. 将EditText的Spannable内容转为HTML SpannableStringBuilder spannableText = (SpannableStringBuilder) editText2.getText(); // 根据API版本选择转换模式,API 24+用FROM_HTML_MODE_COMPACT,旧版本用默认转换逻辑 String htmlContent; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { htmlContent = Html.toHtml(spannableText, Html.FROM_HTML_MODE_COMPACT); } else { htmlContent = Html.toHtml(spannableText); } // 2. 封装完整HTML结构(可选:如果有自定义字体,可添加<style>标签引入) String fullHtml = "<html><body>" + htmlContent + "</body></html>"; // 加载HTML内容,指定MIME类型为text/html myWebView.loadData(fullHtml, "text/html", "UTF-8"); myWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } }); PrintManager printManager = (PrintManager) primaryBaseActivity.getSystemService(Context.PRINT_SERVICE); PrintDocumentAdapter printAdapter = myWebView.createPrintDocumentAdapter(); String jobName = getString(R.string.app_name) + " Print"; printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build()); }
额外说明:
- 如果EditText使用了自定义字体,需要在HTML中通过
@font-face引入字体文件(将字体文件放在assets目录):String fullHtml = "<html><head>" + "<style>" + "@font-face {font-family: 'MyCustomFont'; src: url('file:///android_asset/myfont.ttf');}" + "body {font-family: 'MyCustomFont';}" + "</style>" + "</head><body>" + htmlContent + "</body></html>"; Html.toHtml()会自动将EditText中的样式(如字体大小、颜色、粗体等)转换为对应的HTML标签(<font>、<b>等),WebView加载后就能正确识别并打印这些样式。
内容的提问来源于stack exchange,提问作者Fisher
相关产品推荐
相关产品推荐

