Newer
Older
VueSharedPrinting / src / views / selectFile.vue
hanfei on 8 Jan 2024 17 KB han
<template>
  <!--  选取资料-->
  <div class="selectFile">
    <navbar :name="name" />
    <!--    U盘打印-->
    <div class="box flex-center" v-if="name == 'U盘打印'">
      <div class="tip">
        <div class="title">温馨提示</div>
        <div class="content">请在右侧文件浏览区,找到文件存放的目录/文件夹,然后点选您要打印的文件,之后按下“确认资料”按钮。</div>
      </div>
      <div class="file tip2">
        <div class="main">
          <div v-for="(item, index) in UpFile" v-bind:key="index" class="flex-between li">
            <div class="name">{{ item.name }}</div>
            <span @click="onCancel(index, 'UpFile')">删除</span>
          </div>
        </div>
        <div class="flex-between but">
          <div class="btn flex-center">
            选择文件
            <input type="file" @change="handleFileChange" />
          </div>
          <div class="btn flex-center" @click="skip('argument', name)">确认资料</div>
        </div>
      </div>
    </div>
    <!--    扫描打印-->
    <div class="box flex-center" v-if="name == '扫描打印'">
      <div class="file2">
        <div class="title">已完成扫描的版面</div>
        <div class="main flex-between">
          <div class="smfyData">
            <div v-for="(item, index) in imgList" v-bind:key="index" :class="['flex-center', { act: smfyIndex == index }]" @click="onChange(index, 'smfyIndex')">
              <div class="name">{{ index + 1 }}</div>
              <span @click="onCancel(index, 'imgList')">删除</span>
            </div>
          </div>
          <img :src="imgList[smfyIndex]" alt="" style="width: 25rem; height: 100%" />
        </div>
      </div>
      <div class="tip tip2">
        <div class="title">温馨提示</div>
        <div class="content">
          已经扫描好的页面显示在左边的列表中,您可以点击列表中的缩略图进行核对,有不满意的请点旁边的“X”进行移除并重新扫描。如果有文件需要继续扫描,请按要求放置好资料后,按“继续扫描”。
          按照刚才的方法,重复扫描过程,直到完成了所有需要的页面。核对无误后,可以按“完成扫描”结束资料扫描过程。
        </div>
        <div class="flex-between but">
          <div class="btn flex-center" @click="paiz()">继续扫描</div>
          <div class="btn flex-center" @click="skip('argument', name)">完成扫描</div>
        </div>
      </div>
    </div>
    <!--    身份证打印-->
    <div class="box flex-center" v-if="name == '身份证打印'">
      <div class="file2 file3" style="margin-right: 20rem">
        <div class="title">请核对您的信息</div>
        <div class="card" ref="captureArea" v-if="cardInfo!=''">
          <div class="card-box">
            <img src="../assets/card2.png" alt="身份证反面" />
            <div class="card-name">{{ cardInfo.name }}</div>
            <div class="card-gender">
              {{ cardInfo.xbmc }}<span>{{ cardInfo.mzmc }}</span>
            </div>
            <div class="card-birth">
              {{ cardInfo.birthday | joinYear }}
              <span class="month">{{ cardInfo.birthday | joinMonth }}</span>
              <span class="day">{{ cardInfo.birthday | joinDay }}</span>
            </div>
            <div class="card-addr">
              {{ cardInfo.address }}
            </div>
            <div class="card-id">{{ cardInfo.idNum }}</div>
            <div class="card-avatar">
              <img :src="'data:image/png;base64,'+cardInfo.photo" alt="" />
            </div>
          </div>
          <div class="card-box">
            <img src="../assets/card1.png"/>
            <div class="card-sign">{{ cardInfo.issueOrg  }}</div>
            <div class="card-date">
              {{ cardInfo.effectDate | joinRq}} - {{ cardInfo.expireDate | joinRq}}
            </div>
          </div>
        </div>
      </div>
      <div class="tip">
        <div class="title">温馨提示</div>
        <div class="content">身份证件信息读取成功,请您核对个人信息无误后,按“信息无误,继续”按钮进行后续操作。此时您可以取回您的身份证卡片并妥善保存。</div>
        <div class="btn flex-center" @click="skip('argument', name)">信息无误,继续</div>
<!--        <div class="btn flex-center" @click="dayin()">打印</div>-->
      </div>
    </div>
  </div>
</template>

<script>
import navbar from "@/components/nav";
import html2canvas from "html2canvas";
import bdRequest from "../utils/bdRequest";
import { upload2Pdf } from '@/api/resultApi'
import parseCardWzxx from "../utils/mz";
export default {
  name: 'selectFile',
  components: {
    navbar
  },
  provide() {
    return {
      title: this.tit,
      type: this.name
    }
  },
  filters: {
    joinYear(val) {
      return val.substring(0, 4)
    },
    joinMonth(val) {
      return val.substring(4, 6)
    },
    joinDay(val) {
      return val.substring(6, 8)
    },
    joinRq(val) {
      return val.substring(0, 4)+'.'+val.substring(4, 6)+'.'+val.substring(6, 8)
    }
  },
  data() {
    return {
      tit: this.$route.params.name == 'U盘打印' ? '资料选取提交' : '资料扫描提交',
      name: this.$route.params.name,
      path: this.cite.inWebURL,
      socket: '',
      imgList: [],
      smfyIndex: 0,

      UpFile: [],

      cardInfo: '',
    };
  },
  methods: {
    async uploadImg(data,sta) {
      let _this= this
      for (let i = 0; i < data.length; i++) {
        let formData = new FormData()
        let file = data[i]
        if(sta){
          let dataURL = file.toDataURL('image/png')
          let name = 'sfz.png'
          file = _this.dataURLtoFile(dataURL, name)
        }
        formData.append('file', file) // 使用数组语法添加多个文件
        let res = await upload2Pdf(formData)
        _this.cite.selectedFile.push(res.data)
        // console.log('打印文件',this.cite.selectedFile)
      }

    },
    async skip(href, name) {
      if(this.UpFile.length>0) {
        await this.uploadImg(this.UpFile,false)
      }else if(this.imgList.length>0) {
        await this.uploadImg(this.imgList,true)
      }else if(this.cardInfo) {
        await this.captureAndDownload()
      }
      this.$router.push({
        name: href,
        params: {
          name: name
        }
      })
    },
    async captureAndDownload() {
      const captureArea = this.$refs.captureArea

      // 使用 html2canvas 将区域内容生成为图片
      const canvas = await html2canvas(captureArea)

      // 将 canvas 转为图片 URL
      // const imageUrl = canvas.toDataURL('image/png')
      const dataURL = canvas.toDataURL('image/png')
      const name = 'sfz.png'
      const file = this.dataURLtoFile(dataURL, name)
      this.uploadImg([file],false)
      // let formData = new FormData()
      // formData.append('file', file)
      // upload2Pdf(formData).then(res => {
      //   console.log(res)
      // })
      // 调用接口上传图片

      // 创建一个下载链接
      // const downloadLink = document.createElement("a");
      // downloadLink.href = imageUrl;
      // downloadLink.download = "captured_image.png";

      // 模拟点击下载链接
      // downloadLink.click();
    },
    dataURLtoFile(dataURL, filename) {
      const arr = dataURL.split(',')
      const mime = arr[0].match(/:(.*?);/)[1]
      const bstr = atob(arr[1])
      let n = bstr.length
      const u8arr = new Uint8Array(n)
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
      }
      return new File([u8arr], filename, { type: mime })
    },
    onChange(index, name) {
      this[name] = index
    },
    onCancel(index, name) {
      this[name].splice(index, 1)
    },
    paiz() {
      this.socket.send('Capture@2')
    },
    init: function () {
      if (typeof WebSocket === 'undefined') {
        alert('您的浏览器不支持socket')
      } else {
        // 实例化socket
        this.socket = new WebSocket(this.path)
        // 监听socket连接
        this.socket.onopen = this.open
        // 监听socket错误信息
        this.socket.onerror = this.error
        // 监听socket消息
        this.socket.onmessage = this.getMessage
      }
    },
    open: function () {
      // console.log("socket连接成功")
      this.socket.send('OpenIdCardEx@0')
      this.socket.send('OpenDevice@1')
      this.socket.send('SetResolution@2@2592@1944')
      this.socket.send('OpenVideo')
      this.socket.send('RotateRight')
      this.socket.send('Deskew')
    },
    error: function () {
      console.log('连接错误')
    },
    getMessage: function (msg) {
      if (typeof msg.data == 'string') {
        if (msg.data.indexOf('GetDevCount') == 0) {
          let s = msg.data.substring(12)
          if ('1' == s || '2' == s) {
            //如果是双摄像头 那就需要判断 s = 2;表示当前是连接了2个设备
            alert('检测到已经连接上摄像头')
          }
        } else if (msg.data.indexOf('Capture') == 0) {
          let s = msg.data.substring(8)
          if (s) {
            this.imgList.push('data:image/jpeg;base64,' + s)
          }
        } else if (msg.data.indexOf('MoveDetectEvent') == 0) {
          this.socket.send('Capture@2')
        } else if (msg.data.indexOf('IdCardEvent') == 0) {
          this.socket.send('UnFaceDetect')
        } else if (msg.data.indexOf('ReadIdCard') == 0) {
          let s = msg.data.substring(11)
          if ('1' == s) {
            this.socket.send('GetIdCardResult@||')
            this.socket.send('GetIdCardImage@2')
          }
        } else if (msg.data.indexOf('GetIdCardResult') == 0) {
          let s = msg.data.substring(16)

          let info = document.getElementById('info')
          info.value = s
        } else if (msg.data.indexOf('GetBarcode') == 0) {
          // alert(msg.data);
          let s = msg.data.substring(11)

          let info = document.getElementById('info')
          info.value = s
        } else if (msg.data.indexOf('GetIdCardImage') == 0) {
          let s = msg.data.substring(15)
          let arr = s.split('#')
          let faceImg = arr[0]

          let myimg = document.getElementById('myCanvas3')
          myimg.src = 'data:image/jpeg;base64,' + faceImg
        } else if (msg.data.indexOf('GetBase64') == 0) {
          let s = msg.data.substring(10)

          let myimg = document.getElementById('myCanvas2')
          myimg.src = 'data:image/jpeg;base64,' + s
          alert(s)
        } else if (msg.data.indexOf('GetRecognitionFromFileName') == 0) {
          let s = msg.data.substring(27)

          let info = document.getElementById('info')
          info.value = s
        } else if (msg.data.indexOf('GetOcrFromFileName') == 0) {
          let s = msg.data.substring(19)

          let info = document.getElementById('info')
          info.value = s
        } else if (msg.data.indexOf('GetDogSN') == 0) {
          let s = msg.data.substring(11)

          let info = document.getElementById('info')
          info.value = s
        }
      } else {
        let reader = new FileReader()

        reader.onload = function (msg) {
          if (msg.target.readyState == FileReader.DONE) {
            // let url = msg.target.result;
            // document.getElementById('myCanvas').src = url;
          }
        }

        reader.readAsDataURL(msg.data)
      }
    },
    close: function () {
      // console.log("socket已经关闭")
      this.socket.close()
      this.socket = ''
    },

    handleFileChange(event) {
      let file = event.target.files[0]
      if (file) {
        this.UpFile.push(file)
      }
    },

    // 获取身份证信息
    async sfzCard() {
      let _this = this
      let res = await bdRequest({
        method: 'get',
        url: '/api/readCard',
        post: '7846'
      })
      if (res.errorMsg == 'OK') {
        _this.cardInfo = parseCardWzxx(res.resultContent)
        // console.log(_this.cardInfo)
      }
    },
    dayin() {
      let _this = this
      let formData = new FormData()
      for (let i = 0; i < this.UpFile.length; i++) {
        formData.append('file', _this.UpFile[i]) // 使用数组语法添加多个文件
      }
      let res = bdRequest({
        method: 'post',
        url: '/api/Printer/Print',
        post: '8080',
        data: {
          "PrinterName": "EPSON WF-CS890 Series",
          "SourceFile": 'http://192.168.250.29:8888/file/download/586791502543600.pdf',
          "FileType": "pdf",
          "PrintColor": "",
          "DblPrt": ""
        }
      })
      console.log(res)
      // upload2Pdf(formData).then(re => {
      //
      // })

    },
  },
  destroyed() {
    // 销毁监听
    if(this.socket) {
      this.close()
    }
  },
  mounted() {
    this.cite.selectedFile = []
    if (this.$route.params.name == "扫描打印") {
      this.init();
    }else if(this.$route.params.name == "身份证打印") {
      this.sfzCard()
    }
  }
}
</script>

<style scoped lang="less">
@font-face {
  font-family: 'STHeiti';//自定义字体名字
  src: url('../assets/typeface/STHeiti.ttf') format('truetype');//定义好文件的相对地址
}
.selectFile {
  .box {
    width: 114.06rem;
    height: 42.13rem;
    background: #ffffff;
    box-shadow: 0rem 0.31rem 0.63rem 0.06rem rgba(0, 0, 0, 0.14);
    border-radius: 1.63rem;
    margin: 0 auto;
    .tip {
      //margin-right: 15.31rem;
      width: 37rem;
      font-size: 2.25rem;
      font-weight: bold;
      color: #323232;
      line-height: 3rem;
      .title {
        font-size: 2.88rem;
        font-weight: bold;
        color: #d41212;
        line-height: 4.06rem;
      }
      .content {
        margin: 3rem auto 59px;
        text-align: center;
      }
    }
    .file {
      margin-left: 9.69rem;
      .main {
        width: 31.63rem;
        height: 26.56rem;
        background: #ffffff;
        border: 0.06rem solid #707070;
        margin: 0 auto 2.81rem;
        padding: 2rem 0;
        overflow-y: scroll;
        .li {
          width: 80%;
          margin: 0 auto;
          padding-bottom: 1rem;
          span {
            text-decoration: underline;
            cursor: pointer;
          }
        }
      }
    }
    .tip2 {
      width: 52rem;
      .but {
        .btn {
          width: 24.44rem;
          position: relative;
          input {
            position: absolute;
            width: 100%;
            height: 100%;
            top: 0;
            left: 0;
            opacity: 0;
          }
        }
      }
    }
    .file2 {
      margin-right: 9.69rem;
      .title {
        font-size: 2.13rem;
        font-weight: bold;
        color: #323232;
        line-height: 3rem;
        text-align: left;
      }
      .main {
        width: 39.81rem;
        height: 31.31rem;
        background: #eeeeee;
        margin: 1.38rem auto 0;
      }
      .card {
        width: 42.81rem;
        height: 35.31rem;
        display: flex;
        flex-direction: column;
        justify-content: space-around;
        align-items: flex-end;
        font-family: 'STHeiti', Heiti, sans-serif;//使用自己自定义的名字
        .card-box {
          width: 25rem;
          height: 15rem;
          margin-right: 5rem;
          position: relative;
          font-weight: bold;
          font-size: .8rem;
          line-height: 1rem;
          .card-title {
            padding: 1rem 0;
          }
          img {
            width: 25rem;
          }
          .card-sign {
            position: absolute;
            bottom: 2.6rem;
            left: 10.5rem;
          }
          .card-date {
            position: absolute;
            bottom: 0.5rem;
            left: 10.5rem;
          }
          .card-name {
            position: absolute;
            top: 2.2rem;
            left: 4.5rem;
          }
          .card-gender {
            position: absolute;
            top: 4.1rem;
            left: 4.5rem;
            //font-size: 0.7rem;
            span {
              margin-left: 5rem;
            }
          }
          .card-birth {
            position: absolute;
            top: 6.15rem;
            left: 4.5rem;
            //font-size: 0.7rem;
            .month {
              margin-left: 2rem;
            }
            .day {
              margin-left: 1.5rem;
            }
          }
          .card-addr {
            width: 10rem;
            position: absolute;
            top: 8.1rem;
            left: 4.5rem;
            //font-size: 0.7rem;
            text-align: left;
          }
          .card-id {
            position: absolute;
            bottom: .8rem;
            left: 8rem;
            letter-spacing: .2rem;
          }
          .card-avatar {
            position: absolute;
            top: 3.2rem;
            right: 2rem;
            width: 7rem;
            height: 9rem;
            img {
              width: 7rem;
              height: 9rem;
              background-size: contain;
            }
          }
        }
      }
    }
    .file3 {
      margin-right: 28.13rem;
      .main {
        width: 20.75rem;
        height: 28.88rem;
        border: 0.06rem solid #707070;
        margin: 1.06rem 0 0 13.38rem;
      }
    }
    .btn {
      width: 100%;
      height: 5.5rem;
      background: linear-gradient(132deg, #52a39d 0%, #a1c553 50%, #81d012 100%);
      border-radius: 1.25rem;
      font-size: 1.88rem;
      font-weight: 400;
      color: #ffffff;
      line-height: 2.63rem;
      cursor: pointer;
    }
  }
  .smfyData {
    height: 90%;
    width: 14.81rem;
    font-size: 1rem;
    font-weight: bold;
    color: #323232;
    line-height: 2rem;
    overflow: auto;
    cursor: pointer;
    .act {
      color: #52a39d;
    }
    .name {
      text-decoration: underline;
    }
    span {
      margin-left: 5rem;
    }
  }
}
</style>