前端实现打印1 - 使用 iframe 实现 并 分页打印

目录

  • 打印代码
  • 对话框预览
  • 打印预览

打印代码

<!-- 打印 -->
<template>
  <el-dialog
    title="打印"
    :visible.sync="dialogVisible"
    width="50%"
    top="7vh"
    append-to-body
    @close="handleClose"
  >
    <div ref="printContainer" class="container">
      <div v-for="(item, index) in bloodList" :key="index" class="blood_num_item">
        <el-image :src="item.src" :preview-src-list="[item.src]" />
        <!-- <img :src="item.src" /> -->
        <div class="num">{{ item.num }}</div>
      </div>
    </div>

    <template slot="footer">
      <div class="btns">
        <el-button size="mini" @click="handleClose">取消</el-button>
        <el-button size="mini" type="primary" @click="printHandler">打印</el-button>
      </div>
    </template>
  </el-dialog>
</template>

<script>
import { getStore } from '@/utils/tool.js'
// import printJS from 'print-js'

export default {
  name: 'PrintBloodUseDialog',
  components: {},

  data() {
    return {
      dialogVisible: false,
      bloodList: [],
      vuex: JSON.parse(getStore('vuex') || '{}')
    }
  },

  computed: {
    sysConfigData() {
      return (this.vuex && this.vuex.app && this.vuex.app.sysConfigData) || {}
    }
  },

  watch: {},

  created() {
    this.open()
  },

  methods: {
    // open(bloodList = []) {
    open(
      bloodList = [
        '0000000038',
        '0000000039',
        '0000000040',
        '0000000041',
        '0000000042',
        '0000000043',
        '0000000044',
        '0000000045',
        '0000000046'
      ]
    ) {
      this.bloodList = bloodList.map((item) => {
        return {
          src: 'https://fc1tn.baidu.com/it/u=1935894774,4092430670&fm=202&src=780&ernie_sim_online&mola=new&crop=v1',
          num: item
        }
      })
      this.dialogVisible = true
    },
    printHandler() {
      console.log('"打印"----', '打印')
      // printJS({
      //   printable: [`data:image/jpg;base64,${this.printData.url}`],
      //   type: 'image'
      // })
      const el = this.$refs.printContainer
      this.iframe = document.createElement('iframe')
      this.iframe.setAttribute(
        'style',
        'position:absolute;width:0;height:0;left:-500px;top:-500px;'
      )
      document.body.appendChild(this.iframe)
      const doc = this.iframe.contentWindow.document
      doc.write('<div class="print-iframe">' + el.innerHTML + '</div>')
      doc.write('<style>@page{size:auto;margin: 0.5cm 1cm 0cm 1cm;}</style>') // 打印内容距离页面边距
      doc.write( // 实现分页主要代码
        `<style>
          .blood_num_item {
            page-break-before:always !important;
            page-break-after:always !important;
          }
          img,
          .el-image {
            width:100%
          }
          .num {
            text-align:center;
          }
        </style>`
      )
      doc.close()
      this.iframe.contentWindow.onafterprint = this.afterPrint
      this.iframe.contentWindow.focus()
      // this.iframe.contentWindow.print() // 直接打印图片展示不了,需借助 onload ↓↓↓
      this.iframe.onload = () => {         // 解决图片显示不了的问题
        this.iframe.contentWindow.print()
      }
      if (navigator.userAgent.indexOf('MSIE') > 0) {
        document.body.removeChild(this.iframe)
      }
    },
    handleClose() {
      this.dialogVisible = false
    }
  }
}
</script>

<style lang='scss' scoped>
@import '@/styles/dialog-style.scss';
::v-deep .el-dialog {
  .el-dialog__body {
    max-height: 500px;
    overflow: auto;
  }
}

.container {
  display: flex;
  flex-wrap: wrap;
  .blood_num_item {
    width: calc(20% - 5px);
    margin-right: 5px;
    .el-image {
      width: 100%;
    }
    img {
      width: 100%;
    }
    .num {
      text-align: center;
    }
  }
}

.btns {
  text-align: right;
}
</style>

对话框预览

在这里插入图片描述

打印预览

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/59024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app uView自定义底部导航栏

因项目需要自定义底部导航栏&#xff0c;我把它写在了组件里&#xff0c;基于uView2框架写的&#xff08;vue2&#xff09;&#xff1b; 一、代码 在components下创建tabbar.vue文件&#xff0c;代码如下&#xff1a; <template><view><u-tabbar :value"c…

推荐一款非常简单实用的数据库连接工具Navicat Premium

Navicat Premium是一款非常实用的数据库连接工具&#xff0c;别再用HeidiSQL和idea自带的数据库连接了&#xff0c;看完这篇文章&#xff0c;赶紧把Navicat Premium用起来吧。 首先&#xff0c;需要获取Navicat Premium的安装包&#xff0c;可以通过以下网盘链接下载&#xff0…

刷题笔记 day5

力扣 202 快乐数 首先来分析什么样的数是快乐数&#xff0c; 解题思路&#xff1a; 1&#xff09;定义快慢指针 &#xff1b; 2&#xff09;快指针走两步&#xff0c;慢指针走一步 &#xff1b;3&#xff09;两个指针相遇时判断相遇的数值是否为1。 怎样处理 取各分位数的平…

力扣初级算法(二分查找)

力扣初级算法(二分法)&#xff1a; 每日一算法&#xff1a;二分法查找 学习内容&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 2.二分查找流程&…

SystemVerilog scheduler

文章目录 简介调度器simulation regionPreponed regionActive regionInactive regionNBA(Non-blocking Assignment Events region)Observed regionReactive regionRe-Inactive Events regionRe-NBA RegionPostponed Region PLI region:Pre-active regionPre-NBA regionPost-NBA…

常见的设计模式(超详细)

文章目录 单例模式饿汉式单例模式懒汉式单例模式双重检索单例模式 工厂模式简单工厂模式工厂&#xff08;方法&#xff09;模式抽象工厂模式 原型模式代理模式 单例模式 确保一个类只有一个实例&#xff0c;并且自行实例化并向整个系统提供这个实例。 饿汉式单例模式 饿汉式单…

【React学习】—虚拟DOM两种创建方式(二)

【React学习】—虚拟DOM两种创建方式&#xff08;二&#xff09; 一、Hello React案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, init…

spring-boot-maven-plugin使用

spring-boot-maven-plugin这个插件有7个目标&#xff1a; spring-boot:build-image 使用构建包将应用程序打包到OCI映像中。 spring-boot:build-info 根据当前MavenProject spring-boot:help 显示有关spring-boot-maven插件的帮助信息。 调用mvn-spring-boot:help-Ddetailtr…

后端进阶之路——浅谈Spring Security用户、角色、权限和访问规则(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

概率论与数理统计复习总结3

概率论与数理统计复习总结&#xff0c;仅供笔者复习使用&#xff0c;参考教材&#xff1a; 《概率论与数理统计》/ 荣腾中主编. — 第 2 版. 高等教育出版社《2024高途考研数学——概率基础精讲》王喆 概率论与数理统计实际上是两个互补的分支&#xff1a;概率论 在 已知随机…

go编译文件

1.编译go文件 go build [go文件]2.执行文件编译文件 ./demo [demo为go文件名称]

SpringBoot使用redis作为缓存的实例

目录 什么是缓存&#xff1f; 缓存的作用&#xff1f; 缓存的成本&#xff1f; 实际项目中的应用 代码展示 什么是缓存&#xff1f; 缓存就是数据交换的缓冲区&#xff08;称作Cache [ kʃ ] &#xff09;&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 缓…

观察者模式(Observer)

观察着模式是一种行为设计模式&#xff0c;可以用来定义对象间的一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。 观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式、模型-视图&#xf…

《Java-SE-第二十三章》之单例模式

文章目录 单例模式概述饿汉模式懒汉模式单线程版懒汉单例多线程版枚举实现单例 单例模式概述 单例模式是设计模式中的一种,其作用能保证某个类在程序中只存在唯一一份实例,而不会创建多份实例。单例模式具体的实现方式, 分成 “饿汉” 和 “懒汉” 两种.。饿汉模式中的饿不并不…

2023年华数杯数学建模A题思路代码分析 - 隔热材料的结构优化控制研究

# 1 赛题 A 题 隔热材料的结构优化控制研究 新型隔热材料 A 具有优良的隔热特性&#xff0c;在航天、军工、石化、建筑、交通等 高科技领域中有着广泛的应用。 目前&#xff0c;由单根隔热材料 A 纤维编织成的织物&#xff0c;其热导率可以直接测出&#xff1b;但是 单根隔热…

【基于HBase和ElasticSearch构建大数据实时检索项目】

基于HBase和ElasticSearch构建大数据实时检索项目 一、项目说明二、环境搭建三、编写程序四、测试流程 一、项目说明 利用HBase存储海量数据&#xff0c;解决海量数据存储和实时更新查询的问题&#xff1b;利用ElasticSearch作为HBase索引&#xff0c;加快大数据集中实时查询数…

⌈C++⌋从无到有了解并掌握C++面向对象三大特性——封装、继承、多态

前置知识&#xff1a;类和对象 参考书籍&#xff1a;《C Primer 第五版》 目录 什么是面向过程&#xff1f;什么是面向对象&#xff1f; 一、封装 1、封装的含义以及如何实现封装 1.1 访问限定符&#xff08;访问说明符&#xff09; 1.2 什么是封装&#xff1f; 2、封装的优点…

css word-break

上面的一行还是可以放置很多个字符的&#xff0c;但是就是换行了。 要求填充满整行&#xff0c;超过在换行 加上word-break:break-all;就行

uniapp返回

// 监听返回事件onNavigationBarButtonTap() {uni.showModal({title: 提示,content: 确定要返回吗&#xff1f;,success: (res) > {if (res.confirm) {uni.navigateBack({delta: 2})}}})},

牛客网Verilog刷题——VL46

牛客网Verilog刷题——VL46 题目解析答案 题目 根据题目提供的双口RAM代码和接口描述&#xff0c;实现同步FIFO&#xff0c;要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。   双口RAM端口说明&#xff1a; 同步FIFO端口说明&#xff1a; 双口RAM代码如下&#xff…