精华内容
下载资源
问答
  • 佳博热敏打印机PC版SDK以及Demo;佳博热敏打印机PC版SDK以及Demo;
  • 包含佳博热敏票据打印机、标签打印机编程手册,API文档,sdk和使用说明,demo工程,TscCommand、EscCommand的android使用说明
  • 佳博全系列打印机驱动!从原版驱动光盘里面导入的,请放心使用! Windows Drivers for Gprinter (Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows Server 2003, Windows Server 2008, Windows Server ...
  • 挺好用的这个文档 解决你关于佳博打印机的问题挺好用的挺好用的
  • Mac 佳博热敏打印机pdd文件
  • 佳博热敏打印机中文编程手册包含打印命令、打印位置命名、查询与请求命令、行间距指令、字符设定命令、位图命令、条码命令、汉字字符控制命令、黑标命令、切刀命令、蜂鸣器命令、网口打印机状态检测命令、二维码命令...
  • 佳博打印机驱动,支持佳博多款打印机
  • 佳博 热敏打印机 ESCPOS 指令研究

    万次阅读 2018-06-20 17:35:28
    热敏打印机参数: 首先佳博GP-L80180I票据打印机技术参数 打印方式 直接热敏式 打印密度 576点/行或512点/行 打印速度 180毫米/秒 接口类型 串口+USB+网口 ...

    Test.txt内容:
    参考打印到文档功能:
    初识打印机驱动
    http://www.cnblogs.com/MrDing/p/4078189.html
    热敏打印头打印原理和C实现黑白位图的放大
    https://www.jianshu.com/p/c754bfa377e4

    ascii码 :

    十六进制十进制字符含义
    0a10\nLF
    0d13\rCR
    1b27esc
    1d29gs

    热敏打印机参数:

    首先佳博GP-L80180I票据打印机技术参数

    打印方式直接热敏式
    打印密度576点/行或512点/行
    打印速度180毫米/秒
    接口类型串口+USB+网口
    打印纸宽79.5±0.5毫米
    纸张厚度0.06~0.08毫米
    纸卷外径83毫米
    可靠性100公里
    使用字库简体中文GB18030大字库
    条形码类型UPC-A/UPC-E/JAN13(EAN13)/JAN8(EAN8)/CODE39/ITF/CODABAR/CODE93/CODE128
    字符大小ANK字符:FontA:12×24点 FontB:9×17点 简体/繁体:24×24点
    打印命令兼容ESC/POS命令

    log与流程的对应关系:

    对应的代码如下:

    // 打印头宽度约为 80mm 的打印函数
    
    BOOL USB_GPL801_PrintInStandardMode80(void)
    {
    
    
        int ret ;
    
        ret = VC_POS_Reset();
        printf("VC_POS_Reset ret = %d\r\n",ret);
    
        VC_POS_FeedLine();
        VC_POS_FeedLine();
    
        //VC_POS_PreDownloadBmpToRAM("a.BMP",3);
        ret = VC_POS_PreDownloadBmpToRAM("Kitty.bmp",3);
        printf("VC_POS_PreDownloadBmpToRAM ret = %d\r\n",ret);
    
    
    
        int nRet = VC_POS_SetMotionUnit(180, 180);
    
        if(POS_SUCCESS != nRet)
        {
            return false;
        }
    
        VC_POS_SetMode(POS_PRINT_MODE_STANDARD);
    
    
        VC_POS_FeedLine();
        VC_POS_FeedLine();
    
    
        VC_POS_FeedLine();
        VC_POS_S_TextOut("通行卡ID:", 70, 1, 1, POS_FONT_TYPE_CHINESE,
            POS_FONT_STYLE_NORMAL);
    
    
        VC_POS_S_TextOut("3303000012345678", 190, 1, 1, POS_FONT_TYPE_CHINESE,
            POS_FONT_STYLE_NORMAL);     
    
            VC_POS_FeedLine();
    
        VC_POS_S_TextOut("入口时间:", 70, 1, 1, POS_FONT_TYPE_CHINESE,
            POS_FONT_STYLE_NORMAL);
    
        VC_POS_S_TextOut("2018-04-20  10:10:10", 190, 1, 1, POS_FONT_TYPE_CHINESE,
            POS_FONT_STYLE_NORMAL);
    
            VC_POS_FeedLine();
    
        VC_POS_S_TextOut("金额:", 70, 1, 1, POS_FONT_TYPE_CHINESE,
            POS_FONT_STYLE_NORMAL);    
    
        VC_POS_S_TextOut("86.00元", 190, 1, 1, POS_FONT_TYPE_CHINESE,
            POS_FONT_STYLE_NORMAL);
    
            VC_POS_FeedLine();
    
    
        VC_POS_S_TextOut("车牌:", 70, 1, 1, POS_FONT_TYPE_CHINESE,
            POS_FONT_STYLE_NORMAL);
    
        VC_POS_S_TextOut("鲁A66001[蓝色]", 190, 1, 1, POS_FONT_TYPE_CHINESE,
            POS_FONT_STYLE_NORMAL);   
    
            VC_POS_FeedLine();
            VC_POS_FeedLine();
    
        //VC_POS_S_PrintBmpInRAM(3,20,POS_BITMAP_PRINT_NORMAL);
        VC_POS_S_PrintBmpInRAM(3,20,POS_BITMAP_PRINT_QUADRUPLE);
    
        VC_POS_FeedLine();
        VC_POS_FeedLine();
        VC_POS_FeedLine();
        VC_POS_FeedLine();
        VC_POS_FeedLine();
        VC_POS_FeedLine();
    
        // 切纸
        VC_POS_CutPaper(POS_CUT_MODE_FULL, 0);
    
    
        return TRUE;
    
    }

    这里写图片描述
    设置的太小,容易丢数据
    log如下:

    这里写图片描述

    打印出来的效果如下:
    这里写图片描述

    下面开始分析:

    1b 40

    这里写图片描述

    0a 0a —– 两次换行
    这里写图片描述

    1d 23 03
    应该是 定义 ID号为03

    1d 2a 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    这里写图片描述

    x = 0x10
    y = 0x06
    下面的是位图数据:
    101x46像素
    这里写图片描述

    这里写图片描述

    这个文件头 54个字节 可能是理解不对

    这里写图片描述

    发送的数据 和 bmp 的数据 有点不一致 ,有空分析一下

    16 x 6 x 8 = 768个字节
    24 x 32 = 768 字节

    继续下面的操作:

    1d  50 b4 b4 1b  53 0a 0a 0a  
    
    1b 24 46 00  1b 4d 03 
    
    1d  42 00 
    1d 62  00 
    1d 21 00  
    
    1b 45 00 
    
    1b  7b 00 
    
    1b 2d  00 
    1c 2d 00  
    1b 56 00 
    cd  a8 d0 d0 bf  a8 49 44 3a  
    1b 24 be 00               
    1b 4d 03 
    1d  42 00 
    1d 62  00 
    1d 21 00
      1b 45 00 
      1b  7b 00 
      1b 2d  00 
      1c 2d 00  1b 56 00 
      33  33 30 33 30               
    30 30 30 31  32 33 34 35  36 37 38 0a  
    1b 24 46 00  
    1b 4d 03 1d  42 00 1d 62  00 1d 21 00  1b 45 00 1b               
    7b 00 1b 2d  00 1c 2d 00  1b 56 00 
    c8  eb bf da ca  b1 bc e4 3a  
    
    1b 24 be 00  1b 4d 03 1d  42 00 1d 62               
    00 1d 21 00  1b 45 00 1b  7b 00 1b 2d  00 1c 2d 00  1b 56 00 
    32  30 31 38 2d  30 34 2d 32  30 20 20 31               
    30 3a 31 30  3a 31 30 0a  
    
    1b 24 46 00  1b 4d 03 1d  42 00 1d 62  00 1d 21 00  1b 45 00 1b  7b 00 1b 2d               
    00 1c 2d 00  1b 56 00 bd  f0 b6 ee 3a  
    1b 24 be 00  1b 4d 03 1d  42 00 1d 62  00 1d 21 00  1b 45 00 1b               
    7b 00 1b 2d  00 1c 2d 00  1b 56 00 38  36 2e 30 30  d4 aa 0a 
    1b  24 46 00 
    1b  4d 03 1d 42  00 1d 62 00               
    1d 21 00 1b  45 00 1b 7b  00 1b 2d 00  1c 2d 00 1b  56 00 b3 b5  c5 c6 3a 
    1b  24 be 00 
    1b  4d 03 1d 42               
    00 1d 62 00  1d 21 00 1b  45 00 1b 7b  00 1b 2d 00  1c 2d 00 
    1b  56 00 
    c2 b3  41 36 36 30  30 31 5b c0               
    b6 c9 ab 5d     鲁A66001[蓝色]
    
    
    0a 0a 
    
    1b 24  14 00 1d 23  03 1d 2f 03  0a 0a 0a 0a  0a 0a 1d 56  00

    1d 50 b4 b4
    这里写图片描述

    1b 53
    这里写图片描述

    1b 24 46 00
    这里写图片描述

    0x46 = 70

    1b 4d 03 选择中文 字体
    这里写图片描述

    1d 42 00
    这里写图片描述

    1d 62 00 —- 这个不知道

    1d 21 00
    这里写图片描述
    这里写图片描述
    1b 45 00
    这里写图片描述

    1b 7b 00
    这里写图片描述

    1b 2d 00
    这里写图片描述

    1c 2d 00
    这里写图片描述

    1b 56 00
    这里写图片描述

    cd a8 d0 d0 bf a8 49 44 3a
    http://www.mytju.com/classcode/tools/encode_gb2312.asp
    这里写图片描述

    1b 24 be 00
    这里写图片描述

    VC_POS_S_PrintBmpInRAM(3,20,POS_BITMAP_PRINT_QUADRUPLE);
    
    1b 24  14 00 
    1d 23  03   --- 选择ID 03
    1d 2f 03  0a 0a 0a 0a  0a 0a 1d 56  00

    1d 2f 03
    这里写图片描述

    1d 56 00
    这里写图片描述

    这里写图片描述
    这里写图片描述

    这里写图片描述

    《佳博热敏票据打印机编程手册.pdf》有二维码指令 (实验没有成功)

    page49
    这里写图片描述

    直接USB发送ESCPOS指令代码

    win32 工程 vs2013
    该代码 打印 二维码 没有成功
    佳博GP-L80180 热敏打印机

    GPL80_ESCPOS_USB.cpp

    代码如下:

    // GPL80_ESCPOS_USB.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <windows.h>
    #include <string>
    #include <IOSTREAM>
    #include <winioctl.h>
    #include <setupapi.h>
    
    #pragma comment(lib, "setupapi.lib")
    
    using namespace std;
    
    // SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大
    #define INTERFACE_DETAIL_SIZE    (1024)
    
    //设备数量上限,假设16台上限
    #define MAX_DEVICE 16
    
    
    //USB类的GUID
    const GUID USB_GUID = { 0xa5dcbf10, 0x6530, 0x11d2, { 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed } };
    
    int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath);
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //获取CreateFile的USB端口号
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    // 根据GUID获得设备路径
    // lpGuid: GUID指针
    // pszDevicePath: 设备路径指针的指针,用于返回找到的路径
    // 返回: 成功得到的设备路径个数,可能不止1个
    int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
    {
        HDEVINFO hDevInfoSet;
        SP_DEVINFO_DATA spDevInfoData;
        SP_DEVICE_INTERFACE_DATA ifData;
        PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
        int nCount;
        int nTotle;
        BOOL bResult;
    
        TCHAR* strUSBPrint = TEXT("USB 打印支持");
    
        // 取得一个该GUID相关的设备信息集句柄
        hDevInfoSet = ::SetupDiGetClassDevs(lpGuid,     // class GUID 
            NULL,                    // 无关键字 
            NULL,                    // 不指定父窗口句柄 
            DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的设备
    
        // 失败...
        if (hDevInfoSet == INVALID_HANDLE_VALUE)
        {
            printf("failed \r\n");
    
            return 0;
        }
    
        // 申请设备接口数据空间
        pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
    
        pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
    
        nTotle = -1;
        nCount = 0;
        bResult = TRUE;
    
        // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
        while (bResult)
        {
            nTotle++;
            spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    
            // 枚举符合该GUID的设备接口
            bResult = ::SetupDiEnumDeviceInfo(
                hDevInfoSet,     // 设备信息集句柄
                (ULONG)nTotle,   // 设备信息集里的设备序号
                &spDevInfoData);        // 设备接口信息
    
            if (bResult)
            {
                DWORD DataT;
                TCHAR buf[MAX_PATH];
                DWORD nSize = 0;
    
                // get Friendly Name or Device Description
                if (SetupDiGetDeviceRegistryProperty(hDevInfoSet, &spDevInfoData,
                    SPDRP_FRIENDLYNAME, &DataT, (PBYTE)buf, sizeof(buf), &nSize)) {
                }
                else if (SetupDiGetDeviceRegistryProperty(hDevInfoSet, &spDevInfoData,
                    SPDRP_DEVICEDESC, &DataT, (PBYTE)buf, sizeof(buf), &nSize)) {
                }
                else {
                    lstrcpy(buf, _T("Unknown"));
                }
    
                _tprintf(_T("buf = %s \r\n"), buf);
                //是否是要找的设备类型
                if (_tcscmp(buf, strUSBPrint) != 0)
                    continue;
    
                _tprintf(_T("OK\r\n"));
    
                ifData.cbSize = sizeof(ifData);
    
                // 枚舉符合該GUID的設備接口
                bResult = ::SetupDiEnumDeviceInterfaces(
                    hDevInfoSet,     // 設備信息集句柄
                    NULL,            // 不需額外的設備描述
                    lpGuid,          // GUID
                    (ULONG)nTotle,   // 設備信息集里的設備序號
                    &ifData);        // 設備接口信息
    
                if (bResult)
                {
                    // 取得该设备接口的细节(设备路径)
                    bResult = SetupDiGetInterfaceDeviceDetail(
                        hDevInfoSet,    // 设备信息集句柄
                        &ifData,        // 设备接口信息
                        pDetail,        // 设备接口细节(设备路径)
                        INTERFACE_DETAIL_SIZE,    // 输出缓冲区大小
                        NULL,           // 不需计算输出缓冲区大小(直接用设定值)
                        NULL);          // 不需额外的设备描述
    
                    if (bResult)
                    {
                        // 复制设备路径到输出缓冲区
                        ::_tcscpy_s(pszDevicePath[nCount],256, pDetail->DevicePath);
                        // 调整计数值
                        nCount++;
                        _tprintf(_T("Cnt = %d,pDetail->DevicePath =%s\r\n"), nCount, pDetail->DevicePath);
                    }
                }
            }
        }
    
        // 释放设备接口数据空间
        ::GlobalFree(pDetail);
    
        // 关闭设备信息集句柄
        ::SetupDiDestroyDeviceInfoList(hDevInfoSet);
    
        return nCount;
    }
    
    
    HANDLE hPort = NULL;  //句柄
    
    
    int   WriteData(string meg)
    {
        DWORD dwWrite;
        return WriteFile(hPort, meg.c_str(), (DWORD)meg.length(), &dwWrite, NULL);
    }
    
    int WriteBuf(char *buf, int len)
    {
        DWORD dwWrite;
        return WriteFile(hPort, buf, len, &dwWrite, NULL);
    }
    
    int POS_Reset(void)
    {
        string s;
        s = "\x1B\x40";
        WriteData(s);
    
        return 0;
    }
    
    int POS_FeedLine(void)
    {
        string s;
        s = "\x0A";
        WriteData(s);
    
        return 0;
    
    }
    
    int POS_SetMotionUnit(int x,int y)
    {
        string s;
        s = "\x1D\x50\xB4\xB4";
        WriteData(s);
        s = "\x1B\x53";
        WriteData(s);
    
        return 0;
    }
    
    int POS_S_TextOut(string &abc)
    {
        string s;
    
        char SetAbsPos[4] = {0x1B,0x24,0x46,0x00};
        WriteBuf(SetAbsPos,4);
    
    
        char SelctFontType[3] = { 0x1B, 0x4D, 0x03 };
        WriteBuf(SelctFontType, 3);
    
        char SelctOutMode[3] = { 0x1D, 0x21, 0x00 };
    
        WriteBuf(SelctOutMode, 3);
    
    
        WriteData(abc);
    
        return 0;
    }
    
    int POS_CutPaper()
    {
    
        char CutPaperMode[4] = { 0x1D, 0x56, 0x41,0x00 };
    
        WriteBuf(CutPaperMode, 4);
    
        return 0;
    }
    
    int POS_OutQRCode()
    {
        char  QRCode1[8] = { 0x1d, 0x28 ,0x6b ,0x03, 0x00, 0x31 ,0x43, 0x05 };
    
        char  QRCode2[16] = { 0x1d, 0x28, 0x6b, 0x0b, 0x00, 0x31, 0x50, 0x30, 0x47, 0x70, 0x72, 0x69,
                                0x6e, 0x74, 0x65, 0x72 };
    
        char  QRCode3[8] = { 0x1d, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x51, 0x30 };
    
    
        WriteBuf(QRCode1, 8);
    
        WriteBuf(QRCode2, 16);
    
        WriteBuf(QRCode3, 8);
    
        return 0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        //遍历USB设备,找到POS打印机路径
        int i, nDevice;
        TCHAR * szDevicePath[MAX_DEVICE];        // 设备路径
    
    //  string Port;  //串口端口号
        setlocale(LC_CTYPE, "chs");//设置中文字符
    
        TCHAR * Port;
    
        // 分配需要的空间
        for (i = 0; i < MAX_DEVICE; i++)
        {
            szDevicePath[i] = new TCHAR[256];
        }
    
        // 取设备路径
        nDevice = GetDevicePath((LPGUID)&USB_GUID, szDevicePath);
    
        i = 0;
    
    
        while (i < nDevice){
    
            Port = szDevicePath[i++];
    
            _tprintf(_T("device.Port = %s\n"), Port);
        }
    
    
        hPort = CreateFile(Port, GENERIC_READ | GENERIC_WRITE,
            0, NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL, NULL);
    
        if (hPort == INVALID_HANDLE_VALUE)
        {   // 打开端口失败
            return false;
        }
    
    
        DWORD iBytesLength;
        string s;
    
        POS_Reset();
        POS_FeedLine();
        POS_FeedLine();
    
        POS_SetMotionUnit(180, 180);
    
        s = "你好";
        POS_S_TextOut(s);
        POS_FeedLine();
    
        s = "123abc";
        POS_S_TextOut(s);
        POS_FeedLine();
    
        s = "666";
        POS_S_TextOut(s);
        POS_FeedLine();
        POS_FeedLine();
    
        POS_OutQRCode();
    
        //s = "777";
        //POS_S_TextOut(s);
    
        POS_FeedLine();
        POS_FeedLine();
    
        POS_FeedLine();
        POS_FeedLine();
    
        POS_CutPaper();
    
    
    
    
        return 0;
    }
    
    

    打印效果:

    这里写图片描述

    展开全文
  • Android集成佳博热敏打印机打印小票功能

    万次阅读 热门讨论 2018-06-04 16:51:02
    最近公司项目需要做打印机打印小票功能,首先公司买了一个佳博小票打印机作为测试用机。然后在开发的过程中也遇到一些坑,在此记录一下。 二、集成过程 1. 下载开发文档 首先需要去其官网下载SDK可开发文档...

    一、说明

    最近公司项目需要做打印机打印小票功能,首先公司买了一个佳博小票打印机作为测试用机。然后在开发的过程中也遇到一些坑,在此记录一下。

    二、集成过程

    1. 下载开发文档

    首先需要去其官网下载SDK可开发文档:http://www.gainscha.cn/download/24

    2. 在manifest中添加必要的声明

    // 权限声明
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.hardware.usb.accessory" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-feature android:name="android.hardware.usb.host" />
    
    // service声明
    <service
        android:name="com.gprinter.service.GpPrintService" 
        android:enabled="true"
        android:exported="true" 
        android:label="GpPrintService" >
        <intent-filter>
            <action android:name="com.gprinter.aidl.GpPrintService" />
            </intent-filter>
    </service>
    <service android:name="com.gprinter.service.AllService" ></service>

    3. aidl

    在main文件下添加aidl文件夹,然后在内部建com.gprinter.aidl文件夹。切记:创建文件夹的时候不要直接把文件夹名称写成com.gprinter.aidl,这样只会创建一个文件夹,要分别创建com,在com内部伊娃gprinter,在gprinter内部创建aidl,最后在aidl内部创建GpService.aidl,其代码如下:

    package com.gprinter.aidl;
    interface GpService{  
        int openPort(int PrinterId,int PortType,String DeviceName,int PortNumber);
        void closePort(int PrinterId);
        int getPrinterConnectStatus(int PrinterId);
        int printeTestPage(int PrinterId);   
        void queryPrinterStatus(int PrinterId,int Timesout,int requestCode);
        int getPrinterCommandType(int PrinterId);
        int sendEscCommand(int PrinterId, String b64);
        int sendLabelCommand(int PrinterId, String  b64);
        void isUserExperience(boolean userExperience);
        String getClientID();
        int setServerIP(String ip, int port);
    }       

    4. 启动并绑定服务

    private PrinterServiceConnection conn = null;
    
    class PrinterServiceConnection implements ServiceConnection {
            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.i("ServiceConnection", "onServiceDisconnected() called");
                mGpService = null;
            }
    
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                mGpService = GpService.Stub.asInterface(service);
                connectToPrinter();
            }
        }
    
    /**
     * 绑定打印服务
     */
    public void bindPrintService() {
        conn = new PrinterServiceConnection();
        Intent intent = new Intent(mActivity, GpPrintService.class);
        mActivity.bindService(intent, conn, Context.BIND_AUTO_CREATE); // bindService
    
        // 注册实时状态查询广播
        mActivity.registerReceiver(mBroadcastReceiver, new IntentFilter(GpCom.ACTION_DEVICE_REAL_STATUS));
        mActivity.registerReceiver(mBroadcastReceiver, new IntentFilter(GpCom.ACTION_RECEIPT_RESPONSE));
        mActivity.registerReceiver(mBroadcastReceiver, new IntentFilter(GpCom.ACTION_LABEL_RESPONSE));
    }
    
    /**
     * 解绑打印服务
     */
    public void unBindPrintService() {
         mActivity.unregisterReceiver(mBroadcastReceiver);
         disConnectToPrinter();
    }
    
    /**
     * 断开与打印机的连接
     */
     public void disConnectToPrinter() {
         try {
            mGpService.closePort(DEFAULT_PRINTER_ID);
         } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
     }

    5. 连接打印机

    首先你需要获取到已经配对的蓝牙信息,然后找到是你打印机的蓝牙名称,用这个蓝牙名称进行配对。

        /**
         * 获取已配对的设备
         */
        public void initPairedDevice() {
            BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    
            Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
            // If there are paired devices, add each one to the ArrayAdapter
            if (pairedDevices.size() > 0) {
                for (BluetoothDevice device : pairedDevices) {
                    if (device.getName().startsWith("Printer_")) {
                        connectedDeviceList.add(device.getName() + "," + device.getAddress());
                    }
                }
            }
        }
    
        /**
         * 连接到打印机
         */
        public void connectToPrinter() {
            LogUtils.d(">>>>>>>>> 连接打印机");
            int rel = 0;
    
            if (connectedDeviceList != null && connectedDeviceList.size() > 0) {
                String device = connectedDeviceList.get(0);
                int subIndex = device.indexOf(",");
                String address = connectedDeviceList.get(0).substring(subIndex + 1);
                if (!TextUtils.isEmpty(address)) {
                    try {
                        rel = mGpService.openPort(DEFAULT_PRINTER_ID, 4, address, 0);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
    
            GpCom.ERROR_CODE r = GpCom.ERROR_CODE.values()[rel];
    
            if (r == GpCom.ERROR_CODE.SUCCESS) {
                LogUtils.d("打印机连接成功");
            } else {
                ToastBox.showBottom(mActivity, GpCom.getErrorText(r));
            }
            LogUtils.d("打印机连接状态:   " + GpCom.getErrorText(r));
        }

    到此为止,配置工作就已经完成了。首先你需要打开手机蓝牙,寻找以Gprinter开头的蓝牙名称,输入密码0000连接好打印机。然后用上面的代码连接到打印机,再用以下代码就可以打印出信息。

    EscCommand esc = new EscCommand();
    esc.addInitializePrinter();
    esc.addPrintAndFeedLines((byte) 3);
    esc.addSelectJustification(JUSTIFICATION.CENTER);// 设置打印居中 esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF, ENABLE.ON, ENABLE.ON, ENABLE.OFF);// 设置为倍高倍宽 esc.addText("Sample\n"); // 打印文字
    esc.addPrintAndLineFeed();
    /* 打印文字 */
    esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF);// 取消倍高倍宽 esc.addSelectJustification(JUSTIFICATION.LEFT);// 设置打印左对齐
    esc.addText("Print text\n"); // 打印文字
    esc.addText("Welcome to use SMARNET printer!\n"); // 打印文字
    /* 打印繁体中文 需要打印机支持繁体字库 */ String message = "佳博智匯票據打印機\n"; // esc.addText(message,"BIG5"); esc.addText(message, "GB2312"); esc.addPrintAndLineFeed();
    /* 绝对位置 具体详细信息请查看GP58编程手册 */ esc.addText("智汇"); esc.addSetHorAndVerMotionUnits((byte) 7, (byte) 0); esc.addSetAbsolutePrintPosition((short) 6); esc.addText("网络"); esc.addSetAbsolutePrintPosition((short) 10); esc.addText("设备");
    esc.addPrintAndLineFeed();
    /* 打印图片 */
    esc.addText("Print bitmap!\n"); // 打印文字 Bitmap b = BitmapFactory
    .decodeResource(getResources(), R.drawable.gprinter); esc.addRastBitImage(b, 384, 0); // 打印图片
    /* 打印一维条码 */
    esc.addText("Print code128\n"); // 打印文字 esc.addSelectPrintingPositionForHRICharacters(HRI_POSITION.BELOW);// // 设置条码可识别字符位置在条码下方
    esc.addSetBarcodeHeight((byte) 60); // 设置条码高度为60点 esc.addSetBarcodeWidth((byte) 1); // 设置条码单元宽度为1 esc.addCODE128(esc.genCodeB("SMARNET")); // 打印Code128码 esc.addPrintAndLineFeed();
    /*
    * QRCode命令打印 此命令只在支持QRCode命令打印的机型才能使用。 在不支持二维码指令打印的机型上,则需要发送二维条码图片 */
    esc.addText("Print QRcode\n"); // 打印文字 esc.addSelectErrorCorrectionLevelForQRCode((byte) 0x31); // 设置纠错等级 esc.addSelectSizeOfModuleForQRCode((byte) 3);// 设置qrcode模块大小 esc.addStoreQRCodeData("www.smarnet.cc");// 设置qrcode内容 esc.addPrintQRCode();// 打印QRCode
    esc.addPrintAndLineFeed();
    /* 打印文字 */
    esc.addSelectJustification(JUSTIFICATION.CENTER);// 设置打印左对齐 esc.addText("Completed!\r\n"); // 打印结束
    // 开钱箱
    esc.addGeneratePlus(LabelCommand.FOOT.F5, (byte) 255, (byte) 255); esc.addPrintAndFeedLines((byte) 8);
    Vector<Byte> datas = esc.getCommand(); // 发送数据
    byte[] bytes = GpUtils.ByteTo_byte(datas);
    String sss = Base64.encodeToString(bytes, Base64.DEFAULT); int rs;
    try {
    rs = mGpService.sendEscCommand(mPrinterIndex, sss); GpCom.ERROR_CODE r = GpCom.ERROR_CODE.values()[rs]; if (r != GpCom.ERROR_CODE.SUCCESS) {
    Toast.makeText(getApplicationContext(), GpCom.getErrorText(r), Toast.LENGTH_SHORT).show(); }
    } catch (RemoteException e) {
    // TODO Auto-generated catch block e.printStackTrace();
    }

    三、问题

    以上的过程可以让你打印小票了,但是打印的时候肯定还会遇到一些问题,比如文字的对齐问题,文字的换行问题等等。

    问题1:文字大小

    很遗憾,并没有可以设置具体大小的API,我只找到了倍高、倍宽、倍高+倍宽这3种字体大小模式。

    问题2:怎样进行对齐

    比如:商品、单价、数量、金额,它们的排列需要像表格一样对齐。利用以下2个API可以进行对齐设置:

    // 设置单位距离
    esc.addSetHorAndVerMotionUnits((byte) 7, (byte) 0);
    // 移动的距离(距离 = 单位 * position设定值)
    esc.addSetAbsolutePrintPosition(20);

    但这个对齐其实是有问题的,它的值的计算可以参考《佳博热敏票据打印机编程手册》,文档给出的是你将移动单位长度设置为7,这个长度大约等于1个字的长度,但是不够精准,其实际长度略有偏差,比较坑的一点就是这个距离并不能设定为小数,只能精确到整数位,我的做法是将单位长度设定为整个字的1/3,这样就可以更加精准一些。

    public static final short PRINT_POSITION_0 = 0;
    public static final short PRINT_POSITION_1 = 26 * 3;
    public static final short PRINT_POSITION_2 = 32 * 3;
    public static final short PRINT_POSITION_3 = 42 * 3;
    public static final int MAX_GOODS_NAME_LENGTH = 22 * 3;
    // 将unit设置为这个单位值,其实际距离大约是一个字的1/3
    public static final short PRINT_UNIT = 43;
    // 商品头信息
    esc.addSetHorAndVerMotionUnits((byte) PRINT_UNIT, (byte) 0);
    esc.addText("商品名");
    
    esc.addSetAbsolutePrintPosition(PRINT_POSITION_1);
    esc.addText("单价");
    
    esc.addSetAbsolutePrintPosition(PRINT_POSITION_2);
    esc.addText("数量");
    
    esc.addSetAbsolutePrintPosition(PRINT_POSITION_3);
    esc.addText("金额");

    在这样的设置下,基本可以对齐并占满整个小票打印纸,而具体的商品信息你则可以以这些位置为基准进行具体放置。

    问题3:商品名称过长换行问题

    有的时候商品名称比较长,一行是放不下的,这个时候你就需要对商品名称切割成若干行。但是切割的时候又会有个问题,商品信息里面有汉字,有字母,还会有数字和特殊符号,如果切割不好,很有可能会切出乱码来。

    一般一个汉字占2个字节,一个英文字母是占1个字节;平常在占位上一个汉字是占2个英文字母的位置,平常开发的时候我们一般是以UTF-8格式的,如果想计算好宽度又需要将其转为gbk 或 gb2312,总体来说需要考虑的面还是比较多的,废话不多说,直接贴出代码:

    /**
     * 按字节截取字符串
     */
    public class SubByteString {
    
        public static String subStr(String str, int subSLength) throws UnsupportedEncodingException{
            if (str == null)
                return "";
            else{
                int tempSubLength = subSLength;//截取字节数
                String subStr = str.substring(0, str.length()<subSLength ? str.length() : subSLength);//截取的子串
                int subStrByetsL = subStr.getBytes("GBK").length;//截取子串的字节长度
                //int subStrByetsL = subStr.getBytes().length;//截取子串的字节长度
                // 说明截取的字符串中包含有汉字
                while (subStrByetsL > tempSubLength){
                    int subSLengthTemp = --subSLength;
                    subStr = str.substring(0, subSLengthTemp>str.length() ? str.length() : subSLengthTemp);
                    subStrByetsL = subStr.getBytes("GBK").length;
                    //subStrByetsL = subStr.getBytes().length;
                }
                return subStr;
            }
        }
    
        public static String[] getSubedStrings(String string, int unitLength) {
            if (TextUtils.isEmpty(string)) {
                return null;
            }
    
            String str = new String(string);
    
            int arraySize = 0;
            try {
                arraySize = str.getBytes("GBK").length / unitLength;
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            if (str.getBytes().length % unitLength > 0) {
                arraySize++;
            }
    
            String[] result = new String[arraySize];
    
            for (int i = 0; i < arraySize; i++) {
                try {
                    result[i] = subStr(str, unitLength);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                str = str.replace(result[i], "");
    //            LogUtils.d(">>>>>>  " + result[i]);
            }
    
            return result;
        }
    }

    用以上代码可以将一个字符串切割成一个字符数组,这样将第一行显示不下的再多打印几行即可完成商品名称换行问题。

    最后,我将格式化整个商品信息小票打印的代码贴出来,以供参考:

    public class PrintSplitUtil {
    
        private static final String PRINT_LINE = "------------------------------------------------\n";
    
        public static final int PRINT_TOTAL_LENGTH = 48 * 3;
        public static final short PRINT_POSITION_0 = 0;
        public static final short PRINT_POSITION_1 = 26 * 3;
        public static final short PRINT_POSITION_2 = 32 * 3;
        public static final short PRINT_POSITION_3 = 42 * 3;
        public static final int MAX_GOODS_NAME_LENGTH = 22 * 3;
    
        public static final short PRINT_UNIT = 43;
    
        public static PrinterSplitInfo getPrintText(Context context, GoodsListInfo goodsInfo, String store, String userMobile, String qrCode) {
    
            PrinterSplitInfo printerSplitInfo = new PrinterSplitInfo();
    
            EscCommand esc = new EscCommand();
            esc.addInitializePrinter();
    
            // 顶部图片
            esc.addSelectJustification(JUSTIFICATION.CENTER);
            Bitmap b = BitmapFactory.decodeResource(context.getResources(), R.mipmap.printer_logo);
            esc.addRastBitImage(b, 200, 0); // 打印图片
    
            esc.addPrintAndLineFeed();
    
            esc.addText(PRINT_LINE);
    
            // 订单信息
            if (!TextUtils.isEmpty(store)) {
                esc.addSelectJustification(JUSTIFICATION.LEFT);
                esc.addSelectPrintModes(FONT.FONTA, ENABLE.ON, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF);
                esc.addText(store + "\n"); // 打印文字
            }
    
            esc.addSelectJustification(JUSTIFICATION.LEFT);
            esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF);
    
            // 头部信息
            esc.addText("打印编号:" + goodsInfo.express_sn);
            esc.addPrintAndLineFeed();
            esc.addText("操作时间:" + DateTimeUtil.getCurrentDateTime());
            esc.addPrintAndLineFeed();
            esc.addText("操作员:" + userMobile);
            esc.addPrintAndLineFeed();
    
            esc.addText(PRINT_LINE);
    
            // 商品头信息
            esc.addSetHorAndVerMotionUnits((byte) PRINT_UNIT, (byte) 0);
            esc.addText("商品名");
    
            esc.addSetAbsolutePrintPosition(PRINT_POSITION_1);
            esc.addText("单价");
    
            esc.addSetAbsolutePrintPosition(PRINT_POSITION_2);
            esc.addText("数量");
    
            esc.addSetAbsolutePrintPosition(PRINT_POSITION_3);
            esc.addText("金额");
    
            esc.addPrintAndLineFeed();
    
            // 商品信息
            if (goodsInfo.goods_list != null && goodsInfo.goods_list.size() > 0) {
                esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF, ENABLE.ON, ENABLE.OFF, ENABLE.OFF);
                for (int i = 0; i < goodsInfo.goods_list.size(); i++) {
                    GoodsListInfo.GoodsListBean goods = goodsInfo.goods_list.get(i);
    
                    String[] goodsNames = SubByteString.getSubedStrings(goods.goods_name, 20);
                    printerSplitInfo.dataRow += goodsNames.length;
    
                    // 商品名称
                    if (goodsNames != null && goodsNames.length > 0) {
                        esc.addText((i + 1) + "." + goodsNames[0]);
                    } else {
                        esc.addText((i + 1) + "." + goods.goods_name);
                    }
    
                    esc.addSetHorAndVerMotionUnits((byte) PRINT_UNIT, (byte) 0);
    
                    // 单价
                    short priceLength = (short) goods.goods_price.length();
                    short pricePosition = (short) (PRINT_POSITION_1 + 12 - priceLength * 3);
                    esc.addSetAbsolutePrintPosition(pricePosition);
                    esc.addText(goods.goods_price);      // 单价还未获取
    
                    // 数量
                    short numLength = (short) (goods.goods_num + goods.goods_unit).getBytes().length;
                    short numPosition = (short) (PRINT_POSITION_2 + 14 - numLength * 3);
                    esc.addSetAbsolutePrintPosition(numPosition);
                    esc.addText(goods.goods_num + goods.goods_unit);
    
                    // 金额
                    short amountLength = (short) goods.goods_amount.replace(" ", "").getBytes().length;
                    short amountPosition = (short) (PRINT_POSITION_3 + 11 - amountLength * 3);
                    esc.addSetAbsolutePrintPosition(amountPosition);
                    esc.addText(goods.goods_amount);
    
                    if (goodsNames == null || goodsNames.length == 0) {
                        esc.addPrintAndLineFeed();
                    } else if (goodsNames != null && goodsNames.length > 1) {
                        for (int j = 1; j < goodsNames.length; j++) {
                            esc.addText("" + goodsNames[j]);
                            esc.addPrintAndLineFeed();
                        }
                    }
                }
    
                esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF);
                esc.addText(PRINT_LINE);
            }
    
            // 总计信息
            esc.addSelectJustification(JUSTIFICATION.RIGHT);// 设置打印居右
    
            if (!TextUtils.isEmpty(goodsInfo.subsidy)) {
                esc.addText("优惠补贴:" + goodsInfo.subsidy + "元\n");
            }
    
            if (!TextUtils.isEmpty(goodsInfo.goods_amount)) {
                esc.addText("金额总计:" + goodsInfo.goods_amount + "元\n");
            }
    
            if (!TextUtils.isEmpty(goodsInfo.order_amount)) {
                esc.addText("还需支付:" + goodsInfo.order_amount + "元\n");
            }
    
            esc.addText(PRINT_LINE);
    
    //        打印二维码
            if (!TextUtils.isEmpty(qrCode)) {
                esc.addPrintAndLineFeed();
                esc.addSelectJustification(JUSTIFICATION.CENTER);// 设置打印居中
                esc.addText("请打开微信,扫码付款\n");
                esc.addPrintAndLineFeed();
                // 48  49  50  51
                esc.addSelectErrorCorrectionLevelForQRCode((byte) 0x31); // 设置纠错等级
                esc.addSelectSizeOfModuleForQRCode((byte) 7);// 设置qrcode模块大小
                esc.addStoreQRCodeData(qrCode);// 设置qrcode内容
    
                esc.addPrintQRCode();// 打印QRCode
    
                esc.addPrintAndLineFeed();
                esc.addText("请将二维码放平整后再扫码\n");
            }
            esc.addPrintAndFeedLines((byte) 3);
    
            // 加入查询打印机状态,打印完成后,此时会接收到GpCom.ACTION_DEVICE_STATUS广播
            esc.addQueryPrinterStatus();
    
            // 最终数据
            Vector<Byte> datas = esc.getCommand();
            byte[] bytes = GpUtils.ByteTo_byte(datas);
            String result = Base64.encodeToString(bytes, Base64.DEFAULT);
    
            printerSplitInfo.data = result;
    
            return printerSplitInfo;
        }
    
    }

    问题4:打印状态兼听

    在一些情况下我们需要监听打印状态,比如:正在打印、打印成功、打印异常、打印机缺纸,然后在客户端以对话框的形式展示打印状态,类似微信聊天中正在语音、取消语音。

    • 正在打印:当打印命令发出去后,你就可以显示正在打印。
    • 打印异常:这个基本上也是实时的,如果有异常会立刻返回异常值。
    • 打印成功:这个需要在打印命令最后加一个查询指令,如果打印成功后会以广播的方式传递回结果。
    • 打印机缺纸:这个是需要实时查询的,在打印期间你需要每隔几秒就查询一下打印机的状态,当查询到缺纸的时候就你就可以显示缺纸对话框。

    补充:
    有的时候你加了查询打印成功的指令,却并没有接收到打印成功的广播,而App中的“正在打印”还傻乎乎的在那儿等着你告诉他打印成功了。 这个就需要你计算打印速度,当程序估计在一定的时间内打印应该已经成功了,打印机还没有给你成功的提示,你就自动隐藏掉“正在打印”的对话框。

    四、总结

    其实在开发打印机的过程中还遇到了很多问题,时间有限就不一一列举了。其官方的SDK虽然封装了不少,但感觉并不完善,好多时候还是需要开发者自己去写一大堆代码去实现,用起来很不友好。最后附上开发完成的小票打印样式,以供参考。

    这里写图片描述

    展开全文
  • AndPrinter Android 蓝牙连接便携式热敏打印机 打印Demo (测试设备 佳博 ZH-380) 打印效果
  • 佳博标签热敏打印机C#二次开发源码

    热门讨论 2016-05-11 14:31:54
    C#调用佳博打印机打印标签源码,自测环境:win8+vs10,用管理员权限打开项目即可
  • 里面包含源码,开发文档,以及操作手册,目前测试使用的佳博打印机型号为PT-260
  • 佳博热敏机直接打印PDF文件到热敏纸上(pdf裁剪、pdf分页) 使用pdf直接打印到热敏纸上,打印出来的二维码和文字会比截图清晰很多,找了很多方案,然后自己总结的一个比较简单的,方便使用的方法。
  • 1.功能:主要有2个界面,主界面连接蓝牙,关闭蓝牙连接,打印票据;还有一个蓝牙列表界面。 2.文档:EscCommand说明文档,还有一个打印票据指令文档 3.资源文件:里面还有一个.jar包
  • SDK开发包佳博80(热敏打印机,DEMO,文档),,,,,,,,SDK开发包佳博80(热敏打印机,DEMO,文档),,,,,,,,
  • 佳博热敏打印机GP-1225T驱动程序
  • JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码 准备 1、TSCLIB.dll (下载版本与jdk版本一致,32位/64位) 2、佳博热敏打印机一台(或其他tsc系列打印机) TSCLIB环境配置 1、32位版本的要放置在C盘...

    JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码

    准备

    1、TSCLIB.dll (下载版本与jdk版本一致,32位/64位)
    2、佳博热敏打印机一台(或其他tsc系列打印机)

    TSCLIB环境配置

    1、32位版本的要放置在C盘windows\system32目录下
    2、64位则放在C盘windows\system64目录下

    代码

    下面展示一些 内联代码片

    <!-- 佳博打印机第三方库 -->
    <dependency>
    	<groupId>net.java.dev.jna</groupId>
    	<artifactId>jna</artifactId>
    	<version>3.2.5</version>
    </dependency>
    
    
    //加载库文件
        private static final String LOAD_LIBRARY="TSCLIB";
        //打印机型号
        private static final String print_model="Gprinter  GP-3120TU (1)";
    
        /**
         * @class:TscLibDll
         *@descript:创建TSCLIB.dll编程接口
         *动态链接库TSCLIB.dll,支持大部分佳博打印机,和其他品牌的TSC系列的打印机
         *@date:2016年12月8日 下午2:03:55
         *@version:V1.0
         */
        public interface TscLibDll extends Library {
            TscLibDll INSTANCE = (TscLibDll) Native.loadLibrary ("TSCLIB", TscLibDll.class);
            int about ();
            int openport (String pirnterName);
            int closeport ();
            int sendcommand (String printerCommand);
            int setup (String width,String height,String speed,String density,String sensor,String vertical,String offset);
            int downloadpcx (String filename,String image_name);
            int barcode (String x,String y,String type,String height,String readable,String rotation,String narrow,String wide,String code);
            int printerfont (String x,String y,String fonttype,String rotation,String xmul,String ymul,String text);
            int clearbuffer ();
            int printlabel (String set, String copy);
            int formfeed ();
            int nobackfeed ();
            int windowsfont (int x, int y, int fontheight, int rotation, int fontstyle, int fontunderline, String szFaceName, String content);
        }
    
    /**
         * 博顿物料打印条码
         * @param  ibdPrintDto  参数 条码 code128
         */
        public static void printBarcode() {
            //加载驱动
            System.loadLibrary(LOAD_LIBRARY);
            //解决中文乱码
            System.setProperty("jna.encoding", "GBK");
            //TscLibDll.INSTANCE.about();
            TscLibDll.INSTANCE.openport(print_model);
            //TscLibDll.INSTANCE.downloadpcx("C:\\UL.PCX", "UL.PCX");
            //TscLibDll.INSTANCE.sendcommand("REM ***** This is a test by JAVA. *****");
            TscLibDll.INSTANCE.setup("40", "25", "5", "8", "0", "10", "0");
            TscLibDll.INSTANCE.clearbuffer();
            TscLibDll.INSTANCE.printerfont("13", "100", "TSS24.BF2", "0", "1", "1", "名称:");
            TscLibDll.INSTANCE.printerfont("13", "125", "TSS24.BF2", "0", "1", "1", "规格:");
            TscLibDll.INSTANCE.barcode("45", "10", "128", "64", "1", "0", "2", "2", "1223");
            //TscLibDll.INSTANCE.windowsfont(400, 200, 48, 0, 3, 1, "arial", "DEG 0");
            TscLibDll.INSTANCE.printlabel("1", ibdPrintDto.getPrintCount());
            TscLibDll.INSTANCE.closeport();
        }
    
    public static main(String args[]){
    	printBarcode();
    }
    

    相关链接

    TSCLIB.DLL使用说明

    展开全文
  • 佳博热敏标签打印机C# Demo,通过C#语言调用模板进行标签打印
  • http://smarnet.cc/cn/download.aspx?current=down 在这个网页下载全系列产品驱动 即可解决问题! http://download.csdn.net/detail/mfkpie/9702411

    http://smarnet.cc/cn/download.aspx?current=down

    在这个网页下载全系列产品驱动

    即可解决问题!



    http://download.csdn.net/detail/mfkpie/9702411




    展开全文
  • Gprinter热敏打印机光栅位图点阵数据解析工具,支持解析通过Bus Hound抓取的txt,原始的光栅位图点阵数据,及其它们的zip压缩包,可直观显示解析后的图像和相关信息,并保存成bmp和png格式的图片,具体参见...
  • 但这个对齐其实是有问题的,它的值的计算可以参考《佳博热敏票据打印机编程手册》,文档给出的是你将移动单位长度设置为7,这个长度大约等于1个字的长度,但是不够精准,其实际长度略有偏差,比较坑的一点就是这个...
  • 热敏打印机demo(含demo和jar包),将打印机设置为默认,测试可打印的话,连上打印机就可以直接打印
  • 一、说明 在打印小票的时候,商品名称一行显示不下需要折行打印,但是这个折行又不是放在末尾,到头后再折回来接着打印,该怎么办呢 ? 二、思路 大体的思路就是将商品名称切割成最大不超过一定长度的若干个...
  • 佳博打印机如何设置热敏打印

    千次阅读 2020-12-18 19:02:22
    原标题:佳博打印机如何设置热敏打印现在市场上标签纸种类比较多,如果你的打印机适合哪种标签纸,你需要在你的打印机上安装对应的标签纸即可,这里以佳博打印机安装热敏纸为例,首选需要在打印机上安装热敏纸,安装...
  • 我把默认的IP改为:192.168.5.100 子网255.255.255.252 打印机就不通了,捣鼓了半天没用好,用这个工具才弄好的
  • 佳博打印机官方 SDK

    2015-09-17 09:37:01
    佳博打印机 安卓开发SDK及相关文档,亲测gp5890,gp58130型号...
  • 佳博5890xiii打印机驱动程序是一款可以有效解决佳博5890xiii打印机在使用过程中出现的一些问题的驱动工具, 本站提供了佳博5890xiii驱动的下载地址,有兴趣的朋友们可以前来下载使用。 本驱动是官方的佳博5890xiii...
  • 佳博热敏票据打印机编程手册 v1.0.2 佳博热敏票据打印机编程手册 v1.0.2
  • 佳博热敏打印机 GP-L80180I 使用

    千次阅读 2018-06-15 16:50:31
    串口:
  • 可以通过此工具修改佳博80网口打印机的IP地址,可以通过此工具修改佳博80网口打印机的IP地址,可以通过此工具修改佳博80网口打印机的IP地址

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 285
精华内容 114
关键字:

佳博热敏打印机