Vue前端实现预览并打印PDF文档

一. 需求

1. 点击文档列表中的【打印】按钮,获取后台生成的PDF的url,弹窗进行预览:

2. 点击【打印】按钮,进行打印预览和打印:

二. 需求实现

首先后台给的是word文档,研究了一圈后发现暂时无法实现(需要跳转谷歌预览、格式错乱等问题),于是要求后台大佬给换成pdf。

非常感谢大佬dearmrzhang的分享,这篇文章实现的需求比本文复杂的多,我这里只是单页pdf的预览和打印,大佬的分享则涉及img和pdf的分别处理、分页等,原文:手摸手系列之前端Vue实现PDF预览及打印的终极解决方案

我的代码比较简单,注意首先需要在项目引入这两个库:

vue-pdf

print-js

1. 模版
<template>
  <div class="main">
    <div style="padding: 20px">
      <a-form layout="inline" style="color: black; margin-bottom: 22px">
        <a-row :gutter="48">
          <a-col>
            <a-form-item label="运单号" style="margin-right: 30px">
              <a-input placeholder="请输入运单号" allow-clear size="large" v-model="queryParam.waybillNo"></a-input>
            </a-form-item>
            <sava-button class="button" @click="doSearch">查询</sava-button>
          </a-col>
        </a-row>
      </a-form>
      <a-table
        ref="table"
        :columns="columns"
        :dataSource="loadData"
        :loading="loading"
        :row-key="(record) => record.id"
        :pagination="pagination"
        @change="handleTableChange"
        style="margin-top: 10px"
      >
        <span slot="action" slot-scope="text, record">
          <!-- <a @click="handleEdit(record)" style="color: #2b79c2">编辑</a> -->
          <a @click="viewDetail(record)" style="color: #2b79c2; margin-left: 10px">查看</a>
          <a @click="printBill(record)" style="color: #2b79c2; margin-left: 10px">打印</a>
        </span>
      </a-table>

      <a-modal :visible="previewVisibleForAll" :footer="null" @cancel="handleCancelAll" :width="800">
        <div style="overflow-y: auto; overflow-x: hidden">
          <a-button shape="round" icon="file-pdf" @click="handlePrint(printData)" size="small">打印</a-button>
          <div id="printFrom">
            <pdf ref="pdf" :src="previewFileSrc"></pdf>
          </div>
        </div>
      </a-modal>
    </div>
  </div>
</template>
2. 核心业务逻辑
<script>
// 两个库引入
import pdf from 'vue-pdf'
import printJS from 'print-js'
// 接口
import { reqWayBillList, reqBillReport } from '@/api/DigitalWayBill/DigitalWayBill'

export default {
  components: {
    pdf,
  },
  data() {
    return {
      queryParam: {
        waybillNo: '',
      },
      columns: [
      ],
      loadData: [],
      loading: false,
      pagination: {},
      mdl: null,
      enterpriseInfo: [],
      inspectorInfo: [],
      fenceParam: {},
      pdfUrl: '', // 你的 PDF 文件 URL
      progress: 0,
      printData: {
        printable: 'printFrom',
        header: '',
        ignore: ['no-print'],
      },
      previewVisibleForAll: false,
      pageTotal: null,
      previewFileSrc: '',
    }
  },
  created() {
    this.doSearch()
  },

  methods: {
    doSearch() {
      this.loading = true
      reqWayBillList(this.queryParam).then((res) => {
        console.log('way bill list', res)
        this.loadData = res.records
        this.loading = false
      })
    },
    handleTableChange(pagination) {
      const pager = { ...this.pagination1 }
      pager.current = pagination.current
      this.pagination1 = pager
      this.queryParam1.pageIndex = pagination.current
      this.doSearch()
    },

    viewDetail(record) {
      console.log('click view')
      this.mdl = { ...record }
      // 将获取的信息传递到新页面
      this.$router.push({
        path: '/bill/detail',
        query: {
          data: JSON.stringify(this.mdl),
        },
      })
    },
    printBill(record) {
      this.$message.success('生成文档需要一些时间, 请稍候...', 10)
      reqBillReport(record.waybillNo)
        .then((res) => {
          console.log('pdf url', res)
          this.previewFileSrc = res
          this.previewVisibleForAll = true
        })
        .catch((err) => {
          this.$message.error(`获取文档失败: ${err}`)
        })
    },
    handlePrint(params) {
      printJS({
        printable: params.printable, // 'printFrom', // 标签元素id
        type: params.type || 'html',
        header: params.header, // '表单',
        targetStyles: ['*'],
        style: '@page {margin:0 10mm};', // 可选-打印时去掉眉页眉尾
        ignoreElements: params.ignore || [], // ['no-print']
        properties: params.properties || null,
      })
    },
    printPdf() {
      this.$refs.pdf.print()
      // window.print()
    },
    handleCancel() {
      this.previewVisible = false
    },
    handleCancelAll() {
      this.previewVisibleForAll = false
    },
  },
}
</script>
3. 样式

没有额外的样式,都写在模版标签里了

三. 总结

市面上有一些pdf预览和打印的库,正如dearmrzhang大佬讲的,都有一些不足;通过与print-js的组合使用,才完美解决了预览和打印的需求。

感谢观看,希望本文能帮助您解决相关需求问题。

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

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

相关文章

【开源】A066—基于JavaWeb的农产品直卖平台的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

MR20一体式IO 在3C领域的应用

一、导读 该公司成立于1999年&#xff0c;是中国最早专注于泛半导体产业的投资机构&#xff0c;于2015年在 新三板上市。是集研发&#xff0c;制造&#xff0c;销售&#xff0c;服务于一体的国家级高新技术企业&#xff0c;致力于提供暖通空调及供热采暖 控制为核心的产品、技…

Conda + JuiceFS :增强 AI 开发环境共享能力

Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统&#xff0c;因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎。 Conda 支持在不同的操作系统上重建相同的工作环境&#xff0c;但在环境共享复用方面仍存在一些挑战。比如&#xff0c;在不同机器上复用相…

【推荐算法】单目标精排模型——FiBiNET

key word: 学术论文 Motivation&#xff1a; 传统的Embedding&MLP算法是通过内积和Hadamard product实现特征交互的&#xff0c;这篇文章的作者提出了采用SENET实现动态学习特征的重要性&#xff1b;作者认为简单的内积和Hadamard product无法有效对稀疏特征进行特征交互&a…

启动你的RocketMQ之旅(二)-broket和namesrv启动流程

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a; 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;java专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;请指正&#…

vue3-canvas实现在图片上框选标记(放大,缩小,移动,删除)

双图版本&#xff08;模板对比&#xff09; 业务描述&#xff1a;模板与图片对比&#xff0c;只操作模板框选的位置进行色差对比&#xff0c;传框选坐标位置给后端&#xff0c;返回对比结果显示 draw.js文件&#xff1a; 新增了 createUuid&#xff0c;和求取两个数组差集的方…

python编程Day13-异常介绍捕获异常抛出异常

异常 介绍 1, 程序在运行时, 如果Python解释器遇到到一个错误, 则会停 止程序的执行, 并且提示一些错误信息, 这就是异常. 2, 程序停止执行并且提示错误信息这个动作, 通常称之为: 抛出 (raise) 异常 # f open(aaaa.txt) # FileNotFoundError: [Errno 2] No such file or dire…

计网(王道的总结)-数据链路层-网络层-传输层

由于时间有限&#xff0c;把每个王道的章节最后一节放在一起&#xff0c;分别看看复习知识点。 3.6.4 IEEE 802.11 无线局域网 重点&#xff1a; 3.7 广域网 真题考频&#xff1a;极低 3.8以太网交换机 4.1网络层的功能 4.2.1IPv4分组 最重要的&#xff1a; TTL&#xff1a;…

【优选算法篇】:揭开二分查找算法的神秘面纱--数据海洋中的精准定位器

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 一.二分查找算法二.算法模板模板一模板二模板三 三.例题演练1.x的平…

PlantUML——类图

背景 类图是UML模型中的静态视图&#xff0c;其主要作用包括&#xff1a; 描述系统的结构化设计&#xff0c;显示出类、接口以及它们之间的静态结构和关系。简化对系统的理解&#xff0c;是系统分析与设计阶段的重要产物&#xff0c;也是系统编码和测试的重要模型依据。 在U…

来也RPA程序异常处理

1、程序异常模块怎么弄&#xff1a;连接第一个流程块后&#xff0c;连接第二个流程块就是虚线异常块。这是编辑器固定的功能。 2、异常模块做什么&#xff1f;系统会自动把异常文本&#xff0c;通输入参数 $BlockInput 传入异常流程块。 然后&#xff0c;这个异常文本&#xf…

电子应用设计方案-43:智能手机充电器系统方案设计

智能手机充电器系统方案设计 一、引言 随着智能手机的广泛应用&#xff0c;对充电器的性能、效率和安全性提出了更高的要求。本方案旨在设计一款高效、安全、兼容多种快充协议的智能手机充电器。 二、系统概述 1. 系统目标 - 提供快速、稳定、安全的充电功能。 - 兼容主流的智…

Java Agent(一)、 初步认识Instrumentation

目录 1、什么是Instrumentation&#xff1f; 2、底层机制 2.1、工作流程 2.2、Instrumentation API 3、加载Java Agent 3.1、静态Agent示例 3.1.1、定义一个agent 3.1.2、配置 MANIFEST.MF 3.1.3、定义main测试类 3.1.4、启动参数添加-javaagent 3.2、动态Agent示例…

关于SpringBoot项目创建后构建总是失败的问题

第一个问题&#xff1a;IDEA创建项目总是失败 原因&#xff1a;创建项目的时候默认使用的是https://start.spring.io&#xff0c;这个是一个外国网站&#xff0c;众所周知的就是国内访问总是出现不稳定的现象&#xff0c;这就是导致项目创建失败的最终原因。 解决方法&#x…

Java-自动拆箱/装箱/缓存/效率

为什么基本类型需要包装类&#xff1f; 泛型与集合支持问题&#xff1a;基本数据类型在使用上虽然方便、简单且高效&#xff0c;但像泛型以及集合元素的存储等场景并不支持基本数据类型&#xff0c;而包装类可以解决这个问题&#xff0c;使其能更好地融入到一些需要对象类型的…

计算机毕业设计Python中华古诗词知识图谱可视化 古诗词智能问答系统 古诗词数据分析 古诗词情感分析模型 自然语言处理NLP 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

微服务网关SpringCloudGateway、Kong比较

网关产品 1. Spring Cloud Gateway 基本信息 Spring Cloud Gateway是Spring Cloud生态系统中的一个组件&#xff0c;基于Spring 5、Project Reactor和Spring Boot 2构建。它旨在为微服务架构提供一种简单而有效的API网关解决方案。 功能特点 路由功能强大&#xff1a;使用Rou…

实现基于分布式的LAMP架构+NFS实时同步到备份服务器

概述 项目计划用WordPress搭建一个博客系统, 为了性能更好,两个服务器都对外提供WordPress博客系统服务, 数据放在MySQL服务器, 有些上传的图片发送到NFS服务器上&#xff0c;并且把NFS数据实时同步到一个备份服务器上。 服务名称IP地址DNS10.0.0.200WEB110.0.0.201W…

【NVIDIA orin nx 安装ultralytics yolov11】

注意:不同用户安装的python可能会在不同的路径,因此不同的pip管理会导致安装的 torch和torchvision会在不同的路径下 记得区分用户来运行yolo 一、确认系统 JetPack 版本 此处使用5.1.1 1、查看JetPack 版本 jtop二、安装 ultralytics、pytorch、torchvision、onnxruntime…

Linux系统挂载exfat格式U盘教程,触觉智能RK3562开发板演示

本文介绍Linux系统&#xff08;Ubuntu/Debian通用&#xff09;挂载exfat格式U盘的方法&#xff0c;触觉智能RK3562开发板演示&#xff0c;搭载4核A53处理器&#xff0c;主频高达2.0GHz&#xff1b;内置独立1Tops算力NPU&#xff0c;可应用于物联网网关、平板电脑、智能家居、教…