美文网首页TECH_ANDROID智能家居Manba陪你学Android
Android蓝牙打印机,带你真正了解各种打印格式

Android蓝牙打印机,带你真正了解各种打印格式

作者: 胡萝卜小兔 | 来源:发表于2016-10-20 10:54 被阅读12574次

注意:本文原创,转载请注明出处。欢迎关注我的 简书

本文主要讲解蓝牙打印机在打印小票的过程中,如何打印各种常见格式。由于之前需要调试打印格式,但是苦于网上没有详细的讲解教程,无奈只能自给自足,自己封装了一个。如果各位盆友正在或者曾经苦恼蓝牙打印机的打印格式,那么恭喜你,本篇博文就是你要寻找的。

什么是蓝牙打印机

是的,你没看错。一开始兔子哥先来介绍一下什么是蓝牙打印机。。。好吧,这个就交给百度了:

蓝牙打印机(Bluetooth printer)就是将蓝牙技术应用在打印机上,摆脱打印机连线所带来的不便,实现无线打印,可以减少桌面上令人不快的电缆,并且可以将打印机远离主机任意搬动,摆放在房间中适合的位置。

常见小票样式

Paste_Image.png

这个小票格式基本就是最常见的了。这里面的各种格式,都可以从蓝牙打印机的API里面找到。蓝牙打印机有好多API,我把常用的给封装了一下:PrintUtils.java

/**
 * 复位打印机
 */
public static final byte[] RESET = {0x1b, 0x40};

/**
 * 左对齐
 */
public static final byte[] ALIGN_LEFT = {0x1b, 0x61, 0x00};

/**
 * 中间对齐
 */
public static final byte[] ALIGN_CENTER = {0x1b, 0x61, 0x01};

/**
 * 右对齐
 */
public static final byte[] ALIGN_RIGHT = {0x1b, 0x61, 0x02};

/**
 * 选择加粗模式
 */
public static final byte[] BOLD = {0x1b, 0x45, 0x01};

/**
 * 取消加粗模式
 */
public static final byte[] BOLD_CANCEL = {0x1b, 0x45, 0x00};

/**
 * 宽高加倍
 */
public static final byte[] DOUBLE_HEIGHT_WIDTH = {0x1d, 0x21, 0x11};

/**
 * 宽加倍
 */
public static final byte[] DOUBLE_WIDTH = {0x1d, 0x21, 0x10};

/**
 * 高加倍
 */
public static final byte[] DOUBLE_HEIGHT = {0x1d, 0x21, 0x01};

/**
 * 字体不放大
 */
public static final byte[] NORMAL = {0x1d, 0x21, 0x00};

/**
 * 设置默认行间距
 */
public static final byte[] LINE_SPACING_DEFAULT = {0x1b, 0x32};

打印实现

打印小票,当然首先需要连接蓝牙打印机。至于如何扫描打印机,如何连接,这个都是标准的蓝牙方式,网上资料也很多。因为本博文主要关注打印格式,所以这个就不再赘述了。连接打印机后,需要从BluetoothSocket中获取OutputStream。然后接下来都是通过OutputStream来给打印机发送打印指令。

  • 设置打印格式
    设置打印格式,就要用到上面封装的那些指令了。
    /**
     * 设置打印格式
     *
     * @param command 格式指令
     */
    public static void selectCommand(byte[] command) {
        try {
            outputStream.write(command);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

用法如下:

  PrintUtils.selectCommand(PrintUtils.RESET);
  PrintUtils.selectCommand(PrintUtils.LINE_SPACING_DEFAULT);
  PrintUtils.selectCommand(PrintUtils.ALIGN_CENTER);
  PrintUtils.selectCommand(PrintUtils.NORMAL);
  • 打印文字
    /**
     * 打印文字
     *
     * @param text 要打印的文字
     */
    public static void printText(String text) {
        try {
            byte[] data = text.getBytes("gbk");
            outputStream.write(data, 0, data.length);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

用法如下:

  PrintUtils.printText("好吃的牛肉面" + "\n");

打印文字的时候,最后都要手动拼接一个 "\n" 用来换行。

完美吗?

根据上面封装的代码,“貌似”是可以实现所有的打印样式了。是的,没毛病。因为上面既有打印格式的设置,又有打印文字的用法。打印小票是没问题了。but……

这种格式如何实现?


Paste_Image.png

这种格式呢?


Paste_Image.png

有的盆友可能会说,这有啥问题的??? 并且给出了他们认为完美的解释:

  PrintUtils.printText("合计                           53.50" + "\n");
  PrintUtils.printText("抹零                            3.50" + "\n");
  PrintUtils.printText("项目            数量            金额" + "\n");

可是,完美吗?
你可能觉得人工加空格是可以“实现”需求。but……中间的空格,你知道应该添加多少吗?添加多了或者少了,打印出来的结果都会一塌糊涂!并且注意小票上都是要求对齐的!合计、抹零左侧对齐。金额右侧对齐。项目、数量、金额这三列都要中心对齐。。看到这里,这个人工加空格的做法,还完美吗?

给我一个完美的解释!

“海参炒面,海参呢?给我一个完美的解释!”
“我叫海参,面是我炒的。完美不?”

是的,我们需要一个完美的解释。到底如何实现上面说的打印两列打印三列的情况。
首先,讲解之前,先设置几个默认值:

    /**
     * 打印纸一行最大的字节
     */
    private static final int LINE_BYTE_SIZE = 32;

    /**
     * 打印三列时,中间一列的中心线距离打印纸左侧的距离
     */
    private static final int LEFT_LENGTH = 16;

    /**
     * 打印三列时,中间一列的中心线距离打印纸右侧的距离
     */
    private static final int RIGHT_LENGTH = 16;

    /**
     * 打印三列时,第一列汉字最多显示几个文字
     */
    private static final int LEFT_TEXT_MAX_LENGTH = 5;

我们知道,通用的打印纸都是有固定宽度的。经过大量测试,得出打印纸一行的最大字节数是32个字节。那么根据上面的注释,我们可以得到以下结论:

LEFT_LENGTH + RIGHT_LENGTH = LINE_BYTE_SIZE

这是毋庸置疑的。左侧宽度 + 右侧宽度 必须要等于打印纸总宽度。
而且因为打印三列的时候,中间一列是要居中显示的,所以LEFT_LENGTHRIGHT_LENGTH都必须是总宽度32的一半,也就是必须是16.

那么如何计算某个文字所占的字节数呢?

    /**
     * 获取数据长度
     *
     * @param msg
     * @return
     */
    @SuppressLint("NewApi")
    private static int getBytesLength(String msg) {
        return msg.getBytes(Charset.forName("GB2312")).length;
    }

OK,准备了这么多,海参终于准备好了。接下来就可以准备炒面了~

打印两列

    /**
     * 打印两列
     *
     * @param leftText  左侧文字
     * @param rightText 右侧文字
     * @return
     */
    @SuppressLint("NewApi")
    public static String printTwoData(String leftText, String rightText) {
        StringBuilder sb = new StringBuilder();
        int leftTextLength = getBytesLength(leftText);
        int rightTextLength = getBytesLength(rightText);
        sb.append(leftText);

        // 计算两侧文字中间的空格
        int marginBetweenMiddleAndRight = LINE_BYTE_SIZE - leftTextLength - rightTextLength;

        for (int i = 0; i < marginBetweenMiddleAndRight; i++) {
            sb.append(" ");
        }
        sb.append(rightText);
        return sb.toString();
    }

那位说话了:“你这代码明明也是手动拼的空格啊,完美个毛啊!”。大兄弟你消消气,这里是通过逻辑进行拼接的空格,不是无脑的拼接。打印两列的步骤如下:

  • 拼接左侧一列的文字
  • 拼接两侧文字中间的空格
  • 拼接右侧一列的文字

关键步骤是计算两侧文字中间的空格。怎么计算呢?很简单,总宽度 - 左侧文字长度 - 右侧文字长度 就是空格的长度。

打印三列

    /**
     * 打印三列
     *
     * @param leftText   左侧文字
     * @param middleText 中间文字
     * @param rightText  右侧文字
     * @return
     */
    @SuppressLint("NewApi")
    public static String printThreeData(String leftText, String middleText, String rightText) {
        StringBuilder sb = new StringBuilder();
        // 左边最多显示 LEFT_TEXT_MAX_LENGTH 个汉字 + 两个点
        if (leftText.length() > LEFT_TEXT_MAX_LENGTH) {
            leftText = leftText.substring(0, LEFT_TEXT_MAX_LENGTH) + "..";
        }
        int leftTextLength = getBytesLength(leftText);
        int middleTextLength = getBytesLength(middleText);
        int rightTextLength = getBytesLength(rightText);

        sb.append(leftText);
        // 计算左侧文字和中间文字的空格长度
        int marginBetweenLeftAndMiddle = LEFT_LENGTH - leftTextLength - middleTextLength / 2;

        for (int i = 0; i < marginBetweenLeftAndMiddle; i++) {
            sb.append(" ");
        }
        sb.append(middleText);

        // 计算右侧文字和中间文字的空格长度
        int marginBetweenMiddleAndRight = RIGHT_LENGTH - middleTextLength / 2 - rightTextLength;

        for (int i = 0; i < marginBetweenMiddleAndRight; i++) {
            sb.append(" ");
        }

        // 打印的时候发现,最右边的文字总是偏右一个字符,所以需要删除一个空格
        sb.delete(sb.length() - 1, sb.length()).append(rightText);
        return sb.toString();
    }

打印三列的步骤如下:

  • 拼接左侧一列的文字
  • 拼接左侧文字和中间文字中间的空格
  • 拼接中间的文字
  • 拼接右侧文字和中间文字中间的空格
  • 拼接右侧一列的文字

在计算空格的时候,为了保证中间一列始终保持中心线对齐,所以在计算中间文字长度时候,都除以2。

完整打印代码

PrintUtils.selectCommand(PrintUtils.RESET);
PrintUtils.selectCommand(PrintUtils.LINE_SPACING_DEFAULT);
PrintUtils.selectCommand(PrintUtils.ALIGN_CENTER);
PrintUtils.printText("美食餐厅\n\n");
PrintUtils.selectCommand(PrintUtils.DOUBLE_HEIGHT_WIDTH);
PrintUtils.printText("桌号:1号桌\n\n");
PrintUtils.selectCommand(PrintUtils.NORMAL);
PrintUtils.selectCommand(PrintUtils.ALIGN_LEFT);
PrintUtils.printText(PrintUtils.printTwoData("订单编号", "201507161515\n"));
PrintUtils.printText(PrintUtils.printTwoData("点菜时间", "2016-02-16 10:46\n"));
PrintUtils.printText(PrintUtils.printTwoData("上菜时间", "2016-02-16 11:46\n"));
PrintUtils.printText(PrintUtils.printTwoData("人数:2人", "收银员:张三\n"));

PrintUtils.printText("--------------------------------\n");
PrintUtils.selectCommand(PrintUtils.BOLD);
PrintUtils.printText(PrintUtils.printThreeData("项目", "数量", "金额\n"));
PrintUtils.printText("--------------------------------\n");
PrintUtils.selectCommand(PrintUtils.BOLD_CANCEL);
PrintUtils.printText(PrintUtils.printThreeData("面", "1", "0.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("米饭", "1", "6.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("铁板烧", "1", "26.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("一个测试", "1", "226.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("牛肉面啊啊", "1", "2226.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("牛肉面啊啊啊牛肉面啊啊啊", "888", "98886.00\n"));

PrintUtils.printText("--------------------------------\n");
PrintUtils.printText(PrintUtils.printTwoData("合计", "53.50\n"));
PrintUtils.printText(PrintUtils.printTwoData("抹零", "3.50\n"));
PrintUtils.printText("--------------------------------\n");
PrintUtils.printText(PrintUtils.printTwoData("应收", "50.00\n"));
PrintUtils.printText("--------------------------------\n");

PrintUtils.selectCommand(PrintUtils.ALIGN_LEFT);
PrintUtils.printText("备注:不要辣、不要香菜");
PrintUtils.printText("\n\n\n\n\n");

举一反三

Paste_Image.png

学习了上面的打印格式,那么这个小票怎么打印? 区别就是打印三列的时候,中间一列是偏右了。相信大家应该知道答案了。如果有疑问,可以给我留言。

鉴于好多读者给我留言,要PrintUtils工具类代码,所以我把代码发布到github上了,大家可以自行下载。地址是:https://github.com/heroxuetao/PrintUtils

如果有帮助到你,可以顺手来个star 。万分感谢!

本文止。

相关文章

  • Android蓝牙打印机,带你真正了解各种打印格式

    注意:本文原创,转载请注明出处。欢迎关注我的 简书 。 本文主要讲解蓝牙打印机在打印小票的过程中,如何打印各种常...

  • Android开发(42) 使用andorid操作蓝牙打印机

    需求 使用android发起打印任务,通过蓝牙连接打印机。条件如下:打印机:南京富士通DPK760E,具有蓝牙功能...

  • 蓝牙开发《基础篇一》

    最近项目中使用到蓝牙打印机,通过蓝牙连接蓝牙打印机进行打印功能。在此对蓝牙知识进行归纳输出一波,达到巩固之效果。 ...

  • ReactNative相关

    android版蓝牙打印机使用方式 导入 gprintersdkv2.1.4.jar jar包 导入 Blueto...

  • 蓝牙开发《基础篇三》

    最近项目中使用到蓝牙打印机,通过蓝牙连接蓝牙打印机进行打印功能。在此对蓝牙知识进行归纳输出一波,达到巩固之效果。蓝...

  • 蓝牙开发《基础篇二》

    最近项目中使用到蓝牙打印机,通过蓝牙连接蓝牙打印机进行打印功能。在此对蓝牙知识进行归纳输出一波,达到巩固之效果。蓝...

  • Swift 蓝牙打印机数据排版

    蓝牙打印机打印排版本次使用的是 Swift 5构建,蓝牙连接打印机打印 [TOC] 功能包含: 两列排版 两列左右...

  • 打印机

    iOS开发之蓝牙/Socket链接小票打印机(一)iOS开发之蓝牙/Socket链接小票打印机(二) iOS so...

  • iOS开发 蓝牙打印小票

    要求:手机通过蓝牙连接蓝牙打印机,在手机上点击‘打印’,打印机就打印出小票(小票就跟送外卖的那种)。 设备:BT5...

  • app连接蓝牙打印机实现打印

    app连接蓝牙打印机实现打印并排版_鬼妖妖的博客-CSDN博客_app蓝牙打印

网友评论

  • 君莫笑啊君莫笑_:可以的 感谢
  • 伽蓝烟雨:打印机的打印指令都是通用的吗
  • 杨鑫丶:您好,请问没有实现打印位图的功能吗?
  • 201c81262309:我这边的打印机是跟收银机一体机的,不用蓝牙的。可以使用吗?
    胡萝卜小兔:@201c81262309 您好,方法应该都是相通的,您可以试试。
  • 4a5b59773fd6:这个怎么用 我怎么看不懂
  • b08ccdcec81f:楼主,你好.
    我这边打印三列出来对不齐,三列中的每一列都有一点歪,请问怎么破?
    b08ccdcec81f:@胡萝卜小兔 请问你能看看怎么改一下代码,怎么对齐吗?
    胡萝卜小兔:@b08ccdcec81f 应该还是间距计算的不对。。
  • 不如巧克力:你好,我想问下,如果我要打印四列,要怎么改?
    胡萝卜小兔:一样的。。模仿这个三列的写就可以,把列的间距算好就可以了
  • b453f61f2932:楼主 有没有可以打印PDF文件的
    胡萝卜小兔:@会痛的石头_0c60 我这暂时没有。。
  • 小明_d19e:请问,您的打印机api从哪里找的,我想买个蓝牙小票打印机,不知道什么型号的可以,问过商家了,说不给二次开发sdk,不知道您的api行不行
    胡萝卜小兔:@小明_d19e api是打印机的商家提供的。这个api应该是通用的,可以试一下
  • Toseven:博主你好,我调用之后,打印机没反应,请问大概是什么问题.
    胡萝卜小兔:@Toseven 连接打印机后,从BluetoothSocket中获取outputStream,设置到PrintUtils中。然后直接调用PrintUtils的打印方法。这样应该没问题。如果还是不行,看看是否打印机硬件有问题。或者这个打印机不是标准的蓝牙打印机,协议不一样。不过蓝牙打印机一般都是同一个协议。。你也可以从BluetoothSocket中获取InputStream,然后你看看你发送打印指令后,打印机有没有返回信息。
    Toseven:@胡萝卜小兔 连接了,我用debug显示蓝牙也连接上了,就是发送数据过去没反应,
    胡萝卜小兔:@Toseven 看看打印机连接了没有。
  • f1b3cfcc2f4d:楼主您好,可否发送一个封装好的apk,万分感谢。7033897@qq.com
    胡萝卜小兔:我没有类似的demo 是项目中用到的。项目apk无法注册,是内部人用的,抱歉。
  • 160a7ecaa2a0:四列怎么计算啊
    160a7ecaa2a0:@胡萝卜小兔 就是要计算咯
    胡萝卜小兔:@160a7ecaa2a0 先仔细看看三列的计算原理,应用到四列应该是一样的。
  • a33d344f497b:楼主看到指点一下,打印是乱的,程序运行后,多次打印每次都不同........
  • a33d344f497b:楼主问一下,这个打印怎么还会乱跳呢?打了三次,每一次都不一样
    胡萝卜小兔:@银商钱包客服 你好,发到这个邮箱就可以 heroxuetao@163.com
    a33d344f497b:@胡萝卜小兔 评论发不了图片,能加一个你的qq或者给个邮箱详细的给你说一下吗?苦恼了好多天。。
    胡萝卜小兔:@银商钱包客服 能详细说明一下打印的效果吗,或者截个图看一下
  • tmyzh:您好,想请教您知道怎么设置打印浓度和设置字符集吗(utf-8的数据我打印出来乱码)
    胡萝卜小兔:1.1 ESC t n 选择字符代码表
    【格式】 ASCII码 ESC t n
    十六进制码 1B 74 n
    十进制码 27 116 n
    功能:根据n取值选择字符代码表。
    说明:·n默认值为0,0 ≤ n ≤ 10, 16 ≤ n ≤ 19;
    ·不同n取值对应代码表如下:

    n

    0
    PC437[美国,欧洲标准]
    1
    片假名
    2
    PC850 [多语言,西欧语]
    3
    PC860 [葡萄牙语]
    4
    PC863 [加拿大-法语]
    5
    PC865 [北欧,德语--日耳曼语]
    6
    西欧(拉丁文I)
    7
    Greek
    8
    Hebrew
    9
    PC755:East Europe
    10
    Iran
    11
    PC775 [波罗的海语]
    12
    PC932 [日语]
    13
    PC949 [韩语]
    14
    PC950 [中文繁体]
    15
    PC936 [中文简体]
    16
    WPC1252
    17
    PC866:Cyrillice*2
    18
    PC852:Latin2
    19
    PC858 [西欧语]
    20
    PC858 [冰岛语]
    21
    PC858 [斯拉夫语/俄语]
    22
    PC858 [斯拉夫语/保加利亚语]

    1.2 FS & 选择汉字模式
    【格式】 ASCII码 FS &
    十六进制码 1C 26
    十进制码 28 38
    功能:选择汉字模式。
    说明:·当选中汉字模式时,打印机判断字符是否为汉字内码,如是汉字内码,先处理
    第一字节,然后判断第二字节是否为汉字内码;
    ·打印机上电后自动选择汉字模式
  • 漫唐:任何打印机都可以通用吗
    胡萝卜小兔:@漫唐 这个不是很清楚,只要是蓝牙打印机,一般都是通用。
  • Sona的杂货铺:第一次接触打印机 这个工具类该怎么调用啊
    胡萝卜小兔:@花未殃 你看一下博客最下面github的链接,里面有介绍如何使用。
  • GB_speak:outputStream.write(command);这里报空是什么原因呢 楼主
    胡萝卜小兔:outputStream你没设置吧?

  • fb8298800ea8:楼主能不能发给我一份上面的工具类呀?396628224@qq.com 谢谢啦
    胡萝卜小兔:@左边天使 你好,文章末尾有github链接。里面就有源码。
  • 在覸青春:我根据楼主 的代码 在结合http://www.sznewbest.com/down_data_list_229.html 这个项目 完美实现了打印菜单.
  • 在覸青春:楼主把工具类分享一下呗 452840622@qq.com
    胡萝卜小兔:鉴于好多读者给我留言,要PrintUtils工具类代码,所以我把代码发布到github上了,大家可以自行下载。地址是:https://github.com/heroxuetao/PrintUtils
    如果有帮助到你,可以顺手来个star 。万分感谢!
  • HopCoder:请问一下如何实现android链接打印机,实现打印word pdf 等格式的文档。 查看了下关于这方面的文档,基本没有。但是我看wps app 有打印功能。
    胡萝卜小兔:@Joker先生 客气了~
    HopCoder: @Joker先生 好的谢谢
    胡萝卜小兔:您好,我这边的API文档也没有打印word、pdf格式的指令。其实打印机打印只要一个API即可。wps app能实现,应该就是他们的打印机支持打印word、pdf,并且开发出来了相应的API。如果他们的app在任何打印机都能实现打印word pdf,那就厉害了。。看看能不能把API搞过来~
  • 七岁就狠拽:DOUBLE_HIGHT_WIDTH 这个指令是什么啊??
    胡萝卜小兔:@七岁就狠拽 1)您好,请问一下是哪个单词拼错了,我去改过来~ (2)如果你要折行显示,是不是想要商品名称换行,数量和单价还是在第一行。如果是这个需求的话,因为打印机是顺序执行的,只能把这一行的指令拆分成两个。而且需要你手动实验出来第一行的商品打印的最多字数。譬如第一行最多显示8个字符长度的商品名称。商品总共12个字符。那么第一个指令就是 8个商品名字 + 数量 + 单价,然后第二个指令就是发送后面4个字符长度的商品名称,这样可以实现。希望能帮到你。
    七岁就狠拽:@胡萝卜小兔 哦,因为直接复制过来的,你那里单词拼错了,编译没通过。楼主,我想问一下,如果商品的名字不限制长度,超出长度的折行显示,这该怎么整?
    胡萝卜小兔:注释写了,宽高加倍。即两倍宽两倍高。
  • kingboxing:请问楼主,怎么判断打印机是否有纸
    kingboxing:@胡萝卜小兔 好的,谢谢!
    胡萝卜小兔:这个需要根据具体的打印机API,看看有没有提供相应的指令。我这个打印机好像没有这个指令。
  • 8c5b425ffb3d:楼主,有没有办法检测到黑标然后再去打印,就是完成黑标模式打印的开发?
    胡萝卜小兔:黑标模式有具体的API,譬如:
    启用 黑标检测功能:
    【格式】 十六进制 1F 1B 1F 80 04 05 06 44
    功能:启用黑标检测功能。
    说明:·启用黑标检测功能打印机会检测热敏打印纸的黑标,如果使用的打印纸
    不带有黑标,将会发出蜂鸣器警报报错
  • 3dd11311c8ad:楼主可以把这个工具类发给我一下吗?万分感谢!我的邮箱是453096879@qq.com
    胡萝卜小兔:@夏忆梦寒_ebe6 已发
  • fcc513265f39:亲,求工具类,2230631881@qq.com
    :sparkling_heart:
    谢谢!
    胡萝卜小兔:@花小郎 已发
  • fc00ed9a3369:楼主,麻烦工具类发给我一份,谢谢!!!!1345580079@qq.com
    胡萝卜小兔:@昵称_b73a 已发
  • 4238e63edfb7: 楼主 也能发我一份吗? 657598922@qq.com 万分感谢!!!
    d0551ee71f6a:@胡萝卜小兔 也能发我一份吗? 1292177891@qq.com 万分感谢!!!
    d0551ee71f6a:楼主 也能发我一份吗? 1292177891@qq.com 万分感谢!!!
    胡萝卜小兔:@前目的地 已发
  • 一念花开开:楼主可以把这个工具类发给我吗?谢谢楼主!邮箱:847654033@qq.com
    e8910d9acfb6:求发工具类 630226543@qq.com
    4238e63edfb7:楼主 也能发我一份吗? 657598922@qq.com 万分感谢!!!
    胡萝卜小兔:已发。
  • alloysystem:很有用
  • 唠嗑008:请问一下,这个打印的字体怎么设置啊?
    e0a700f22be6:有没有微信小程序连接蓝牙打印机打印订单的demo呢,需要PHP的
    唠嗑008:@胡萝卜小兔 好的,谢谢
    胡萝卜小兔:@陪你唠嗑 方法有(1)设置几倍长几倍宽(2)设置是否加粗(3)选择字体,这个指令是:
    【格式】 ASCII码 ESC M n
    十六进制码 1B 4D n
    十进制码 27 77 n
    功能:根据n值选择字体,n值可取:0、1、48、49。
    说明:·n值对应字体如下表:

    n
    功能
    0,48
    选择标准ASCII码字体 (12 × 24)
    1,49
    选择标准ASCII码字体 (9 × 17)
    (4)选择字符模式,指令是
    【格式】 ASCII码 ESC t n
    十六进制码 1B 74 n
    十进制码 27 116 n
    功能:根据n取值选择字符代码表。
    说明:·n默认值为0,0 ≤ n ≤ 10, 16 ≤ n ≤ 19;
    ·不同n取值对应代码表如下:

    n

    0
    PC437[美国,欧洲标准]
    1
    片假名
    2
    PC850 [多语言,西欧语]
    3
    PC860 [葡萄牙语]
    4
    PC863 [加拿大-法语]
    5
    PC865 [北欧,德语--日耳曼语]
    6
    西欧(拉丁文I)
    7
    Greek
    8
    Hebrew
    9
    PC755:East Europe
    10
    Iran
    11
    PC775 [波罗的海语]
    12
    PC932 [日语]
    13
    PC949 [韩语]
    14
    PC950 [中文繁体]
    15
    PC936 [中文简体]
    16
    WPC1252
    17
    PC866:Cyrillice*2
    18
    PC852:Latin2
    19
    PC858 [西欧语]
    20
    PC858 [冰岛语]
    21
    PC858 [斯拉夫语/俄语]
    22
    PC858 [斯拉夫语/保加利亚语]
    (5)选择汉字模式,指令是:
    【格式】 ASCII码 FS &
    十六进制码 1C 26
    十进制码 28 38
    功能:选择汉字模式。
    说明:·当选中汉字模式时,打印机判断字符是否为汉字内码,如是汉字内码,先处理
    第一字节,然后判断第二字节是否为汉字内码;
    ·打印机上电后自动选择汉字模式
  • 30d510f59682:打印图片试过没有
    胡萝卜小兔:@cbbs 图片的我自己没试过。
  • 5c4d4568eb39:楼主,刚接触蓝牙这块,方便的话PrintUtils.java这个工具类能不能发我下或者源码发我学习下,谢谢楼主。我邮箱:1315345838@qq.com
    胡萝卜小兔:@小龙1315 额,这个我就不清楚了,我这个是用在普通的蓝牙打印机上的,是普通的那种小票。A4纸的话,可以参考下打印机的API,看看有没有合适的指令。。
    5c4d4568eb39:@胡萝卜小兔 恩恩。收到了。谢谢楼主,对了,楼主,那个打印的,把文字打印在A4纸上,打印到一半就卡在那里了,是不是需要设置打印类型之类的呀?
    胡萝卜小兔:PrintUtils.java发到你邮箱了。这些是在整个项目里面的,所以整个项目的源码不方便发给你,就把这个工具类发给你了。
  • c76988e0ddbf:你好 楼主:
    byte[] data = text.getBytes("gbk");
    gbk:是汉字的编码
    一维条码 和 二维条码该用什么啊?
    胡萝卜小兔:@爱永恒_20ce 这个我没做过。
    c76988e0ddbf:有实例吗
    胡萝卜小兔:一维码二维码有单独的指令。譬如
    【格式】 ASCII GS E C mode
    十六进制 1D 45 43 mode
    十进制 29 69 67 mode
    功能:根据mode值启用或禁止条码功能:
    mode=0, 禁止条码功能;
    mode=1, 启用条码功能。
  • 9c5e1c00aec2:楼主,怎么把格式化好的信息发送给打印机呢;
    9c5e1c00aec2:@胡萝卜小兔 谢谢楼主,有没有源码,printText()和selectCommand()里边的outputstream那里还是不太懂。
    胡萝卜小兔:上面的“完整打印代码”中每一行都是发送给打印机的指令。
    胡萝卜小兔:您好。首先您先用app通过蓝牙连接打印机,然后PrintUtils.printText("好吃的牛肉面" + "\n"); 这样就会发给打印机的。我都封装好了,具体您可以看一下方法内部实现。
  • cs_double:楼主,我想打印图片,有没有办法?
    胡萝卜小兔: @cs_double 我回头查一下指令
    cs_double:@胡萝卜小兔 我们现在需要打印pdf,查了好久了,都没搞定,帮帮忙。
    胡萝卜小兔: @cs_double 您好,好像有打印图片的指令。反正二维码我记得是有的,图片具体还真忘了,可以查一下。
  • 2ef6374f1760:同问 蓝牙打印机如何获取状态 比如 卡纸、打印完成、无纸等
    2ef6374f1760:@懒懒的吉他手 已放弃使用蓝牙打印了/无奈
    739bd9c1291b:同问,请问你解决了吗
  • c98b5756fd3c:威慑么我的打印机的流老是断开呢
  • 76fdbfe1f352:楼主问一下,蓝牙发送打印指令,怎么监听或是判断打印完成?
    胡萝卜小兔:@cly12345 这块我到时候没试过,我到时候试下看看
    76fdbfe1f352: @胡萝卜小兔 我目前就是这样,因为需求是需要连续打印很多账单,所以每次准备打印新的账单,我就同步发送状态指令,判断以后才打印。但是我发现状态返回值似乎和文档不一致,不知道楼主见到过这种情况没有。
    胡萝卜小兔: @cly12345 这个我也没有找到好的方法,咱只给打印机发指令,打印机好像不给咱回馈。像打印机是否有纸是有指令的。如果想人性化一点,打印之前检测是否有纸,有纸就发指令就行了。。。
  • 6207e5d1fbaa:楼主,看到你的封装方式,我立马把自己的代码给改了,学习了! 请教你怎么在58mm打印机上打印条码,二维码? 我按照指令,试了好多方法都不成功。
    胡萝卜小兔:@ReoJ 您好。打印条码、二维码,这个蓝牙打印机的API里面是有指令的。您可以按照我这个方式测试一下。这块我也没试过,我抽空也看一下。多多交流 :smile:
    6207e5d1fbaa:@ReoJ 也是蓝牙打印的
  • 水手_surge:楼主语言诙谐精练,讲的通俗易懂,学习了!

本文标题:Android蓝牙打印机,带你真正了解各种打印格式

本文链接:https://www.haomeiwen.com/subject/tdnxuttx.html