首页 > 其他分享 >vue使用hiprint实现打印(vue-plugin-hiprint)

vue使用hiprint实现打印(vue-plugin-hiprint)

时间:2023-07-18 16:56:01浏览次数:39  
标签:hiprint vue name plugin svg require defaultModule id

1、安装插件:

npm install vue-plugin-hiprint

  或

yarn add vue-plugin-hiprint

  

2、普通使用:

<template>
  <div class="box">
    <div class="box-tool">
      <el-button-group>
        <el-button type="primary" @click="print">浏览器打印</el-button>
        <el-button type="primary" @click="exportJson">导出JSON</el-button>
      </el-button-group>
    </div>
    <div class="box-content">
      <el-row :gutter="10">
        <el-col :xs="24" :sm="5" :md="5" :lg="5" :xl="5">
          <el-card class="box-content-card">
            <template #header>
              <div class="card-header">
                <span>基础工具</span>
              </div>
            </template>
            <div class="box-content-left">
              <div
                class="box-content-left-item ep-draggable-item"
                v-for="(item, index) in baseTools"
                :key="index"
                :tid="item.tid"
              >
                <el-image
                  style="width: 40px; height: 40px"
                  :src="item.icon"
                  fit="cover"
                />
                <p>{{ item.name }}</p>
              </div>
            </div>
          </el-card>
          <el-card class="box-content-card">
            <template #header>
              <div class="card-header">
                <span>辅助工具</span>
              </div>
            </template>
            <div class="box-content-left">
              <div
                class="box-content-left-item ep-draggable-item"
                v-for="(item, index) in assistTools"
                :key="index"
                :tid="item.tid"
              >
                <el-image
                  style="width: 40px; height: 40px"
                  :src="item.icon"
                  fit="cover"
                />
                <p>{{ item.name }}</p>
              </div>
            </div>
          </el-card>
        </el-col>
        <el-col :xs="24" :sm="14" :md="14" :lg="14" :xl="14">
          <el-card class="box-content-card box-content-center">
            <div id="hiprint-printTemplate"></div>
          </el-card>
        </el-col>
        <el-col :xs="24" :sm="5" :md="5" :lg="5" :xl="5">
          <el-card class="box-content-card box-content-right">
            <div id="PrintElementOptionSetting"></div>
          </el-card>
        </el-col>
      </el-row>
    </div>
  </div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import { hiprint, defaultElementTypeProvider } from "vue-plugin-hiprint";
// 初始化 provider
hiprint.init({
  providers: [defaultElementTypeProvider()],
});
/**
 * 这里必须要在 onMounted 中去构建 左侧可拖拽元素 或者 设计器
 * 因为都是把元素挂载到对应容器中, 必须要先找到该容器
 */
onMounted(() => {
  buildLeftElement();
  buildDesigner();
});
/**
 * 构建左侧可拖拽元素
 * 注意: 可拖拽元素必须在 hiprint.init() 之后调用
 * 而且 必须包含 class="box-content-left-item" 否则无法拖拽进设计器
 */
const buildLeftElement = () => {
  hiprint.PrintElementTypeManager.buildByHtml($(".ep-draggable-item"));
};
/**
 * 构建设计器
 * 注意: 必须要在 onMounted 中去构建
 * 因为都是把元素挂载到对应容器中, 必须要先找到该容器
 */
let hiprintTemplate;
const buildDesigner = () => {
  $("#hiprint-printTemplate").empty(); // 先清空, 避免重复构建
  hiprintTemplate = new hiprint.PrintTemplate({
    settingContainer: "#PrintElementOptionSetting", // 元素参数容器
  });
  // 构建 并填充到 容器中
  hiprintTemplate.design("#hiprint-printTemplate");
};

/**
 * 浏览器打印
 */
const print = () => {
  // 打印数据,key 对应 元素的 字段名
  let printData = { name: "CcSimple" };
  // 参数: 打印时设置 左偏移量,上偏移量
  let options = { leftOffset: -1, topOffset: -1 };
  // 扩展
  let ext = {
    callback: () => {
      console.log("浏览器打印窗口已打开");
    },
    styleHandler: () => {
      // 重写 文本 打印样式
      return "<style>.hiprint-printElement-text{color:red !important;}</style>";
    },
  };
  // 调用浏览器打印
  hiprintTemplate.print(printData, options, ext);
};

const baseTools = ref([
  {
    id: 1,
    name: "文本",
    tid: "defaultModule.text",
    icon: require("@/assets/svg/文本.svg"),
  },
  {
    id: 2,
    name: "图片",
    tid: "defaultModule.image",
    icon: require("@/assets/svg/图片.svg"),
  },
  {
    id: 3,
    name: "多行文本",
    tid: "defaultModule.longText",
    icon: require("@/assets/svg/多行文本.svg"),
  },
  {
    id: 4,
    name: "内容表格",
    tid: "defaultModule.table",
    icon: require("@/assets/svg/内容表格.svg"),
  },
  {
    id: 5,
    name: "空表格",
    tid: "defaultModule.emptyTable",
    icon: require("@/assets/svg/表格.svg"),
  },
  {
    id: 6,
    name: "html",
    tid: "defaultModule.html",
    icon: require("@/assets/svg/html.svg"),
  },
  {
    id: 7,
    name: "自定义文本",
    tid: "defaultModule.customText",
    icon: require("@/assets/svg/文本.svg"),
  },
]);

const assistTools = ref([
  {
    id: 1,
    name: "横线",
    tid: "defaultModule.hline",
    icon: require("@/assets/svg/横线.svg"),
  },
  {
    id: 2,
    name: "竖线",
    tid: "defaultModule.vline",
    icon: require("@/assets/svg/竖线.svg"),
  },
  {
    id: 3,
    name: "矩形",
    tid: "defaultModule.rect",
    icon: require("@/assets/svg/矩形.svg"),
  },
  {
    id: 4,
    name: "椭圆",
    tid: "defaultModule.oval",
    icon: require("@/assets/svg/椭圆.svg"),
  },
]);

/**
 * @description: 导出json
 * @return {*}
 */
const exportJson = () => {
  if (hiprintTemplate) {
    down(`JSON数据_${Date.now()}`, JSON.stringify(hiprintTemplate.getJson() || {}));
  }
};

const down = (filename, text) => {
  var pom = document.createElement("a");
  pom.setAttribute(
    "href",
    "data:text/plain;charset=utf-8," + encodeURIComponent(text)
  );
  pom.setAttribute("download", filename);
  if (document.createEvent) {
    var event = document.createEvent("MouseEvents");
    event.initEvent("click", true, true);
    pom.dispatchEvent(event);
  } else {
    pom.click();
  }
};
</script>

<style lang="scss" scoped>
.box {
  width: 100%;

  &-tool {
    padding: 20px;
  }

  &-content {
    width: 98%;
    margin: 0 auto;
    &-card {
      margin-bottom: 20px;
    }

    &-left {
      display: flex;
      flex-wrap: wrap;

      &-item {
        width: 23%;
        background: white;
        padding: 4px 10px;
        margin-right: 10px;
        text-align: center;
        border-radius: 4px;
        box-shadow: 2px 2px 2px 2px rgba(171, 171, 171, 0.2);
        margin-bottom: 20px;
      }
    }

    &-center {
      height: calc(100vh - 100px);
      padding: 10px;
      overflow: auto;
    }
  }
}
</style>

 

标签:hiprint,vue,name,plugin,svg,require,defaultModule,id
From: https://www.cnblogs.com/zaijin-yang/p/17563449.html

相关文章

  • vue v-if 和v-permission 共同使用的奇怪问题
    背景后台系统某功能按钮需要订单状态和用户权限共同校验是否显示,将权限校验和v-if共同作用在同一div中,下方为实例代码<divv-if="status==0"><div@click="function1">某按钮功能</div></div><divv-if="status==1"v-permission="['admin......
  • antd+vue3 tree-select 组件库 筛选结果不正确的问题
    第一次遇到这种带搜索框的下拉树状列表搜索关键字的时候出现我不想要的结果。我感觉组件它只是搜索一级列表而没有搜索二级列表,然后一节列表把它整个的二级列表带出来了。二级列表里边包含搜索关键字的所有item才是我想要的。相关代码:1<!--页面名称-->2<div......
  • vue 小写转大写方法
    好久好久没更新了啊,其实有好多可以写的,但是不知道为啥不想写了方法一://输入的金额进行大写转换functiontransformation(val){varfraction=["角","分"];vardigit=["零","壹","贰","叁","肆","伍","陆"......
  • vue前端项目启动
    我们拉取了一个前端项目后,如果项目中有说明的文档,可以参照文档的步骤启动项目,如果项目中没有说明文档,那我们可以按照以下的步骤启动项目1、首先是安装依赖包npminstall 2、启动项目npmrundev这里的npmrun环境名称,这里的环境名称主要取决于项目中的package.json文件中......
  • vue学习——分析脚手架
        ......
  • npm安装教程 搭建vue
    一、相关概念npm:Nodejs下的包管理器。webpack:它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的合并和打包。vue-cli:用户生成Vue工程模板。(帮你快速开始一个vue的项目,也就是给你一套vue的结构,包含基础的依赖库,只需要npminstall......
  • 介绍社交论坛问答发帖系统源码-java+vue+uniapp开发前后端
    前后端分离社交论坛问答发帖BBS源码,社交论坛小程序|H5论坛|,app论坛是java+vue+uniapp开发的前后端分离社交论坛问答发帖/BBS项目,包括论坛图文帖,视频,圈子,IM私聊,微信支付,付费贴,积分签到,钱包充值等论坛小程序论坛app完整功能演示地址:www.runruncode.com/java/19462.html ......
  • 前端Vue仿微信我的菜单栏组件按钮组件
    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随意的进行组合。大大提升开发效率......
  • vue--day27---vue生命周期1
              beforeCreate:数据监测、数据代理创建之前在实例初始化之后,数据监测、数据代理创建之前被调用,此时无法通过VM访问data中的数据、methods中的方法。created:数据监测、数据代理创建之后实例已经创建完成之后被调用,在这一步,实例已完成以下配......
  • 浅析vue3中如何使用动态组件、如何快速理解Vue3的 toRaw和markRaw、ref与shallowRef、
    一、Vue3中使用component:is加载动态组件1、不使用setup语法糖,这种方式和vue2差不多,is可以是个字符串2、使用setup语法糖,这时候的is如果使用字符串就会加载不出来,得使用组件实例<componentclass="task-box":is="componentObj[route.params.type]":info="taskInfo"></co......