| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <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>
|