/*
 * ********************************************************************************************************************
 *
 *               iFHS7.
 *              ;BBMBMBMc                  rZMBMBR              BMB
 *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
 *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
 *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
 *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
 *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
 *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
 *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
 *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
 *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
 *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
 *         i0BM: SWKHKGO  MBDv
 *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
 *              ,  XMW  ..
 *                  r                                                                     All rights reserved.
 *
 * ********************************************************************************************************************
 */

package com.sybotan.android.devices.printer

import android.util.Log
import android.webkit.JavascriptInterface
import com.dothantech.lpapi.LPAPI

/**
 * 标签打印机接口
 *
 * @author  庞利祥(sybotan@126.com)
 */
class SLPrinter {
    /**
     * 类对象
     */
    companion object {
        /** 日志TAG */
        private val TAG = SLPrinter::class.java.name
    } // companion object

    /** 打印机实例 */
    private val printer = LPAPI.Factory.createInstance()

    /**
     * 以字符串形式返回配对列表中所有指定型号的打印机
     * 打印机名称列表需要用户自己根据英文逗号（“，”）进行字符串分割操作
     *
     * @param   names        打印机型号，如果未指定则返回所有已配对打印机名称
     * @return  打印机列表字符串，不同打印机名称之间以“,”分割
     */
    @JavascriptInterface
    fun getAllPrinters(names: String): String {
        return printer.getAllPrinters(names)
    } // Function getAllPrinters()

    /**
     * 异步方式打开指定名称或类型的打印机
     * 连接打印机
     * 在开始打印任务前，须先调用该方法，或者同系列的方法
     *
     * @param   printerName       参数可为下列类型的数据：
     *                              1、打印机屏幕上显示的名称：用于打开指定名称的打印机；
     *                              2、打印机型号（名称前缀）：打开配对列表中的第一台对应型号的打印机；
     *                              3、null或者“”，打开配对列表中的第一台打印机；
     * @return  成功与否
     */
    @JavascriptInterface
    fun openPrinter(printerName: String): Boolean {
        return printer.openPrinter(printerName)
    } // Function openPrinter()

    /**
     * 同步方式打开指定名称或型号的打印机
     * 确保打印机已经打开，并进行了配对操作
     *
     * @param   printerName         参数可为下列类型的数据：
     *                                1、打印机屏幕上显示的名称：用于打开指定名称的打印机；
     *                                2、打印机型号（名称前缀）：打开配对列表中的第一台对应型号的打印机；
     *                                3、null或者“”，打开配对列表中的第一台打印机；
     * @return  成功与否
     */
    @JavascriptInterface
    fun openPrinterSync(printerName: String): Boolean {
        return printer.openPrinterSync(printerName)
    } // Function openPrinterSync()

    /**
     * 获取已连接打印机名称
     *
     * @return  如果已连接打印机，则返回对应打印机名称，否则返回null。
     */
    @JavascriptInterface
    fun getPrinterName(): String {
        return printer.printerName
    } // Function getPrinterName()

    /**
     * 判断是否已经连接打印机
     *
     * @return  True：表示打印机以链接成功，可以进行打印；false：表示未连接打印机，在打印之前需要链接打印机；
     */
    @JavascriptInterface
    fun isPrinterOpened(): Boolean {
        return printer.isPrinterOpened
    } // Function isPrinterOpened()

    /**
     * 取消打印任务
     * 取消已经提交（执行过commitJob函数），但尚未开始的打印任务
     */
    @JavascriptInterface
    fun cancel() {
        printer.cancel()
        return
    } // Function cancel()

    /**
     * 关闭当前已连接打印机
     * 如果需要多个用户公用同一台打印机，在打印完成之后，可以通过该函数来断开打印机，否则其他用户无法连接到该打印机；
     * 在打印未完成之前尽量避免调用该函数，否则有可能会导致打印任务终止
     */
    @JavascriptInterface
    fun closePrinter() {
        printer.closePrinter()
        return
    } // Function closePrinter()

    /**
     * 异步方式打开上次连接过的打印机
     * 返回成功仅仅表示操作被提交，并不代表着连接成功了，具体的连接结果会通过回调函数给出通知
     *
     * @return  成功与否
     */
    @JavascriptInterface
    fun reopenPrinter(): Boolean {
        return printer.reopenPrinter()
    } // Function reopenPrinter()

    /**
     * 同步方式打开上次连接过的打印机
     *
     * @return  成功与否
     */
    @JavascriptInterface
    fun reopenPrinterSync(): Boolean {
        return printer.reopenPrinterSync()
    } // Function reopenPrinterSync()

    /**
     * 开始绘图任务
     * 确保打印机已经打开，并进行了配对操作
     * 开始一个绘图任务时需调用此方法
     * 开始绘图任务时，之前的任务/数据将会被全部丢弃
     *
     * @param   width           标签宽度（基于绘制视图，不考虑标签旋转。单位毫米）;
     * @param   height          标签高度（基于绘制视图，不考虑标签旋转。单位毫米）;
     * @param   orientation     绘图任务的标签页面顺时针旋转角度，0/90/180/270，默认值0;
     * @return  成功与否
     */
    @JavascriptInterface
    fun startJob(width: Double, height: Double, orientation: Int): Boolean {
        return printer.startJob(width, height, orientation)
    } // Function startJob()

    /**
     * 取消绘图任务
     * 当前的任务/数据将会被全部丢弃，但是参数设置将会被保留
     */
    @JavascriptInterface
    fun abortJob() {
        printer.abortJob()
        return
    } // Function abortJob()

    /**
     * 结束绘图任务
     */
    @JavascriptInterface
    fun endJob() {
        printer.endJob()
        return
    } // Function endJob()

    /**
     * 提交数据打印
     *
     * @return  成功与否
     */
    @JavascriptInterface
    fun commitJob(): Boolean {
        return printer.commitJob()
    } // Function commitJob()

    /**
     * 开始绘制一个页面
     *
     * @return  成功与否
     */
    @JavascriptInterface
    fun startPage(): Boolean {
        return printer.startPage()
    } // Function startPage()

    /**
     * 结束一个页面的绘制
     */
    @JavascriptInterface
    fun endPage() {
        printer.endPage()
        return
    } // Function endPage()

    /**
     * 设置后续绘制内容的顺时针旋转角度
     *
     * @param   orientation      后续绘制内容的顺时针旋转角度（0/90/180/270），默认值为0;
     */
    @JavascriptInterface
    fun setItemOrientation(orientation: Int) {
        printer.itemOrientation = orientation
        return
    } // Function setItemOrientation()

    /**
     * 得到当前绘制内容的顺时针旋转角度
     *
     * @return  当前绘制内容的顺时针旋转角度（0/90/180/270）
     */
    @JavascriptInterface
    fun getItemOrientation(): Int {
        return printer.itemOrientation
    } // Function getItemOrientation()

    /**
     * 设置后续绘制动作的水平对齐方式
     * 水平方向是基于后续绘制的内容的水平绘制方向，跟随绘制内容的顺时针旋转角度旋转
     *
     * @param   alignment      后续绘制动作的水平对齐方式（ItemAlignment），默认值为ItemAlignment.LEFT;
     */
    @JavascriptInterface
    fun setItemHorizontalAlignment(alignment: Int) {
        printer.itemHorizontalAlignment = alignment
        return
    } // Function setItemHorizontalAlignment()

    /**
     * 得到当前绘制动作的水平对齐方式
     * 水平方向是基于后续绘制的内容的水平绘制方向，跟随绘制内容的顺时针旋转角度旋转
     *
     * @return  当前绘制动作的水平对齐方式（ItemAlignment）
     */
    @JavascriptInterface
    fun getItemHorizontalAlignment(): Int {
        return printer.itemHorizontalAlignment
    } // Function getItemHorizontalAlignment()

    /**
     * 设置后续绘制动作的垂直对齐方式
     * 垂直方向是基于后续绘制的内容的垂直绘制方向，跟随绘制内容的顺时针旋转角度旋转
     *
     * @param   alignment      后续绘制动作的垂直对齐方式（ItemAlignment），默认值为ItemAlignment.TOP;
     */
    @JavascriptInterface
    fun setItemVerticalAlignment(alignment: Int) {
        printer.itemVerticalAlignment = alignment
        return
    } // Function setItemVerticalAlignment()

    /**
     * 得到当前绘制动作的垂直对齐方式
     * 垂直方向是基于后续绘制的内容的垂直绘制方向，跟随绘制内容的顺时针旋转角度旋转
     *
     * @return  当前绘制动作的垂直对齐方式（ItemAlignment）
     */
    @JavascriptInterface
    fun getItemVerticalAlignment(): Int {
        return printer.itemVerticalAlignment
    } // Function getItemVerticalAlignment()

    /**
     * 设置线条画笔对齐方式
     *
     * @param   penAlignmen      线条画笔对齐方式（PenAlignment），数值为以下两者之一;
     *                              1、PenAlignment.CENTER：绘制的线以指定的位置为中央;
     *                              2、PenAlignment.INSET：绘制的线在指定的位置内侧;
     */
    @JavascriptInterface
    fun setItemPenAlignment(penAlignmen: Int) {
        printer.itemPenAlignment = penAlignmen
        return
    } // Function setItemPenAlignment()

    /**
     * 得到线条画笔对齐方式
     *
     * @return      线条画笔对齐方式（PenAlignment），数值为以下两者之一;
     *              1、PenAlignment.CENTER：绘制的线以指定的位置为中央;
     *              2、PenAlignment.INSET：绘制的线在指定的位置内侧;
     */
    @JavascriptInterface
    fun getItemPenAlignment(): Int {
        return printer.itemPenAlignment
    } // Function getItemPenAlignment()

    /**
     * 绘制文本字符串
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage开始
     * 绘制一个页面，然后进行文本字符串的绘制。
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     * ontHeight是以毫米为单位
     * 字号和毫米的转换公式为：
     * 字号 = 毫米 * 72 / 25.4；
     * 例如： 9 号字为 3.175 毫米，12 号字为 4.233 毫米
     *
     * @param            text            需要绘制的文本字符串;
     * @param            x               绘制的文本框左上角水平位置（单位毫米）;
     * @param            y               绘制的文本框左上角垂直位置（单位毫米）;
     * @param            width           绘制的文本框水平宽度（单位毫米）。如果 width 为 0，则会根据绘制文本的显示宽度;
     *                                    根据当前对齐方式进行以 x 为基准点的左中右对齐。默认值为0;
     * @param            height          绘制的文本框垂直高度（单位毫米）。如果height为 0，则会根据绘制文本的显示高度;
     *                                    根据当前对齐方式进行以 y 为基准点的上中下对齐。默认值为0;
     * @param            fontHeight      文字大小（单位毫米）;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawText(text: String, x: Double, y: Double, width: Double, height: Double, fontHeight: Double): Boolean {
        return printer.drawText(text, x, y, width, height, fontHeight)
    } // Function drawText()

    /**
     * 绘制一维条码
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage开始
     * 绘制一个页面，然后进行一维条码的绘制
     * 绘制的左上角水平垂直位置、宽度、高度是基于当前绘制页面的水平垂直方向
     *
     * @param         text          需要绘制的一维条码的内容;
     * @param         type          一维条码的编码类型（BarcodeType)，默认值为60;
     * @param         x             绘制的一维条码的左上角水平位置（单位毫米）;
     * @param         y             绘制的一维条码的左上角垂直位置（单位毫米）;
     * @param         width         一维条码的整体显示宽度;
     * @param         height        一维条码的显示高度（包括供人识读文本）;
     * @param         textHeight    供人识读文本的高度（单位毫米），建议为3毫米;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drw1Dbarcode(text: String, type: Int, x: Double, y: Double, width: Double, height: Double, textHeight: Double): Boolean {
        return printer.draw1DBarcode(text, type, x, y, width, height, textHeight)
    } // Function drw1Dbarcode()

    /**
     * 绘制 QrCode 二维码
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行QrCode二维码的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     *
     * @param         text          需要绘制的QrCode二维码的内容;
     * @param         x             绘制的QrCode二维码的左上角水平位置（单位毫米）;
     * @param         y             绘制的QrCode二维码的左上角垂直位置（单位毫米）;
     * @param         width         绘制的QrCode二维码的水平宽度（单位毫米）;
     * @return  成功与否
     */
    @JavascriptInterface
    fun draw2DQRCode(text: String, x: Double, y: Double, width: Double): Boolean {
        return printer.draw2DQRCode(text, x, y, width)
    } // Function draw2DQRCode()

    /**
     * 绘制 Pdf417 二维码
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行Pdf417二维码的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     *
     * @param          text            需要绘制的Pdf417二维码的内容;
     * @param          x               绘制的Pdf417二维码的左上角水平位置（单位毫米）;
     * @param          y               绘制的Pdf417二维码的左上角垂直位置（单位毫米）;
     * @param          width           绘制的Pdf417二维码的水平宽度（单位毫米）;
     * @param          height          绘制的Pdf417二维码的垂直高度（单位毫米）;
     * @return  成功与否
     */
    @JavascriptInterface
    fun draw2DPdf417(text: String, x: Double, y: Double, width: Double, height: Double): Boolean {
        return printer.draw2DPdf417(text, x, y, width, height)
    } // Function draw2DPdf417()

    /**
     * 以指定的线宽，绘制矩形框
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行矩形框的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     *
     * @param           x              绘制的矩形框的左上角水平位置（单位mm）;
     * @param           y              绘制的矩形框的左上角垂直位置（单位mm）;
     * @param           width          绘制的矩形框的水平宽度（单位mm）;
     * @param           height         绘制的矩形框的垂直高度（单位mm）;
     * @param           lineWidth      矩形框的线宽（单位mm）。矩形框的线宽是向矩形框内部延伸的;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawRectangle(x: Double, y: Double, width: Double, height: Double, lineWidth: Double): Boolean {
        return printer.drawRectangle(x, y, width, height, lineWidth)
    } // Function drawRectangle()

    /**
     * 绘制填充矩形框
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行矩形框的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     *
     * @param         x               绘制的填充矩形框的左上角水平位置（单位mm）;
     * @param         y               绘制的填充矩形框的左上角垂直位置（单位mm）;
     * @param         width           绘制的填充矩形框的水平宽度（单位mm）;
     * @param         height          绘制的填充矩形框的垂直高度（单位mm）;
     * @return  成功与否
     */
    @JavascriptInterface
    fun fillRectangle(x: Double, y: Double, width: Double, height: Double): Boolean {
        return printer.fillRectangle(x, y, width, height)
    } // Function fillRectangle()

    /**
     * 以指定的线宽，绘制圆角矩形框
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行圆角矩形框的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     *
     * @param           x                  绘制的圆角矩形框的左上角水平位置（单位mm）;
     * @param           y                  绘制的圆角矩形框的左上角垂直位置（单位mm）;
     * @param           width              绘制的圆角矩形框的水平宽度（单位mm）;
     * @param           height             绘制的圆角矩形框的垂直高度（单位mm）;
     * @param           cornerWidth        圆角宽度（单位mm）;
     * @param           cornerHeight       圆角高度（单位mm），默认值为同cornerWidth;
     * @param           lineWidth          圆角矩形框的线宽（单位mm）。圆角矩形框的线宽是向圆角矩形框内部延伸的;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawRoundRectangle(x: Double, y: Double, width: Double, height: Double, cornerWidth: Double, cornerHeight: Double, lineWidth: Double): Boolean {
        return printer.drawRoundRectangle(x, y, width, height, cornerWidth, cornerHeight, lineWidth)
    } // Function drawRoundRectangle()

    /**
     * 绘制填充圆角矩形框
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行圆角矩形框的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     *
     * @param            x                  绘制的填充圆角矩形框的左上角水平位置（单位mm）;
     * @param            y                  绘制的填充圆角矩形框的左上角垂直位置（单位mm）;
     * @param            width              绘制的填充圆角矩形框的水平宽度（单位mm）;
     * @param            height             绘制的填充圆角矩形框的垂直高度（单位mm）;
     * @param            cornerWidth        圆角宽度（单位mm）;
     * @param            cornerHeight       圆角高度（单位mm），默认值为同cornerWidth;
     * @return  成功与否
     */
    @JavascriptInterface
    fun fillRoundRectangle(x: Double, y: Double, width: Double, height: Double, cornerWidth: Double, cornerHeight: Double): Boolean {
        return printer.fillRoundRectangle(x, y, width, height, cornerWidth, cornerHeight)
    } // Function fillRoundRectangle()

    /**
     * 以指定的线宽，绘制椭圆
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘绘制一个页面，然后进行椭圆/圆的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     * width 和 height  相等时就是打印圆
     *
     * @param            x                  绘制的椭圆的左上角水平位置（单位mm）;
     * @param            y                  绘制的椭圆的左上角垂直位置（单位mm）;
     * @param            width              绘制的椭圆的水平宽度（单位mm）;
     * @param            height             绘制的椭圆的垂直高度（单位mm），默认值为同width，也即绘制圆;
     * @param            lineWidth          椭圆的线宽（单位mm）。椭圆的线宽是向椭圆内部延伸的;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawEllipse(x: Double, y: Double, width: Double, height: Double, lineWidth: Double): Boolean {
        return printer.drawEllipse(x, y, width, height, lineWidth)
    } // Function drawEllipse()

    /**
     * 绘制填充椭圆
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘绘制一个页面，然后进行椭圆/圆的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     * width 和 height  相等时就是打印圆
     *
     * @param            x                  绘制的填充椭圆的左上角水平位置（单位mm）;
     * @param            y                  绘制的填充椭圆的左上角垂直位置（单位mm）;
     * @param            width              绘制的填充椭圆的水平宽度（单位mm）;
     * @param            height             绘制的填充椭圆的垂直高度（单位mm），默认值为同width，也即绘制圆;
     * @return  成功与否
     */
    @JavascriptInterface
    fun fillEllipse(x: Double, y: Double, width: Double, height: Double): Boolean {
        return printer.fillEllipse(x, y, width, height)
    } // Function fillEllipse()

    /**
     * 以指定的位置为中心，绘制圆
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘绘制一个页面，然后进行圆的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向。
     *
     * @param            x                  绘制的圆的x轴中心位置（单位mm）;
     * @param            y                  绘制的圆的y轴中心位置（单位mm）;
     * @param            radius             绘制圆的半径（单位mm）;
     * @param            lineWidth          圆的线宽（单位mm）。圆的线宽是向圆内部延伸;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawCircle(x: Double, y: Double, radius: Double, lineWidth: Double): Boolean {
        return printer.drawCircle(x, y, radius, lineWidth)
    } // Function drawCircle()

    /**
     * 绘制填充圆形
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘绘制一个页面，然后进行圆的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向。
     *
     * @param           x                  绘制的填充圆形X轴坐标中心点位置（单位mm）;
     * @param           y                  绘制的填充圆形y轴坐标中心点位置（单位mm）;
     * @param           radius             绘制填充圆形的半径（单位mm）;
     * @return  成功与否
     */
    @JavascriptInterface
    fun fillCircle(x: Double, y: Double, radius: Double): Boolean {
        return printer.fillCircle(x, y, radius)
    } // Function fillCircle()

    /**
     * 绘制线（直线/斜线）
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行直线/斜线的绘制
     * 绘制的水平垂直位置是基于当前绘制页面的水平垂直方向
     *
     * @param           x1                  线的起点的水平位置（单位mm）;
     * @param           y1                  线的起点的垂直位置（单位mm）;
     * @param           x2                  线的终点的水平位置（单位mm）;
     * @param           y2                  线的终点的垂直位置（单位mm）;
     * @param           lineWidth           线宽（单位mm）。线宽是向线的下方延伸的;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawLine(x1: Double, y1: Double, x2: Double, y2: Double, lineWidth: Double): Boolean {
        return printer.drawLine(x1, y1, x2, y2, lineWidth)
    } // Function drawLine()

    /**
     * 绘制点划线
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行点划线的绘制
     * 绘制的水平垂直位置是基于当前绘制页面的水平垂直方向
     *
     * @param             x1                  线的起点的水平位置（单位mm）;
     * @param             y1                  线的起点的垂直位置（单位mm）;
     * @param             x2                  线的终点的水平位置（单位mm）;
     * @param             y2                  线的终点的垂直位置（单位mm）;
     * @param             lineWidth           线宽（单位mm）。线宽是向线的下方延伸的;
     * @param             dashLen             点划线线段长度的数组;
     * @param             dashCount           点划线线段长度数组的元素个数;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawDashLine(x1: Double, y1: Double, x2: Double, y2: Double, lineWidth: Double, dashLen: DoubleArray, dashCount: Int): Boolean {
        return printer.drawDashLine(x1, y1, x2, y2, lineWidth, dashLen, dashCount)
    } // Function drawDashLine()

    /**
     * 绘制点划线
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行点划线的绘制
     * 绘制的水平垂直位置是基于当前绘制页面的水平垂直方向
     *
     * @param             x1                  线的起点的水平位置（单位mm）;
     * @param             y1                  线的起点的垂直位置（单位mm）;
     * @param             x2                  线的终点的水平位置（单位mm）;
     * @param             y2                  线的终点的垂直位置（单位mm）;
     * @param             lineWidth           线宽（单位mm）。线宽是向线的下方延伸的;
     * @param             dashLen1            点划线第一段的长度（单位mm）;
     * @param             dashLen2            点划线第二段的长度（单位mm）;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawDashLine2(x1: Double, y1: Double, x2: Double, y2: Double, lineWidth: Double, dashLen1: Double, dashLen2: Double): Boolean {
        return printer.drawDashLine2(x1, y1, x2, y2, lineWidth, dashLen1, dashLen2)
    } // Function drawDashLine2()

    /**
     * 绘制点划线
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行点划线的绘制
     * 绘制的水平垂直位置是基于当前绘制页面的水平垂直方向
     *
     * @param              x1                 线的起点的水平位置（单位mm）;
     * @param              y1                 线的起点的垂直位置（单位mm）;
     * @param              x2                 线的终点的水平位置（单位mm）;
     * @param              y2                 线的终点的垂直位置（单位mm）;
     * @param              lineWidth          线宽（单位mm）。线宽是向线的下方延伸的;
     * @param              dashLen1           点划线第一段的长度（单位mm）;
     * @param              dashLen2           点划线第二段的长度（单位mm）;
     * @param              dashLen3           点划线第三段的长度（单位mm）;
     * @param              dashLen4           点划线第四段的长度（单位mm）;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawDashLine4(x1: Double, y1: Double, x2: Double, y2: Double, lineWidth: Double, dashLen1: Double,
                     dashLen2: Double, dashLen3: Double, dashLen4: Double): Boolean {
        return printer.drawDashLine4(x1, y1, x2, y2, lineWidth, dashLen1, dashLen2, dashLen3, dashLen4)
    } // Function drawDashLine4()

    /**
     * 绘制指定文件的图片
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行图片的绘制。
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     *
     * @param           imageFile          图片路径;
     * @param           x                  打印对象在水平方向上的位置（单位mm）;
     * @param           y                  打印对象在垂直方向上的位置（单位mm）;
     * @param           width              打印对象的宽度（单位mm）。如果 width 为 0，则采用加载的位图的宽度。默认值为0;
     * @param           height             打印对象的高度（单位mm）。如果 height 为0，则采用加载的位图的高度。默认值为0;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawImage(imageFile: String, x: Double, y: Double, width: Double, height: Double): Boolean {
        Log.d(TAG, "1.9.1 drawImage ($imageFile, $x, $y, $width, $height)")
        return printer.drawImage(imageFile, x, y, width, height)
    } // Function drawImage()

    /**
     * 绘制给定图片实际大小的图片
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行图片的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     *
     * @param             imageFile          图片路径;
     * @param             x                  打印对象在水平方向上的位置(单位mm);
     * @param             y                  打印对象在垂直方向上的位置(单位mm);
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawImageWithActualSize(imageFile: String, x: Double, y: Double): Boolean {
        return printer.drawImageWithActualSize(imageFile, x, y)
    } // Function drawImageWithActualSize()

    /**
     * 绘制灰度阀值的图片
     * 如果之前没有调用 startPage 而直接调用本方法，则本方法会自动调用 startPage 开始
     * 绘制一个页面，然后进行图片的绘制
     * 绘制的左上角水平垂直位置、水平宽度、垂直高度是基于当前绘制页面的水平垂直方向
     *
     * @param              imageFile             图片路径;
     * @param              x                     打印对象在水平方向上的位置(单位mm);
     * @param              y                     打印对象在垂直方向上的位置(单位mm);;
     * @param              width:                打印对象的宽度（单位mm）。如果 width 为 0，则采用加载的位图的宽度。默认值为0;
     * @param              height:               打印对象的高度（单位mm）。如果 height 为 0，则采用加载的位图的高度。默认值为0;
     * @param              threshold:            绘制位图的灰度阀值。256 表示绘制灰度图片，257 表示绘制原色图片，'
     *                                            0～255表示绘制黑白图片，原图颜色>=灰度阀值的点会被认为是白色，
     *                                            而原图颜色<灰度阀值的点会被认为是黑色;
     * @return  成功与否
     */
    @JavascriptInterface
    fun drawImageWithThreshold(imageFile: String, x: Double, y: Double, width: Double, height: Double, threshold: Int): Boolean {
        return printer.drawImageWithThreshold(imageFile, x, y, width, height, threshold)
    } // Function drawImageWithThreshold()

} // Class SLPrinter