Angular 与PDF之二:打印预览的实现

news2024/9/28 19:27:20

如何在angular中实现打印和预览pdf的功能, 使用print.js这个包就可实现这个功能

Print.js介绍

Print.js可以打印pdf文件,html元素,图片。官网 https://printjs.crabbly.com/

Print.js使用

首先新建一个angular项目,在项目里下载print.js

npm install print-js –save

下载好了之后在组件里引入它

import { Component } from '@angular/core';
import printJS from 'print-js';

先来试试打印和预览pdf文件

准备一个pdf文件,然后在ts文件里写下这些代码

import { Component } from '@angular/core';
import printJS from 'print-js';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  onPrint() {
    printJS({
      // 文件的路径
      printable: 'assets/pdf/test.pdf',
      // 文件的类别
      type: 'pdf'
    })
  }
}

html文件

<div>
  <h1>打印预览pdf</h1>
  <button (click)="onPrint()">预览</button>
</div>

启动项目打开页面,点击按钮

成功了

接下来打印预览一下图片

准备一张图片,在ts里写下这个代码

onPrint() {
    // 打印pdf文件
    // printJS({
    //   // 文件的路径
    //   printable: 'assets/pdf/test.pdf',
    //   // 文件的类别
    //   type: 'pdf'
    // })

    // 打印图片
    printJS({
      // 文件的路径
      printable: 'assets/img/d048a0bba045f6f2869e233bc46e0a76.jpg',
      // 文件的类别
      type: 'image'
    })
  }

然后到页面点击预览按钮

也完成了

最后是打印预览html元素

先在ts里写下这些代码

import { Component, ViewChild, ElementRef } from '@angular/core';
import printJS from 'print-js';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  
  @ViewChild('tablelist') tablelist: ElementRef;
  data = [
    {
      name: '张三',
      age: '18',
      gender: '男'
    },
    {
      name: '李四',
      age: '19',
      gender: '男'
    },
    {
      name: '王五',
      age: '20',
      gender: '女'
    }
  ]
  onPrint() {
    // 打印html元素
    printJS({
      // 元素的id或者元素本身
      printable: 'list',
      // 类别
      type: 'html'
    })
  }
}

 然后是html

<div>
  <h1>打印预览pdf</h1>
  <table id="list" #tablelist>
    <thead>
      <tr>
        <th>名字</th>
        <th>性别</th>
        <th>年龄</th>
      </tr>
    </thead>
    <tbody>
      <tr *ngFor="let item of data">
        <td>{{ item.name }}</td>
        <td>{{ item.gender }}</td>
        <td>{{ item.age }}</td>
      </tr>
    </tbody>
  </table>
  <button (click)="onPrint()">预览</button>
</div>

最后是css

table {
  border-collapse: collapse;
  border-spacing: 0;
}
td,th {
  padding: 0;
}
table {
  border-collapse: collapse;
  border-spacing: 0;
  empty-cells: show;
  border: 1px solid #cbcbcb;
}
table caption {
  color: #000;
  font: italic 85%/1 arial,sans-serif;
  padding: 1em 0;
  text-align: center;
}
table td,table th {
  border-left: 1px solid #cbcbcb;
  border-width: 0 0 0 1px;
  font-size: inherit;
  margin: 0;
  overflow: visible;
  padding: .5em 1em;
}
table thead {
  background-color: #e0e0e0;
  color: #000;
  text-align: left;
  vertical-align: bottom;
}
table td {
  background-color: transparent;
}

 打开页面看下效果

表格是这样的

预览一下

表格是成功出来的,但是样式丢失了,css的样式没有生效,这种情况下我们可以结合一个包解决 html2canvas

下载 npm install html2canvas

下载完了引入组件

import html2canvas from 'html2canvas';

 修改下ts代码

onPrint() {
    html2canvas(this.tablelist.nativeElement, {
      useCORS: true,
      width: this.tablelist.nativeElement.scrollWidth,
      height: this.tablelist.nativeElement.scrollHeight
    }).then((canvas) => {
      printJS({
        printable: canvas,
        type: 'html'
      })
    })
  }

打开页面预览一下

成功了

但是这种方法不能自定义样式,如果想要自定义样式的话,可以通过printjs里的css选项

先在src/assets文件夹下新建一个css文件夹,再在css文件夹下新建一个print.css文件,写下这些样式

* {

  -webkit-print-color-adjust: exact;
  print-color-adjust: exact;

}
table {
  border-collapse: collapse;
  border-spacing: 0;
}
td,th {
  padding: 0;
}
table {
  border-collapse: collapse;
  border-spacing: 0;
  empty-cells: show;
  border: 1px solid #cbcbcb;
}
table caption {
  color: #000;
  font: italic 85%/1 arial,sans-serif;
  padding: 1em 0;
  text-align: center;
}
table td,table th {
  border-left: 1px solid #cbcbcb;
  border-width: 0 0 0 1px;
  font-size: inherit;
  margin: 0;
  overflow: visible;
  padding: .5em 1em;
}
table thead {
  background-color: #0000ff;
  color: #000;
  text-align: left;
  vertical-align: bottom;
}
table td {
  background-color: transparent;
}

这些样式和之前表格的样式一样,只是把表头的背景颜色改成蓝色

修改下onPrint方法

onPrint() {
    printJS({
      printable: 'list', // html元素的id
      type: 'html', // 类别
      css: '/assets/css/print.css' // css文件的路径
    })
  }

打开页面预览一下

成功 除了css这个选项,printjs还有style这个选项,这个选项就是直接把css样式写在style选项里,修改下onPrint 方法

onPrint() {
    printJS({
      printable: 'list', // html元素的id
      type: 'html', // 类别
      // css: '/assets/css/print.css' // css文件的路径
      style: `
        * {
        -webkit-print-color-adjust: exact;
        print-color-adjust: exact;
      
        }
        table {
          border-collapse: collapse;
          border-spacing: 0;
        }
        td,th {
          padding: 0;
        }
        table {
          border-collapse: collapse;
          border-spacing: 0;
          empty-cells: show;
          border: 1px solid #cbcbcb;
        }
        table caption {
          color: #000;
          font: italic 85%/1 arial,sans-serif;
          padding: 1em 0;
          text-align: center;
        }
        table td,table th {
          border-left: 1px solid #cbcbcb;
          border-width: 0 0 0 1px;
          font-size: inherit;
          margin: 0;
          overflow: visible;
          padding: .5em 1em;
        }
        table thead {
          background-color: #0000ff;
          color: #000;
          text-align: left;
          vertical-align: bottom;
        }
        table td {
          background-color: transparent;
        }
      `
    })
  }

打开页面预览一下

效果和css选项是一样的

这两个选项也能搭配使用

修改下onPrint方法

onPrint() {
    printJS({
      printable: 'list', // html元素的id
      type: 'html', // 类别
      css: '/assets/css/print.css', // css文件的路径
      style: `
        table thead {
          background-color: red;
        }
      `
    })
  }

在css里 表头的背景色是蓝色,然后在style里把它改成红色,预览下看下效果

生效了 

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

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

相关文章

[JS每M日N练] [格物] - 你所不知道的toString

文章目录 导读Object.prototype.toString常见类型转换结果Object.toString ! Object.prototype.toString对Object.prototype.toString.call(obj)的理解 .toString.toString TypeError误区tostring被改写了定义在原型链的什么位置上方法重写 文章小结参考资料 导读 开发过程中经…

同时使用注解和 xml 的方式引用 dubbo 服务产生的异常问题排查实战

文章目录 一、现象二、问题排查三、结论四、解决方案 一、现象 使用 nacos 作注册中心的线上 dubbo 消费端应用每隔 1 分钟就会抛出以下异常&#xff08;为使描述简单化&#xff0c;文章中使用本地 demo 来复现&#xff09;&#xff0c;该异常表示无法连接到 172.17.0.1:20881…

JavaWeb( 二 ) URL

1.4.URL统一资源定位符 URL代表Uniform Resource Locator 统一资源定位符&#xff0c;也叫 URL地址 。是用于标识和定位Web上资源的地址&#xff0c;通常用于在Web浏览器中访问网站和文件。 URL由若干部分组成&#xff0c;scheme:// host : port / path 例如&#xff1a; htt…

Contest3111 - 计科2101~2104算法设计与分析上机作业07

问题 A: 有重复元素的排列问题 题目描述 设R{ r 1 , r 2 , …, r n }是要进行排列的n个元素。其中元素r 1 , r 2 , …, r n 可能相同。试设计一个算法&#xff0c; 列出R的所有不同排列。给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。 输入 第1 行是元素个…

android四大组件之一-Activity实现原理分析

前言&#xff1a; 这篇文章是我花费时间最久的一篇文章&#xff0c;整整的两个月。整个流程繁琐是一个方面的原因&#xff0c;另外一个原因是我想尽可能的把整个流程的逻辑尽可能详细的一一描述出来&#xff0c;以及结合到我们项目中遇到的一些问题来进行解释&#xff0c;毕竟…

【五一创作】VS+Qt主界面内嵌自定义控件的四种方法以及不同自定义控件数据交互

前言 在Qt界面开发过程中&#xff0c;一个主界面或者主窗口看成是各个控件排列组合后的集合&#xff0c;对于一些项目而言&#xff0c;有些常用的控件可以封装成自己想要的控件样式并且复用&#xff0c;比如说&#xff0c;log显示控件&#xff0c;图像/视频显示控件等&#xf…

【ros2】ros melodic迁移到ros2 dashing过程中碰到的问题及解决方法

序言 总结踩坑经历&#xff0c;以利他人 1. error: forming pointer to reference type … & 报错原因&#xff1a; ros2回调函数的参数不能是引用形式 &&#xff0c;需要去除& 解决方法&#xff1a; 如果是指针引用&#xff0c;直接去除引用 void Callback(con…

【Java开发】Spring Cloud 11:Gateway 配置 ssl 证书(https、http、域名访问)

最近研究给微服务项目配置 ssl 证书&#xff0c;如此才可以对接微信小程序&#xff08;需要使用 https 请求&#xff09;。传统单体项目来说&#xff0c;首先往项目中添加证书文件&#xff0c;然后在配置文件中配置 ssl 证书路径、密码等相关信息&#xff1b;那么微服务这么多项…

机器学习强基计划8-5:图解局部线性嵌入LLE算法(附Python实现)

目录 0 写在前面1 流形学习2 局部线性嵌入算法2.1 什么是局部线性嵌入&#xff1f;2.2 算法原理推导 3 Python实现3.1 算法流程3.2 核心代码3.3 可视化 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的…

基于学生成绩管理系统(附源代码及数据库)

基于Ecplise&#xff0c;jsp的学生成绩管理系统 目录 登录页面 系统主页 管理员账号管理 学生查询 课程管理 成绩管理 后台数据库 源代码下载&#xff08;含数据库&#xff09; 毕设项目专栏 分为以下四大板块&#xff1a; 系统用户管理: 包含管理员账号管理&#…

【一起撸个DL框架】5 实现:自适应线性单元

CSDN个人主页&#xff1a;清风莫追欢迎关注本专栏&#xff1a;《一起撸个DL框架》GitHub获取源码&#xff1a;https://github.com/flying-forever/OurDL 文章目录 5 实现&#xff1a;自适应线性单元&#x1f347;1 简介2 损失函数2.1 梯度下降法2.2 补充 3 整理项目结构4 损失函…

第二十七章 Unity碰撞体Collision(下)

本章节我们继续研究碰撞体&#xff0c;并且探索一下碰撞体与刚体之间的联系。我们回到之前的工程&#xff0c;然后给我们的紫色球体Sphere1也添加一个刚体组件。如下所示 此时&#xff0c;两个球体都具备了碰撞体和刚体组件。接下来&#xff0c;我们Play运行查看效果 我们发现&…

第二十六章 Unity碰撞体Collision(上)

在游戏世界中&#xff0c;游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如&#xff0c;攻击怪物则是主角与怪物的碰撞&#xff0c;触发机关则是主角与机关的碰撞。在DirectX课程中&#xff0c;我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复…

浅谈区块链1.0-比特币

1. 比特币解决的问题 高度自治&#xff1a;国际经济危机无国界贸易&#xff1a;不同国家进行的贸易或者不同平台进行贸易 不可窜改&#xff1a;例如银行交易可能会被窜改数据 隐私安全&#xff1a;传统汇款方式会暴露你的个人信息&#xff0c;一旦数据库被别人入侵&#xff0c…

android基础知识复习

架构&#xff1a; 应用框架层&#xff08;Java API Framework&#xff09;所提供的主要组件&#xff1a; 名称功能描述Activity Manager&#xff08;活动管理器&#xff09;管理各个应用程序生命周期&#xff0c;以及常用的导航回退功能Location Manager&#xff08;位置管理器…

SpringBoot整合Mybatis-plus实现多级评论

在本文中&#xff0c;我们将介绍如何使用SpringBoot整合Mybatis-plus实现多级评论功能。同时&#xff0c;本文还将提供数据库的设计和详细的后端代码&#xff0c;前端界面使用Vue2。 数据库设计 本文的多级评论功能将采用MySQL数据库实现&#xff0c;下面是数据库的设计&…

Boonz-KeygenMe#1(★★★)

运行程序 错误&#xff1a; 查壳 没有壳&#xff0c;是汇编写的程序 载入OD 前面是在读取输入内容&#xff0c;到这里开始做计算了 分析 首先遍历了用户名&#xff0c;计算结果保存在EBX&#xff0c;在存放到 0x40E0F8 对EBX中的值再次计算&#xff0c;最后结果保存到 …

JavaFX: Java音乐播放读取歌词

JavaFX: Java音乐播放读取歌词 1、lrc歌词文件2、解析lrc歌词2.1 读取每行歌词2.2 解析歌词时间标签Time-tag2.3 解析歌词标识标签ID-tags2.4 创建对象包含歌词相关信息 3、播放显示歌词** 相关文献 JavaFX: Java音乐播放 1、lrc歌词文件 lrc歌词文件的扩展名 1、标准格式&a…

图像处理:Retinex算法

目录 前言 概念介绍 Retinex算法理论 单尺度Retinex&#xff08;SSR&#xff09; 多尺度Retinex&#xff08;MSR&#xff09; 多尺度自适应增益Retinex&#xff08;MSRCR&#xff09; Opencv实现Retinex算法 SSR算法 MCR算法 MSRCR算法 效果展示 总结 参考文章 前…

基频建模方法总结

基频F0建模方法 语音合成领域需要对基频进行建模&#xff0c;具体到文语转换TTS、语音转换VC、情感语音转换EVC领域等。 语音合成F0 包括文语转换&#xff0c;情感语音转换 TTEF&#xff1a;text-to-emotional-features synthesis EVC&#xff1a;emotional voice conversio…