使用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官方例子。

避坑指南:Qgis等时圈分析中ORS插件Key申请与参数设置的常见错误

本文详细解析了QGIS等时圈分析中ORS插件从API密钥申请到参数优化的全流程避坑指南。针对密钥激活、出行模式选择、时空参数设置等七个高频故障点,提供了实用的调试方案和优化技巧,帮助用户高效完成空间可达性分析。

weixin_42546508的博客 303

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

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

q2497900398的专栏 1772

源码编译部署篇(二)源码编译milvus成功后如何启动standalone并调试成功!

由于Milvus官方文档只提及如何使用docker安装部署Milvus,关于源码安装方式篇幅较少,因此,我整理撰写了如何通过源码编译方式成功安装Milvus,详见此篇。之所以选择这种复杂的安装方式,可以调试源码进而熟悉Milvus如何搭建整个框架支持AI上层应用功能。根据上篇步骤部署虽然可以成功,然而,我却不能成功启动Milvus服务,这个问题困扰了一两天,现在终于得以解决并能成功调试Milvus源码。接下来,分为三个部分介绍如何启动和成功调试。

qq_43893755的博客 3369

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

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

weixin_42174176的博客 4591

Python广度优先搜索BFS - 蓝桥13届省赛污染海域

请问这片N * M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N * M以外的海域都为已被污染的海域)有一片海域划分为N * M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)这块4 * 5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。输出一个整数,表示N * M的海域中有几块是没被污染的独立海域。

m0_69865359的博客 266

幻尔串口总线舵机控制Python SDK

幻尔串口总线舵机控制Python SDK,可以直接在PC端,不需要借助单片机对舵机进行控制。

daishabby2486的博客 4097

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

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

tangxl2008008的专栏 2万+

别再只盯着MES了!半导体/面板厂CIM系统全家桶(EAP/YMS/SPC)保姆级入门指南

本文深入解析半导体制造中的CIM系统,涵盖EAP、YMS和SPC等关键子系统的协同工作。通过实战案例和技术细节,展示如何利用CIM系统提升生产效率、良率管理和设备维护,为半导体/面板厂提供全面的实施指南和优化策略。

weixin_33693070的博客 464

Unity3d 集成 Android 系统打印功能

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

十一岁专栏 923

【100分】最长子字符串的长度

题目要求在一个环形字符串中找出字符 ‘o’ 出现了偶数次的最长子字符串长度。这里的字符串是一个环形的,即首尾相连。代码统计了字符串中字符 ‘o’ 的出现次数,并根据其奇偶性返回相应的最长子字符串长度。当 ‘o’ 的数量为偶数时,直接返回字符串长度;当 ‘o’ 的数量为奇数时,返回长度减去 1。给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。【最长子字符串的长度】

weixin_54707168的博客 897

MATLAB离线附加功能包下载与安装教程

本文介绍如何下载与安装MATLAB离线附加功能包,便于大家更加高效的使用MATLAB。

加斯顿工程师的博客 1万+

初探Android系统打印功能

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

有何不可的博客 1万+

沁恒CH32V30X学习笔记02--GPIO的使用教程及2次封装驱动

刚复位后,GPIO 口运行在初始状态,这时大多数 IO 口都是运行在状态所有的 GPIO 口都可以被配置外部中断输入通道,但一个外部中断输入通道最多只能映射到一个GPIO 引脚上,且外部中断通道的序号必须和 GPIO 端口的位号一致,,两方都是一对一的关系。复用功能。

Car12 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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

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

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

H5开发技术 282

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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、付费专栏及课程。

余额充值