Vue组件实现PDF图纸批量打印功能详解

news2025/1/19 11:35:47

在现代Web应用中,打印功能是一个常见的需求,尤其是在工程和设计领域,经常需要将图纸或文档打印出来。本文将介绍如何使用Vue.js实现一个简单的PDF图纸批量打印功能。

功能概述

该Vue组件的主要功能是:

  1. 展示一系列图纸,每个图纸可以是一个PDF文件或图片。
  2. 将每个图纸绘制到Canvas上,以便可以在浏览器中查看。
  3. 提供一个打印按钮,用户点击后可以打开浏览器的打印对话框,打印所有图纸。

组件结构

以下是组件的模板部分,它包含了一个打印按钮和用于展示图纸的容器。

<template>
  <div class="pdf-content">
    <button class="print-button" @click="openPrintDialog">打印图纸</button>
    <!-- 循环展示每个图纸 -->
    <div v-for="(obj, index) in objects" :key="index" class="print-container">
      <div class="print-title">{{ obj.name }}</div>
      <canvas :ref="`canvas${index}`"></canvas>
    </div>
  </div>
</template>

样式设置

组件的样式部分包含了打印时的特殊样式设置,确保在打印时只显示图纸内容。

<style>
/* 默认不显示图纸容器 */
.print-container {
  display: none;
}
/* 图纸标题样式 */
.print-title {
  font-size: 28px;
  color: red;
  text-align: center;
}
/* 打印时的样式 */
@media print {
  .pdf-content {
    margin-left: -100px;
  }
  /* 隐藏不需要打印的元素 */
  body, html, .el-aside, .el-header, .tags, .print-button {
    display: none;
  }
  /* 显示图纸容器并设置分页 */
  .print-container {
    page-break-after: always;
    display: block;
  }
  /* 使画布填充整个容器 */
  canvas {
    width: 100%;
    height: 100%;
  }
  /* 重置页边距 */
  @page {
    margin: 0;
  }
}
</style>

JavaScript逻辑

在Vue组件的脚本部分,我们定义了数据和方法来处理图纸的加载和打印。

<script>
import { extendedArray } from "@/utils/data.js";
import { printPDF } from "@/utils/pdfToCanvas.js";
export default {
  data() {
    return {
      objects: extendedArray, // 包含图纸信息的数组
    };
  },
  mounted() {
    // 组件挂载后,绘制所有图纸
    this.objects.forEach((obj, index) => {
      this.drawImage(obj, index);
    });
  },
  methods: {
    async drawImage(obj, index) {
      // 获取Canvas元素和绘图上下文
      const canvas = this.$refs[`canvas${index}`][0];
      const ctx = canvas.getContext("2d");
      // 设置画布大小
      canvas.width = obj.backgroundImage.width;
      canvas.height = obj.backgroundImage.height;
      // 根据图纸类型绘制
      if (obj.backgroundImage.src.endsWith(".pdf")) {
        let res = await printPDF(obj.backgroundImage.src); // 将PDF转换为图片
        ctx.drawImage(res, 0, 0, canvas.width, canvas.height);
        this.loadInstrument(obj, ctx); // 加载传感器图片和文字
      } else {
        // 加载背景图片
        const background = new Image();
        background.src = obj.backgroundImage.src;
        background.onload = () => {
          ctx.drawImage(background, 0, 0, canvas.width, canvas.height);
          this.loadInstrument(obj, ctx);
        };
      }
    },
    loadInstrument(obj, ctx) {
      // 加载传感器图片和文字
      obj.objects.forEach((val) => {
        const sensor = new Image();
        sensor.onload = () => {
          ctx.drawImage(sensor, val.left, val.top);
          ctx.fillStyle = "black";
          ctx.font = "24px Arial";
          ctx.fillText(val.id, val.left, val.top);
        };
        sensor.src = val.src;
      });
    },
    openPrintDialog() {
      // 打开打印对话框
      window.print();
    },
  },
};
</script>

总结

这个Vue组件通过结合Canvas和CSS打印样式,实现了一个简单的PDF图纸打印功能。用户可以在浏览器中预览图纸,并通过打印按钮将它们打印出来。这个组件可以很容易地集成到任何Vue项目中,为用户提供便捷的打印服务。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

00. Nginx-知识网络

知识目录 语雀知识网络&#xff0c;点击“”-- 点击“”查看知识网络 01. Nginx-基础知识 02. Nginx-虚拟主机 03. Nginx-Web模块 04. Nginx-访问控制 05. Nginx-代理服务 06. Nginx-负载均衡 07. Nginx-动静分离 08. Nginx-平滑升级 09. Nginx-日志切割 10. Nginx-…

第八节、Bresenham直线插补【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;前面章节主要介绍单个电机控制&#xff0c;本节内容介绍两个电机完成直线插补运动 一、 Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发&#xff0c;最初用于计算机显示直线&#xff0c;它确定应该选择的n维光栅的点&#…

使用数据层进行数据生命周期管理

作者&#xff1a;来自 Elastic Stef Nestor Elasticsearch 7.10 使配置数据生命周期变得不再那么复杂。在这篇博文中&#xff0c;我将介绍一些变化、如何使用它们以及一些最佳实践。 数据生命周期可以包含很多阶段&#xff0c;因此我们将涉及&#xff1a; 将集群划分为层&…

大数据-244 离线数仓 - 电商核心交易 ODS层 数据库结构 数据加载 DataX

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

【RK3562J开发笔记】MCP2518FD外部CAN-FD控制器的调试方法

“SPI转CAN-FD”是嵌入式开发领域的常用方法&#xff0c;它极大地促进了不同通信接口之间的无缝连接&#xff0c;并显著降低了系统设计的复杂性。飞凌嵌入式依托瑞芯微RK3562J处理器打造的OK3562J-C开发板因为内置了SPI转CAN-FD驱动&#xff0c;从而原生支持这一功能。该开发板…

OpenCV 图像基本操作

OpenCV快速通关 第一章&#xff1a;OpenCV 简介与环境搭建 第二章&#xff1a;OpenCV 图像基本操作 OpenCV 图像基本操作 OpenCV快速通关第二章&#xff1a;OpenCV 图像基本操作一、相关结构体与函数介绍&#xff08;一&#xff09;cv::Mat 结构体&#xff08;二&#xff09;c…

QT通过在线安装器安装【详细】

在线安装器地址&#xff1a; 官方在线安装器&#xff1a;Index of /official_releases/online_installers (qt.io) 通过命令行启动安装页面 直接双击qt安装程序&#xff0c;在线安装会非常慢&#xff0c;甚至安装失败&#xff0c;所以通过命令行页面启动安装页面。点击wind…

保姆级教学 uniapp绘制二维码海报并保存至相册,真机正常展示图片二维码

一、获取二维码 uni.request({url: https://api.weixin.qq.com/wxa/getwxacode?access_token${getStorage("token")},responseType: "arraybuffer",method: "POST",data: {path: "/pages/index/index"},success(res) {// 转换为 Uint…

基于stm23的智慧宿舍系统 (DAY10)_小程序

好久没记录开发进度了&#xff0c;今天小程序差不多开发完了&#xff0c;UI这块算是比较常见了&#xff0c;主要功能是能连接onenet查看设备上传的数据&#xff0c;同时也能对设备进行一些控制下面是几个主要的函数&#xff0c;功能比较简单 wx.request({url: ${apiBaseUrl}/t…

dockerfile部署前后端(vue+springboot)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言0.环境说明和准备1.前端多环境打包1.1前端多环境设置1.2打包 2.后端项目多环境配置以及打包2.1后端多环境配置2.2项目打包 3.文件上传4.后端镜像制作4.1dockerf…

Tomcat使用教程

下载地址&#xff1a;https://tomcat.apache.org/ 配置环境变量 变量名: CATALINA_HOME 变量值: D:\tools\apache-tomcat-9.0.97 Path: %CATALINA_HOME%\bin 启动Tomcat(打开命令提示符) startup.bat 解决乱码问题(打开conf\logging.properties) java.util.logging.Conso…

vim实用命令整理(常用的命令)

本章教程,总结自己平时使用vim过程中,经常使用的命令,分享给大家。 一、高频使用 i:进入插入模式(光标处插入) a:进入插入模式(光标后插入) esc:返回普通模式 ::进入命令模式 :w:保存 :q:退出 :wq:保存并退出 :q!:强制退出不保存 :e filename:打开文件 :set n…

UiPath API接口说明

Swagger网址 私有云网址&#xff08;企业版&#xff09; https://企业/swagger/index.html 公有云网址&#xff08;社区版&#xff09; https://cloud.uipath.com/linan/LinanZhang/orchestrator_/swagger/index.html#/ 常见问题 Swagger页面测试请求时报错“You are not a…

17. Threejs案例-Three.js创建多个立方体

17. Threejs案例-Three.js创建多个立方体 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 WebGL 场景的核心类。它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选…

【解决pycharm下site-packages文件标记为红色的问题】

怎么解决pycharm下site-packages文件标记为红色的问题 这是一个pycharm无法识别本地site-packages问题答案解释器设置路径如下&#xff1a; 这是一个pycharm无法识别本地site-packages问题 最近正在搭建一个python3requestsunittestHTMLTestRunner接口测试框架&#xff0c;发现…

高中数学:计数原理-排列组合

文章目录 一、排列排列数例题 二、组合组合数例题 三、使用方法总结 一、排列 排列数 例题 二、组合 组合数 例题 三、使用方法总结 组合&#xff1a;从n个元素中抽取m个元素&#xff0c;不排序&#xff0c;则用组合计算 排列&#xff1a;从n个元素中抽取m个元素&#xff0c;再…

软件设计师下午题知识点

下午题一&#xff1a;数据流图DFD 数据流图平衡原则 此题注意两个平衡&#xff1a; 1、父图与子图的平衡&#xff08;顶层图、0层图&#xff09;&#xff1b;2、子图内平衡&#xff09;遵循自顶向下&#xff0c;从抽象到具体 结构化分析 在结构化分析方法中&#xff0c;数…

C++哈希(一)

1.底层结构 顺序结构以及平衡中&#xff0c;元素关键码与其存储位置之间没有相对应的关系&#xff0c;因此在查找一个元素时&#xff0c;要经过关键码的多次比较。顺序查找的时间复杂度为O(N)。 理想的搜索方法&#xff1a;可以不经过比较&#xff0c;依次直接从表中直接搜索…

Open-webui:本地化管理AI大模型

Open WebUI 是一个开源的用户界面工具&#xff0c;用于运行和管理大语言模型 (LLM) 及其他人工智能功能。它的主要目的是简化人工智能模型的本地部署和操作&#xff0c;让用户能够方便地通过浏览器界面与各种 AI 模型进行交互。 官方地址&#xff1a;https://github.com/open-…

1 数据库(上):MySQL的概述和安装、SQL简介、IDEA连接数据库使用图形化界面

文章目录 前言一、数据库相关的概念二、MySQL概述1 MySQL的安装和配置2 MySQL登录、退出&#xff08;1&#xff09;mysql -uroot -p1234 或者mysql -uroot -p ---- 登录&#xff08;2&#xff09;exit或者quit ---- 退出 3 远程登录服务器上的MySQL命令mysql -hip地址 -P3306 -…