| <template> | 
|     <el-dialog v-model="state.dialogVisible" draggable :close-on-click-modal="false" :width="Number(state.width) + Number(8) + 'mm'"> | 
|         <div id="preview_content" ref="previewContentRef"></div> | 
|         <template #footer> | 
|             <el-button :loading="state.waitShowPrinter" type="primary" icon="ele-Printer" @click.stop="print">直接打印</el-button> | 
|             <el-button type="primary" icon="ele-Printer" @click.stop="toPdf">导出PDF</el-button> | 
|             <el-button key="close" @click="hideDialog"> 关闭 </el-button> | 
|         </template> | 
|     </el-dialog> | 
| </template> | 
|   | 
| <script lang="ts" setup> | 
| import { nextTick, reactive, ref } from 'vue'; | 
|   | 
| const state = reactive({ | 
|     dialogVisible: false, | 
|     waitShowPrinter: false, | 
|     width: 0, // 纸张宽 mm | 
|     printData: {}, // 打印数据 | 
|     printType: 1, // 默认浏览器打印 | 
|     printParam: { | 
|         printer: '', // 打印机名称 | 
|         title: '', // 打印任务名称 | 
|         color: false, // 是否打印颜色 默认 true | 
|         copies: 1, // 打印份数 默认 1 | 
|     }, | 
|     // 打印参数 | 
|     hiprintTemplate: {} as any, | 
| }); | 
|   | 
| const previewContentRef = ref(); | 
|   | 
| const showDialog = (hiprintTemplate: any, printData: {}, width = 210, printType = 1, printParam: { printer: ''; title: ''; color: false; copies: 1 }) => { | 
|     state.dialogVisible = true; | 
|     state.width = width; | 
|     state.hiprintTemplate = hiprintTemplate; | 
|     state.printData = printData; | 
|     state.printParam = printParam; | 
|     state.printType = printType; | 
|     nextTick(() => { | 
|         while (previewContentRef.value?.firstChild) { | 
|             previewContentRef.value.removeChild(previewContentRef.value.firstChild); | 
|         } | 
|         const newHtml = hiprintTemplate.getHtml(printData); | 
|         previewContentRef.value.appendChild(newHtml[0]); | 
|     }); | 
| }; | 
|   | 
| const print = () => { | 
|     state.waitShowPrinter = true; | 
|     // debugger; | 
|     // 判断是否已成功连接 | 
|     if (state.printType == 2) { | 
|         // 注意:连接是异步的 | 
|         // 已连接 | 
|         // 获取打印机列表 | 
|         const printerList = state.hiprintTemplate.getPrinterList(); | 
|   | 
|         let sfcz = printerList.some((item: any) => { | 
|             return item.name == state.printParam.printer; | 
|         }); | 
|         if (!sfcz) { | 
|             alert('打印机不存在'); | 
|         } else { | 
|             // 直接打印 将使用系统设置的 默认打印机 | 
|             state.hiprintTemplate.print2(state.printData, state.printParam); | 
|   | 
|             // 发送任务到打印机成功 | 
|             state.hiprintTemplate.on('printSuccess', function (e: any) { | 
|                 state.waitShowPrinter = false; | 
|             }); | 
|             // 发送任务到打印机失败 | 
|             state.hiprintTemplate.on('printError', function (e: any) { | 
|                 state.waitShowPrinter = false; | 
|                 alert('打印失败:' + e); | 
|             }); | 
|         } | 
|     } else { | 
|         state.hiprintTemplate.print( | 
|             state.printData, | 
|             {}, | 
|             { | 
|                 callback: () => { | 
|                     state.waitShowPrinter = false; | 
|                 }, | 
|             } | 
|         ); | 
|     } | 
| }; | 
|   | 
| const toPdf = () => { | 
|     state.hiprintTemplate.toPdf(state.printData, 'PDF文件'); | 
| }; | 
|   | 
| const hideDialog = () => { | 
|     state.dialogVisible = false; | 
| }; | 
|   | 
| defineExpose({ showDialog }); | 
| </script> | 
|   | 
| <style lang="less" scoped> | 
| :deep(.ant-modal-body) { | 
|     padding: 0px; | 
| } | 
|   | 
| :deep(.ant-modal-content) { | 
|     margin-bottom: 24px; | 
| } | 
| </style> |