在 Android 4.4(API 级别 19)及更高版本中,框架提供直接从 Android 应用打印图片和文档的服务。本文章介绍如何在应用中启用打印功能,包括打印图片、HTML 页面以及创建要打印的自定义文档。
一、打印照片
Android 支持库PrintHelper类提供 一种简单的图片打印方法,用于简化图片打印操作。
1、缩放模式
- 通过setScaleMode() 方法,可设置打印时的图片缩放模式:
- SCALE_MODE_FIT: 调整图片大小,以便在页面的可打印区域内完整显示图片。
- SCALE_MODE_FILL:缩放图片,使其填充整个页面的可打印区域,但可能会裁剪图片的上下或左右边缘的某些部分。此模式为默认选项。
- 两个缩放选项都能保持图片的现有宽高比不变。
2、使用方法
- 调用 printBitmap() 方法后,系统会显示打印界面,用户可以选择打印机和打印选项。
packagecom.android.androidfunctiondemo.printerimportandroid.content.Contextimportandroid.graphics.BitmapFactoryimportandroid.os.Bundleimportandroidx.appcompat.app.AppCompatActivityimportandroidx.print.PrintHelperimportcom.android.androidfunctiondemo.Rimportcom.android.androidfunctiondemo.databinding.ActivityPrinterBindingclassPrintPhotoActivity:AppCompatActivity(){privatelateinitvarviewBinding:ActivityPrinterBindingoverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)viewBinding=ActivityPrinterBinding.inflate(layoutInflater)setContentView(viewBinding.root)viewBinding.print.setOnClickListener{doPhotoPrint(this)}}/** * 打印图片 */privatefundoPhotoPrint(context:Context){try{valprintHelper=PrintHelper(context)printHelper.scaleMode=PrintHelper.SCALE_MODE_FITvalbitmap=BitmapFactory.decodeResource(resources,R.mipmap.weather_sun)bitmap?.let{printHelper.printBitmap("photo-print",bitmap)}}catch(e:Exception){e.printStackTrace()}}}- 实现效果
二、打印 HTML 文档
使用 WebView 类可打印 HTML 文档,支持直接加载 HTML 页面, 或者以字符串形式构建自定义 HTML 文档。
1、注意事项
- 使用 WebView 创建打印文档时, 存在以下限制:
- 不能向文档中添加页眉或页脚,包括页码。
- HTML 文档的打印选项不支持打印页码选择,只能全部打印。
- WebView 的实例一次只能处理一个打印作业。
- 不能在 HTML 文档中使用 JavaScript 触发打印作业。
2、实现步骤
- 创建 WebViewClient 类,用于监听 HTML 资源加载完成情况,若 HTML 资源已加载完成,则创建打印作业。
- 将 HTML 资源加载到 WebView 对象中。
3、使用方法
- 确保在 onPageFinished() 方法中调用打印任务。若没有等待页面显示 加载完成,则打印输出可能不完整或空白,或者可能完全失败。
- 存储 WebView 对象,使其不会在打印作业之前进行垃圾回收,否则打印流程 可能会失败。
packagecom.android.androidfunctiondemo.printerimportandroid.content.Contextimportandroid.os.Bundleimportandroid.print.PrintAttributesimportandroid.print.PrintManagerimportandroid.util.Logimportandroid.webkit.WebResourceRequestimportandroid.webkit.WebViewimportandroid.webkit.WebViewClientimportandroidx.appcompat.app.AppCompatActivityimportcom.android.androidfunctiondemo.databinding.ActivityPrinterBindingclassPrintHtmlActivity:AppCompatActivity(){privatevaltag="PrintHtmlActivity"privatelateinitvarviewBinding:ActivityPrinterBindingprivatevarglobalWebView:WebView?=nulloverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)viewBinding=ActivityPrinterBinding.inflate(layoutInflater)setContentView(viewBinding.root)viewBinding.print.setOnClickListener{doWebViewPrint(this)}}/** * 打印 HTML 文档 */privatefundoWebViewPrint(context:Context){valwebView