使用Android系统打印功能

百富POS机A920安卓系统打印功能的实现 由于打印demo中只有一些参数设置和基础打印,也无法实现排版功能,后采用com.pax.gl.imgprocessing中的接口 IImgProcessing.IPage 生成bitmap实现打印,可支持打印排版,打印图片等。 1、重要的引入jar包,一开始只引入了第一个,然后是痛苦的bug排查。。。 2、根据API,添加打印功能,自己封装了一个打印工具类 pac 阅读详情
一、打印图片

使用PrintHelper类,如:

private void doPhotoPrint() {
    PrintHelper photoPrinter = new PrintHelper(getActivity());
    photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
            R.drawable.droids);
    photoPrinter.printBitmap("droids.jpg - test print", bitmap);
}
可以在应用的菜单栏中调用该方法,当printBitmap()方法调用时,Android系统的打印界面

会弹出,用户可以设置一些参数,然后进行打印或取消。


二、打印自定义文档

1.连接到PrintManager类:

private void doPrint() {
    // Get a PrintManager instance
    PrintManager printManager = (PrintManager) getActivity()
            .getSystemService(Context.PRINT_SERVICE);

    // Set job name, which will be displayed in the print queue
    String jobName = getActivity().getString(R.string.app_name) + " Document";

    // Start a print job, passing in a PrintDocumentAdapter implementation
    // to handle the generation of a print document
    printManager.print(jobName, new MyPrintDocumentAdapter(getActivity()),
            null); //
}

注:print函数第二个参数为继承了抽象类PrintDocumentAdapter 的适配器类,第三个参数为 PrintAttributes对象,

可以用来设置一些打印时的属性。


2.创建打印适配器类

打印适配器与Android系统的打印框架进行交互,处理打印的生命周期方法。打印过程主要有以下生命周期方法:

onStart():当打印过程开始的时候调用;
onLayout():当用户更改打印设置导致打印结果改变时调用,如更改纸张尺寸,纸张方向等;
onWrite():当将要打印的结果写入到文件中时调用,该方法在每次onLayout()调用后会调用一次或多次;
onFinish():当打印过程结束时调用。

注:关键方法有onLayout()和onWrite(),这些方法默认都是在主线程中调用,因此如果打印过程比较耗时,应该在后台线程中进行。

3.覆盖onLayout()方法
在onLayout()方法中,你的适配器需要告诉系统框架文本类型,总页数等信息,如:

@Override
public void onLayout(PrintAttributes oldAttributes,
                     PrintAttributes newAttributes,
                     CancellationSignal cancellationSignal,
                     LayoutResultCallback callback,
                     Bundle metadata) {
    // Create a new PdfDocument with the requested page attributes
    mPdfDocument = new PrintedPdfDocument(getActivity(), newAttributes);

    // Respond to cancellation request
    if (cancellationSignal.isCancelled() ) {
        callback.onLayoutCancelled();
        return;
    }

    // Compute the expected number of printed pages
    int pages = computePageCount(newAttributes);

    if (pages > 0) {
        // Return print information to print framework
        PrintDocumentInfo info = new PrintDocumentInfo
                .Builder("print_output.pdf")
                .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
                .setPageCount(pages);
                .build();
        // Content layout reflow is complete
        callback.onLayoutFinished(info, true);
    } else {
        // Otherwise report an error to the print framework
        callback.onLayoutFailed("Page count calculation failed.");
    }
}

注:onLayout()方法的执行有完成,取消,和失败三种结果,你必须通过调用 PrintDocumentAdapter.LayoutResultCallback类

的适当回调方法表明执行结果, onLayoutFinished()方法的布尔型参数指示布局内容是否已经改变。

onLayout()方法的主要任务就是计算在新的设置下,需要打印的页数,如通过打印的方向决定页数:
private int computePageCount(PrintAttributes printAttributes) {
    int itemsPerPage = 4; // default item count for portrait mode

    MediaSize pageSize = printAttributes.getMediaSize();
    if (!pageSize.isPortrait()) {
        // Six items per page in landscape orientation
        itemsPerPage = 6;
    }

    // Determine number of print items
    int printItemCount = getPrintItemCount();

    return (int) Math.ceil(printItemCount / itemsPerPage);
}


4.覆盖onWrite()方法

当需要将打印结果输出到文件中时,系统会调用onWrite()方法,该方法的参数指明要打印的页以及结果写入的文件,

你的方法实现需要将页面的内容写入到一个多页面的PDF文档中,当这个过程完成时,需要调用onWriteFinished() 方法,如:

@Override
public void onWrite(final PageRange[] pageRanges,
                    final ParcelFileDescriptor destination,
                    final CancellationSignal cancellationSignal,
                    final WriteResultCallback callback) {
    // Iterate over each page of the document,
    // check if it's in the output range.
    for (int i = 0; i < totalPages; i++) {
        // Check to see if this page is in the output range.
        if (containsPage(pageRanges, i)) {
            // If so, add it to writtenPagesArray. writtenPagesArray.size()
            // is used to compute the next output page index.
            writtenPagesArray.append(writtenPagesArray.size(), i);
            PdfDocument.Page page = mPdfDocument.startPage(i);

            // check for cancellation
            if (cancellationSignal.isCancelled()) {
                callback.onWriteCancelled();
                mPdfDocument.close();
                mPdfDocument = null;
                return;
            }

            // Draw page content for printing
            drawPage(page);

            // Rendering is complete, so page can be finalized.
            mPdfDocument.finishPage(page);
        }
    }

    // Write PDF document to file
    try {
        mPdfDocument.writeTo(new FileOutputStream(
                destination.getFileDescriptor()));
    } catch (IOException e) {
        callback.onWriteFailed(e.toString());
        return;
    } finally {
        mPdfDocument.close();
        mPdfDocument = null;
    }
    PageRange[] writtenPages = computeWrittenPages();
    // Signal the print framework the document is complete
    callback.onWriteFinished(writtenPages);

    ...
}

drawPage()方法实现:

private void drawPage(PdfDocument.Page page) {
    Canvas canvas = page.getCanvas();

    // units are in points (1/72 of an inch)
    int titleBaseLine = 72;
    int leftMargin = 54;

    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTextSize(36);
    canvas.drawText("Test Title", leftMargin, titleBaseLine, paint);

    paint.setTextSize(11);
    canvas.drawText("Test paragraph", leftMargin, titleBaseLine + 25, paint);

    paint.setColor(Color.BLUE);
    canvas.drawRect(100, 100, 172, 172, paint);
}





android 调用系统打印 android系统打印 阅读详情

相关推荐

Unity在安卓系统打印功能的实现

本文介绍了Unity安卓调用打印机打印的三种方式。感兴趣的可以学习一下。 如何在在AS导出Unity可用的aar库文件? 三种打印实现方案 。 放在你Unity项目中的Plugins文件夹下即可调用。在安卓8.0及以上版本中,都提供了系统打印服务,可以轻松解决打印问题。调用系统打印服务的代码。

dickredone的博客 1707

android无线打印设置纸张和朝向

安卓代码设置打印机默认项

zhanggn_的博客 1161

关于安卓19的板子通过usb连接打印机打印问题 (非小票打印机器)

很多打印机有提供windows,linux的打印驱动,但是安卓的驱动几乎没有厂家提供,这就导致很多想通过安卓平板控制打印机连接打印的用户无法实现,而市面上面大多数打印软件也是通过蓝牙或者网络来进行连接打印,而不是我们想要的usb线进行打印 在安卓的原生板子里面,提供了打印支持,且大部分打印机厂家也针对原生打印驱动做了兼容,比如惠普啥的(可以直接连接usb先选择文件进行打印测试) ,惠普提供有打印...

nibinusm22b的博客 1543

Android 打印组件,Android打印自定义文档

对于有些应用,比如绘图应用,页面布局应用和其它一些关注于图像输出的应用,创造出精美的打印页面将是它的核心功能。在这种情况下,仅仅打印一幅图片或一个HTML文档就不够了。这类应用的打印输出需要精确地控制每一个会在页面中显示的对象,包括字体,文本流,分页符,页眉,页脚和一些图像元素等等。想要创建一个完全自定义的打印文档,需要投入比之前讨论的方法更多的编程精力。我们必须构建可以和打印框架相互通信的组件,...

weixin_29446529的博客 2055

HP安卓打印例子

HP 安卓打印例子,经测试,可以使用和打印,可以打印图片和pdf文档,是hp官方例子。

【亲测可用!】阿里达摩院开源实时数字人对话VideoChat本地部署教程(8G显存可跑)

本文主要记录在部署阿里达摩院开源实时数字人对话VideoChat时遇到的问题,希望对各位技术开发或爱好者有所帮助!

波点兔的博客 3897

Android使用局域网打印机生成打印任务

Android使用局域网打印机生成打印任务 生成打印任务时,需要的关键类为PrintManger和PrintJob 1、 PrintManager printManager = (PrintManager) ctx.getSystemService(Context.PRINT_SERVICE); 生成printManger对象 2、生成打印的适配器 其中filename为需要打印文件的路径 p...

q2497900398的专栏 1772

苹果开发者账号注册指南:解决Apple Developer app证件验证失败问题

本文详细解析了苹果开发者账号注册中证件验证失败的常见原因与解决方案。核心在于确保Apple ID、设备与iCloud信息一致,并提供了从官方支持联系到材料准备的全流程操作指南,帮助开发者高效解决“未能验证证件”问题,顺利完成注册。

weixin_29232507的博客 2251

android系统打印功能实现,Android实现系统打印功能

本文实例为大家分享了Android实现系统打印的具体代码,供大家参考,具体内容如下一、打印图片使用PrintHelper类,如:private void doPhotoPrint() {PrintHelper photoPrinter = new PrintHelper(getActivity());photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_...

weixin_42174176的博客 4591

Windows 10/11 安装 HYSPLIT 气象模型全攻略(附必备工具包下载清单)

本文提供了一份详尽的Windows 10/11系统下HYSPLIT气象模型安装与配置全攻略。指南涵盖了从核心认知、必备工具包(Tcl/Tk、ImageMagick)下载,到分步安装、环境变量设置及首次运行验证的完整流程,旨在帮助研究者和学生高效部署这一用于大气轨迹模拟与污染物扩散分析的专业工具。

weixin_28335283的博客 611

MCP4728 电路及stm32F103程序移植

写在前面 通过优快云查到一些MCP4728 的程序,结合程序及datasheet对于驱动的描述,理清了思路 感谢开路者! MCP4728的电路比较简单,见下文描述 应用电路 datasheet: 实际测试电路: SCL接stm32的PB10,SDA接PB11 RDY/BSY引脚和LDCA引脚,悬空 解释见截图: MCP4728地址 选择任意输出通道写入DAC输入寄存器 应用程序 int mcp4728_write_all_channel(float vol1, float vol2, fl

u013074298的专栏 5428

Android通过系统打印功能实现PDF预览打印

一、     简介         Android4.4(KitKat,api-19)系统内置了打印框架,通过安装对应打印机的打印插件,就可以容易实现打印功能;         关于 图片、webview、layout及截屏相关的打印方式,已有很多相关教程;该篇使用介绍使用简单方式,实现对现成pdf文档进行打印。   二、     实现 1.   安装打印插件 1)  在应用市场,搜索

tangxl2008008的专栏 2万+

Matlab图像处理频域滤波实现——高斯低通、高通、带通带阻滤波器

如果你想要进一步了解更多的相关知识,

小嘤熊的博客 1万+

Unity3d 集成 Android 系统打印功能

研究了一段时间Android 系统打印功能,看到早在Android 4.0 也就是API Level>=19版本中就不需要再额外的安装打印驱动了,通过各种网站发现都是用同一种方法包括Android 开发官网也是使用PrintHelper 直接调用,当调用PrintHelper.printBitmap方法后,会出现用户选择界面(此处界面均为系统打印界面跟自己创建的无关),当然集成的只是打印功能的库,并无其它内容。 经过查看PrintHelper类库,看到有个两个方法可以调用,一个是直接获取文件地址打.

十一岁专栏 923

验证码破解2.0:Python+CV大模型搞定滑块/点选验证

核心创新:基于YOLOv8+SAM CV大模型的端到端验证码破解方案,无需人工设计特征,适配多种验证码类型;核心价值高成功率:滑块验证≥95%,点选验证≥90%,远超传统CV方案;低延迟:单验证码破解≤2秒,满足高并发采集需求;行为模拟:生成符合人类操作的轨迹,绕过行为检测;易扩展:统一架构支持新增验证码类型,仅需少量标注数据微调;技术要点采用YOLOv8实现快速目标检测,SAM实现像素级分割;生成物理规律的人类轨迹,模拟真实操作行为;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1261

WPS文档中心和文档中台 operate 未授权访问漏洞(CVE-2025-0717)

WPS文档中心和文档中台的/open/v6/api/etcd/operate?key=/config/storage&method=get接口存在未授权访问漏洞,攻击者可通过该漏洞获取AK/SK密钥等信息,这些密钥通常用于系统内部认证和权限控制,泄露后可能导致攻击者进一步修改K8s配置、部署恶意容器或执行远程命令,最终实现对系统的完全控制。

李同學AI安全 905

初探Android系统打印功能

在Android平台上对激光打印机和喷墨式打印机进行了连接共享和打印效果测试。并对比Windows平台上的打印测试,分析其中的打印协议,现记录总结如下。

有何不可的博客 1万+

100:vue+cesium: 加载glb文件,随机位置加载2000架飞机

本示例在 Vue + cesium 项目中随机位置加载2000架飞机,飞机是glb文件,每个大小为571kb。这个示例属于性能优化的范畴内,通常如果用entity加载glb只能显示几个飞机,这里采用primitive的方法来加载。直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果.

大剑师兰特的GIS世界 706

佳能打印服务 android,canon print安卓版

Canon PRINT,一般又称canon print inkjet。Canon PRINT Inkjet/SELPHY是一款免费应用程序,让安卓智能手机或平板用户享用PIXMA, MAXIFY和SELPHY的打印、扫描功能。 *1/2*1 :仅适用于ARM处理器。*2 :功能和服务可能不适用于所有型号的打印机,或所有国家,地区,与环境。[主要特性]— 照片打印 *3支持照片美化功能一次轻松打印多...

weixin_39929721的博客 1571

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

HTML打包APK:实现安卓打印功能完整教程

摘要 HTML一键打包APK工具支持在APP中调用window.print()实现打印功能,自动转接安卓系统打印服务。通过创建包含打印按钮和@media print样式的HTML页面,点击按钮可触发打印预览,支持直接打印或保存为PDF。打包时无需额外配置,安装后即可使用该功能。常见问题包括系统版本要求、打印机连接及打印内容调整等。

H5开发技术 282

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android+4.4+打印功能,安卓android4.4新增打印支付功能

安卓4.4的到来慢慢逼近,安卓4.4功能也相继曝光;最近有消息传出,安卓4.4将新增打印支付功能,这将是一个让人值得期待的功能;我们一起来了解一下吧!Android 4.4拨号界面的曝光后,相机界面再次偷跑曝光。从更多数据来看这次是Android 4.4 KitKat的系统截图。我们可以通过这组截图再次看到更多新的细节。对比目前Android系统可以发现,新版Android4.4系统的设置菜单中增...

weixin_39785858的博客 164

Android调用系统默认打印机并反射获取打印任务状态

Android4.4通过PrintManger调用系统默认打印服务的默认打印机进行打印任务,并通过反射调用PrintManager的getPrintJob方法获取打印任务状态。

yan1348的博客 5033

Android系统下 USB打印机设备节点

Android系统下 USB打印机设备节点实现指南 在现代的Android应用中,USB打印机的集成可以极大地提高用户体验。实现USB打印机设备节点的过程可能会让初学者感到复杂,但通过将其分解为几个步骤,我们可以让这个过程变得简单易懂。本文将指导你如何在Android系统下实现USB打印机设备节点。 流程概述 步骤表格 以...

weixin_32475629的博客 509

Andorid 文件打印功能

因为我们这个是 pdf 文件,首先需要将 pdf转化为 Bitmap 位图,然后向调用打印机传递位图即可。Android 调用打印机。

成长的烧年 517

android中使用PrinterShare实现蓝牙打印功能

目前网上教程与Demo介绍的都是蓝牙连接热敏打印机(pos机大小的打印机),如果想通过蓝牙连接日常所见到的打印机,进行打印,这些教程或Demo是做不到的。 目前Android的蓝牙并不支持BPP(Basic Printing Profile),所以在Android实现蓝牙打印,通过正常的手段是实现不了的。网上能够搜索的那些教程或demo我都试过了,Google Play上与打印相关的app,

ysh06201418的专栏 1万+

如何作成安卓打印插件服务

具体的检索打印机和打印数据的作成和发送功能需要自己的APP内部单独实现。系统只是提供打印的框架,即在何时触发何种API,这些API功能的具体的实现需要自己代码实现。下面主要介绍一个在该服务的基础上一些细节功能如何实现,比如打印机的检索,打印机的添加,更多设置,打印机检索后的状态。具体需要重写的API参考官网,系统会根据你的设置自己创建Service不需要在代码中额外创建实例。实现的效果:在手机系统相册或者文件管理器选择文件->打印的时候,会触发该接口。

qq_44356236的博客 416
上一篇: JavaScript基础
下一篇: 高效展示图片,防止OOM
ssjj_programmer
博客等级 码龄11年 2粉丝 34原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值