更新记录
1.1.0(2026-07-14)
- 初始版本,基于 HP print-core 2.1.5 + common-lib 1.0.0.4(方案 1 - API)封装。
- 支持打印机搜索(局域网 / USB)、按 IP 添加打印机、刷新打印机状态。
- 支持系统文件选择器选择 PDF / Word 文件并打印。
- 支持传入 content Uri 或本地文件绝对路径打印(用于网络文件下载后打印)。
- 支持打印任务状态监听与取消打印任务。
平台兼容性
uni-app(4.81)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | Android插件版本 | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | 5.0 | 1.1.0 | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.82)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
hl-hp-print
惠普打印机 UniApp 原生插件(UTS)。把惠普官方 Android SDK 封装成前端可直接调用的接口,用来搜索打印机、选文件、发起打印。
| 项目 | 说明 |
|---|---|
| 平台 | 仅 Android(minSdkVersion 21) |
| 框架 | uni-app(Vue) |
目录
1. 写在前面:你需要知道的 3 件事
第一:只能用自定义基座
正确做法:HBuilderX → 运行 → 运行到手机或模拟器 → 制作自定义调试基座 → 再用「运行到自定义基座」。
第二:必须先选中打印机,才能打印
流程固定为:
初始化 → 搜索/添加打印机 → 选中一台 → 选文件 → 打印
少任何一步都不行。
第三:优先用 PDF
惠普 SDK 官方明确支持 PDF、JPEG。Word(.doc / .docx)可以选,但不保证一定能打。业务上建议先转成 PDF。
2. 能做什么
- 搜索局域网 / USB 打印机
- 按 IP 手动添加打印机
- 查看并刷新打印机状态(空闲、打印中、停止、离线等)
- 用系统文件选择器选本地 PDF / Word
- 支持网络文件:下载后打印,结束后删临时文件
- 自定义打印参数(颜色、纸张、方向、单双面、DPI、页码范围等)
- 文件预览(按页生成图片)
- 打印任务状态监听与取消
- 打印历史查询与清理
- 唤醒打印机、USB 重检、导出 SDK 日志
3. 运行前准备
环境要求
- HBuilderX 3.6.8 及以上
- Android 真机(建议 Android 7.0+)
- 手机与惠普打印机在同一 Wi‑Fi,或 USB / OTG 直连
插件位置
插件已在工程 uni_modules/hl-hp-print 中,页面里这样引入:
import * as HpPrint from '@/uni_modules/hl-hp-print'
制作自定义基座(必做)
- 用 HBuilderX 打开本工程
- 菜单:运行 → 运行到手机或模拟器 → 制作自定义调试基座
- 等待云端/本地打包完成,并安装到手机
- 之后一律选择:运行到自定义基座
改了插件原生代码、换了 AAR、或首次接入本插件,都需要重新打基座。
4. 5 分钟跑通 Demo
工程里已有 Demo 页面:pages/hp-print-demo/index.vue。
推荐操作顺序
进入 Demo(自动初始化)
→ 点「开始搜索」,或输入 IP 点「添加」
→ 在列表里点选一台打印机
→ 选「本地文件」→ 选一份 PDF
→(可选)点「获取可用参数」再调参数
→ 点「打印本地文件」
→ 在「打印任务」看状态,完成后到「打印历史」点「刷新」
5. 业务接入:最短代码
下面这段是最小可跑通逻辑,适合理解调用顺序:
import * as HpPrint from '@/uni_modules/hl-hp-print'
import { onMounted, onUnmounted } from 'vue'
onMounted(() => {
// 1. 必须先初始化
HpPrint.initSDK()
HpPrint.setLog(true, true)
// 2. 搜索打印机
HpPrint.startDiscovery((list) => {
if (list.length == 0) return
const printerId = list[0].id
// 3. 选文件
HpPrint.pickFile((file) => {
if (file == null) return
// 4. 打印(第 4 个参数是对象,不是数字)
HpPrint.print(printerId, file.uri, file.name, { copies: 1 }, (job) => {
console.log('状态:', job.state, job.reasons)
})
})
})
})
onUnmounted(() => {
HpPrint.stopDiscovery()
HpPrint.stopPreview()
HpPrint.release()
})
6. 常见业务示例
6.1 本地文件打印(可带参数)
HpPrint.pickFile((file) => {
if (file == null) return
// 可选:先查这台打印机对这个文件支持哪些参数
HpPrint.getSupportedOptions(printerId, file.uri, (opts) => {
const options = {
copies: 1,
color: opts != null ? opts.defaults.color : undefined,
mediaSize: opts != null ? opts.defaults.mediaSize : undefined,
pageRanges: '1-2' // 仅 PDF 有效,例如打印第 1-2 页
}
HpPrint.print(printerId, file.uri, file.name, options, (job) => {
console.log('打印状态', job.state, job.reasons)
})
})
})
说明:
color、mediaSize等字符串,请从getSupportedOptions返回列表里选,不要随意手写- 不调用
getSupportedOptions也可以打印,插件会用 SDK 默认值
6.2 网络文件下载后打印
uni.downloadFile({
url: 'https://example.com/demo.pdf',
success: (res) => {
if (res.statusCode != 200) return
// 转成原生能读的绝对路径
const absPath = plus.io.convertLocalFileSystemURL(res.tempFilePath)
HpPrint.print(printerId, absPath, 'demo.pdf', { copies: 1 }, (job) => {
console.log('打印状态', job.state)
// 任务结束后删除临时文件,避免占空间
const endStates = ['Completed', 'Aborted', 'Canceled', 'Error']
if (endStates.indexOf(job.state) >= 0) {
plus.io.resolveLocalFileSystemURL(res.tempFilePath, (entry) => {
entry.remove(() => {
console.log('临时文件已删除')
})
})
}
})
}
})
6.3 按 IP 添加打印机
适合搜不到、但你知道打印机 IP 的情况:
HpPrint.addPrinterByIp('192.168.1.100', (printer) => {
if (printer == null) {
console.log('未找到该 IP 的打印机')
return
}
console.log('已添加', printer.name, printer.id)
})
7. API 说明
调用规则:
- 任何能力之前先调
initSDK() - 打印前先拿到并保存
printerId - 页面销毁时调用
release()(建议同时stopDiscovery/stopPreview)
7.1 初始化与日志
| 方法 | 说明 |
|---|---|
initSDK() |
初始化 SDK,必须最先调用 |
setLog(enableLog, saveFile) |
控制台日志 / 是否写本地文件。要导出日志时,saveFile 需为 true |
exportLog(callback) |
导出日志文件路径 |
release() |
释放资源,页面卸载时调用 |
HpPrint.initSDK()
HpPrint.setLog(true, true)
HpPrint.exportLog((path) => {
console.log('日志路径', path)
})
7.2 打印机发现与状态
| 方法 | 说明 |
|---|---|
startDiscovery(onPrinters) |
开始搜索,列表变化会持续回调完整列表 |
stopDiscovery() |
停止搜索 |
refreshPrinterList() |
刷新列表 |
addPrinterByIp(ip, callback) |
按 IP 添加,找不到时回调 null |
refreshPrinter(printerId, callback) |
刷新单台状态,离线时回调 null |
wakeUp(printerId) |
唤醒休眠中的打印机 |
reCheckUSB() |
重新检测 USB 打印机 |
HpPrint.startDiscovery((printers) => {
printers.forEach((p) => {
console.log(p.name, p.ip, p.statusName, '可打印:', p.isReady)
})
})
HpPrint.refreshPrinter(printerId, (printer) => {
if (printer != null && printer.isReady) {
console.log('打印机就绪')
}
})
7.3 选文件与打印
| 方法 | 说明 |
|---|---|
pickFile(callback) |
系统文件选择器,返回 content:// Uri |
getSupportedOptions(printerId, fileUri, callback) |
查询可用打印参数 |
print(printerId, fileUri, fileName, options, onJob) |
发起打印,任务状态会多次回调 |
cancelPrintJob(printerId, jobId) |
取消任务 |
print 的第 4 个参数是 对象 HpPrintOptions,不是数字。
HpPrint.print(printerId, fileUri, fileName, {
copies: 1,
color: 'Color',
mediaSize: 'A4',
sides: 'OneSided',
pageRanges: '1-3,5',
pdfEnhancement: false
}, (job) => {
console.log(job.jobId, job.state, job.reasons)
})
任务状态常见值:
| state | 含义 |
|---|---|
| Pending | 等待中 |
| Processing | 打印中 |
| Completed | 已完成 |
| Canceled | 已取消 |
| Aborted | 已中止 |
| Error | 失败(插件侧错误或打印机未就绪等) |
7.4 打印历史
| 方法 | 说明 |
|---|---|
getJobHistory(callback) |
查询本地历史 |
clearJobHistory(callback) |
清除已完成记录,并返回剩余列表 |
插件在 initSDK 时已默认开启历史记录。
7.5 文件预览
| 方法 | 说明 |
|---|---|
startPreview(printerId, fileUri, callback) |
开始预览,返回页数等信息 |
getPreviewPage(pageIndex, callback) |
取某一页图片路径,pageIndex 从 0 开始 |
stopPreview() |
停止并释放预览资源 |
HpPrint.startPreview(printerId, fileUri, (info) => {
if (info == null) return
for (let i = 0; i < info.pageCount; i++) {
HpPrint.getPreviewPage(i, (path) => {
console.log('第' + (i + 1) + '页', path)
})
}
})
8. 数据类型
打印机 HpPrinterInfo
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 打印机唯一 ID,后续接口都用它 |
| name | string | 名称 |
| ip | string | IP,USB 打印机可能为空 |
| status | string | 状态原始值,如 Idle / Processing / Stopped / Offline |
| statusName | string | 状态描述(可能含原因) |
| isReady | boolean | 是否可打印(Idle / Processing 时一般为 true) |
打印任务 HpPrintJobInfo
| 字段 | 类型 | 说明 |
|---|---|---|
| jobId | string | 任务 ID |
| state | string | 任务状态 |
| reasons | string | 原因说明 |
选中的文件 HpPickedFile
| 字段 | 类型 | 说明 |
|---|---|---|
| uri | string | content:// 地址,可直接传给 print |
| name | string | 文件名 |
| size | number | 字节数,未知时为 0 |
| mimeType | string | MIME 类型 |
打印参数 HpPrintOptions
均为可选。未传的项由 SDK 按支持列表取默认值。
| 字段 | 类型 | 说明 |
|---|---|---|
| copies | number | 份数,默认 1 |
| color | string | 颜色模式:Color 彩色,Monochrome 黑白(也可传 Grayscale,插件会自动匹配) |
| mediaSize | string | 纸张尺寸,如 A4 |
| paperType | string | 纸张类型 |
| printType | string | 打印类型(会影响可选 DPI) |
| orientation | string | 方向 |
| sides | string | 单双面 |
| inputTray | string | 进纸盒 |
| scale | string | 缩放 |
| quality | string | 质量 |
| dpi | number | 分辨率 |
| mediaMargin | number | 页边距 |
| pageRanges | string | 页码范围,如 1-3,5,仅 PDF |
| pdfEnhancement | boolean | PDF 打印增强 |
可用参数 HpSupportedOptions
由 getSupportedOptions 返回,包含各字段候选数组,以及 defaults(默认值)和 maxCopies。
历史任务 HpHistoryJob
含 jobId、jobName、printerId、printerName、state、createTime、isDone 等字段。
预览信息 HpPreviewInfo
| 字段 | 类型 | 说明 |
|---|---|---|
| pageCount | number | 总页数 |
| ratio | number | 宽高比 |
9. 常见问题
一进页面就报 CoreManager 找不到?
没有用包含本插件的自定义基座。重新制作自定义调试基座后再运行。
搜索不到打印机?
- 确认手机与打印机同一 Wi‑Fi(不要用访客网络)
- 路由器是否开启了 AP 隔离
- 改用「按 IP 添加」
SDK 常用端口:631/TCP、8080/TCP、80/TCP、443/TCP、5353/UDP。
点打印提示请先选择打印机?
必须先在列表中点选一台,顶部「当前打印机」有内容后才能打印。
Word 文件打印失败?
SDK 稳定支持 PDF / JPEG。Word 不保证成功,建议转 PDF 再打。
获取可用参数失败?
需要同时满足:已选打印机 + 已有本地文件 Uri。网络打印可先下载到本地再取参数,或直接用默认参数打印。
打印历史一直是空的?
先成功打过至少一单。initSDK 已默认开启历史记录。
打印机显示未就绪?
点该打印机刷新状态。仅 Idle / Processing 允许打印。休眠时可先点「唤醒」。

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 276
赞赏 2
下载 12429338
赞赏 1934
赞赏
京公网安备:11010802035340号