# dtpweb

便携式打印机接口。

**注意：js 接口需要与 dtpweb 插件配合使用才可以，否则 js 接口将无法正常打印**

-   兼容硬件环境：Windows、Kylin、UOS、Deepin、Ubuntu 等
-   支持的软件环境：Browser、NodeJS、VUE、React 等环境。

## 下载

```bash
# npm下载
npm install dtpweb
# yarn下载
yarn add dtpweb
```

## 使用方法

### 安装 dtpweb 打印助手

1. window版本安装：
    在windows中，打印机驱动已经集成了dtpweb打印助手，直接安装驱动即可。
2. linux 桌面版（deb版本）：
```bash
# linux 下 dtpweb服务安装方法
sudo apt update
sudo apt install libcurl4
sudo dpkg -i dtpweb-2.1.xxxx-xxx.deb
# linux 下 dtpweb服务卸载方法
sudo dpkg -r com.dothantech.dtpweb
```

3. linux 服务器版本（rpm版本）：
    暂不支持
### Browser 中使用

1. 检查本地打印助手是否可用（dtpweb 打印接口需要借助于本地的打印助手才能进行打印）；
2. 引入 dtpweb.js 文件；
3. 通过 dtpweb.DTPWeb.getInstance()来获取接口实例；
4. 开始进行标签绘制操作；

eg:

```html
<!-- 在合适的地方导入dtpweb.js文件 -->
<script type="text/javascript" src="../../lib/dtpweb.js"></script>
<script>
    /**
     * @type {import("../../lib/dtpweb").DTPWeb}
     */
    var api = dtpweb.DTPWeb.getInstance();

    window.onload = function () {
        // 检测打印接口是否可用
        api.checkPlugin(function (success) {
            if (!success) {
                api = undefined;
                alert("未检测到打印机插件！");
            }
        });
    };
</script>
```

### NodeJS/Vue 中使用接口

1. 导入 dtpweb 模块

> import { DTPWeb } from 'dtpweb'

2. 获取接口实例 api

```js
 mounted() {
    const api = DTPWeb.getInstance();
    api.checkPlugin((success) => {
        if (!success) {
            api = undefined;
            alert("未检测到打印服务");
        }
    }
}
```

## 快速入门

### Browser 接口快速入门

```javascript
// 接口初始化
<script type="text/javascript" src="../../lib_sync/dtpweb.js"></script>
<script>
var api = dtpweb.DTPWeb.getInstance();
window.onload = function() {
    api.checkPlugin((success) => {
        if (!success) {
            api = undefined;
            console.log("No Detected DothanTech Printer Helper!");
        }
    });
}

async function printText() {
    const printerName = "DT60 Label Printer";
    const labelWidth = 40;
    const labelHeight = 30;
    const text = "https://www.detonger.com"
    const fontHeight = 3;
    // 检查接口是否可用
    if (!api) return;
    // 1. 打印之前需要先链接目标打印机
    if (!(await api.openPrinter({printerName})))
        return;
    // 2. 创建一个指定大小的标签任务
    await api.startJob({width: labelWidth, height: labelHeight});
    // 3. 在标签纸上打印目标字符串
    await api.drawText({text, width: labelWidth, height: labelHeight, fontHeight});
    // 4. 结束绘制操作，开始打印
    await api.commitJob();
    // 5. 关闭已经打开的打印机
    await api.closePrinter();
}
</script>
```

### vue 环境快速入门

-   安装 dtpweb 接口包

> npm install dtpweb
> 或者
> yarn add dtpweb

```javascript
// 导入接口
import {DTPWeb} from "dtpweb"
// 初始化接口
mounted() {
    this.api = DTPWeb.getInstance();
    this.api.checkPlugin((success) => {
        if (!success) {
             this.api = undefined;
             console.log("No Detected DothanTech Printer Helper!");
        }
    });
}
// 打印测试
methods: {
    async printQRCode() {
        const labelWidth = 30;
        const labelHeight = 30;
        const margin = 5;
        const qrcodeWidth = labelWidth - margin * 2;
        const printerName = "DT60 Label Printer";

        // 判断接口是否可用
        if (!this.api) return;
        // 1. 链接目标打印机
        if (!(await this.api.closePrinter({printerName}))) return;
        // 2. 创建一个指定大小的标签任务
        await this.api.startJob({});
        // 3. 在打印任务上绘制二维码
        await this.api.draw2DQRCode({x: margin, y: margin, width: qrcodeWidth});
        // 4. 结束打印任务的绘制，开始打印
        await this.api.commitJob();
        // 打印完毕后关闭打印机
        await this.api.closePrinter();
    }
}
```

## DTPWeb 接口介绍

```ts
/**
 * PC JavaScript 版本 LPAPI 接口的异步封装，底层基于 dtpweb 打印接口。
 */
declare class DTPWeb {
    /**
     * 接口初始化配置。
     */
    init(options?: LPA_InitOptions): void;
    /**
     * 检测插件是否可用。
     */
    checkPlugin(callback?: (success: boolean) => void): Promise<boolean>;
    /**
     * 检查指定的端口号是否可用。
     */
    checkPort(port?: number): Promise<boolean>;
    /**
     * 打开指定的打印机。
     */
    openPrinter(printer?: string | LPA_Device | undefined): Promise<boolean>;
    /**
     * 获取已连接的打印机名称。
     */
    getPrinterName(): Promise<string>;
    /**
     * 判断打印机是否已打开。
     */
    isPrinterOpened(): Promise<boolean>;
    /**
     * 关闭已经打开的打印机。
     */
    closePrinter(): Promise<boolean>;
    /**
     * 获取打印机列表。
     */
    getPrinters(options: LPA_PrinterOptions): Promise<LPA_Device[]>;
    /**
     * 获取打印相关参数。
     */
    getParam(id: LPA_ParamID): Promise<number>;
    /**
     * 设置打印参数；
     */
    setParam(options: LPA_PrintParamOptions): Promise<boolean>;
    /**
     * 获取已连接打印机的纸张类型。
     */
    getGapType(): Promise<LPA_GapType>;
    /**
     * 修改已连接打印机的纸张类型。
     */
    setGapType(value: LPA_GapType): Promise<boolean>;
    /**
     * 返回已连接打印机的打印浓度。
     */
    getPrintDarkness(): Promise<number>;
    /**
     * 修改已连接打印机的打印浓度。
     */
    setPrintDarkness(value: number): Promise<boolean>;
    /**
     * 返回已连接打印机的打印速度。
     */
    getPrintSpeed(): Promise<number>;
    /**
     * 修改已连接打印机的打印速度。
     */
    setPrintSpeed(value: number): Promise<boolean>;
    /**
     * 获取打印机的分辨率（打印机链接成功后有效）。
     */
    getPrinterDPI(): Promise<number>;
    /**
     * 创建打印任务。
     *
     * 创建打印任务时，如果没有链接打印机，则本函数会自动打开当前系统安装的第一个 LPAPI 支持的打印机，用于打印。
     * 当前还有未打印的任务，已有打印数据将会被全部丢弃。
     */
    startJob(options: LPA_JobOptions): Promise<boolean>;
    /**
     * 提交打印任务，进行真正的打印。
     */
    commitJob(options?: PrintOptions): Promise<boolean>;
    /**
     * 得到刚完成的打印任务的打印任务信息。
     */
    getPageInfo(): Promise<LPA_PageInfo>;
    /**
     * 得到刚完成的打印任务的页面图片数据。
     */
    getPageImage(options: LPA_PageImageOptions): Promise<LPA_PageImage>;
    /**
     * 开始一打印页面。
     */
    startPage(): Promise<boolean>;
    /**
     * 结束一打印页面。
     */
    endPage(): Promise<boolean>;
    /**
     * 绘制文本。
     */
    drawText(options: DrawTextOptions): Promise<boolean>;
    /**
     * 打印一维条码。
     */
    draw1DBarcode(options: DrawBarcodeOptions): Promise<boolean>;
    /**
     * 打印 QrCode 二维码。
     */
    draw2DQRCode(options: DrawQrcodeOptions): Promise<boolean>;
    /**
     * 打印 Pdf417 二维码。
     */
    draw2DPdf417(options: DrawPdf417Options): Promise<boolean>;
    /**
     * 绘制矩形框。
     *
     * @param {DrawRectOptions} options 矩形框绘制相关选项。
     */
    drawRectangle(options: DrawRectOptions): Promise<boolean>;
    /**
     * 绘制椭圆边框。
     */
    drawEllipse(options: DrawRectOptions): Promise<boolean>;
    /**
     * 绘制圆形。
     */
    drawCircle(options: DrawCircleOptions): Promise<boolean>;
    /**
     * 绘制直线。
     *
     * @param {DrawLineOptions} options 直线绘制相关选项。
     */
    drawLine(options: DrawLineOptions): Promise<boolean>;
    /**
     *  打印指定的URL图片。
     *
     * @param {DrawImageUrlOptions} options URL图片绘制相关选项。
     */
    drawImage(options: DrawImageUrlOptions): Promise<boolean>;
    /**
     * 绘制图片对象。
     *
     * @param {DrawImageDataOptions} options 图片对象绘制选项。
     */
    drawImageD(options: DrawImageDataOptions): Promise<boolean>;
    /**
     * 直接打印指定位图对象。
     *
     * @param {PrintImageOptions} options 图片打印相关选项。
     */
    printImage(options: PrintImageOptions): Promise<boolean>;
}
```

## 修改记录

## v2.1.20221212

- 底层dtpweb服务蓝牙链接相关代码升级；
- 实现了json数据打印的功能；

## v2.1.5

-   根据最新版本接口，同步更新相关接口文档。

## v2.1.4

-   接口优化。

## v2.1.3

-   接口文档优化与完善。

## v2.1.2

-   解决了 nodejs 中调用接口进行打印的时候无法打印 base64 图片的问题；

### v2.1.1

-   完善局域网打印功能；
-   接口用法及注释的完善与更新；

### v2.1.0

-   2.1 版本正式发布
