首页 > 其他分享 >使用printJs实现打印效果

使用printJs实现打印效果

时间:2024-12-05 15:54:15浏览次数:5  
标签:printJs 效果 form 打印 ant width important table

一、需求

需要实现部分页面的内容打印;页面内容为表单,表单中还包括了表格。使用了 a-form 、a-row、a-table 相关组件

二、实现方法

1、安装print-js

 npm install --save print-js 

2、给需要打印的部分设置一个id

例如:我需要打印的是一整个表单内容,就再form表单上面设置id(此id用于打印页面时确定需要打印的范围)

3、添加按钮和点击事件实现触发打印

在按钮的点击事件中配置printJs相关属性,实现以实现打印效果。

 printable: 数据对象  type: 打印类型(可选项为pdf, html, image, json and raw-html,默认值为pdf)  targetStyles: 打印样式(此处设置与官网的 ['*']不一致,但是'*'才能实现我需要的效果)  maxWidth: 最大文档宽度  onLoadingStart: 加载执行函数  onLoadingEnd: 结束执行函数 ……其他配置参考  

4、调整样式设置,实现页面内容的完整打印

a、原本a-table中设置了横向滚动,但是打印时有横向滚动会导致打印页面出现问题,再加上列表本身不需要横向滚动,遂去之

b、根据实际需要,给表格进行了一些原始样式的修改(去掉了表格数据的内部边框,只保留了外部和头部的边框,边框颜色也有改变),所以打印时外边框未进行显色。

解决办法:将原来的设置部分边框的颜色改为设置整体的边框的颜色

c、表头宽度够,但是表头文字还是换行了

解决办法:直接去掉表头的换行效果

::v-deep .ant-table-thead > tr > th {
  white-space: nowrap !important;
}

d、使用表单进行打印时,发现 a-form-item 自带的标题后面的:不在打印页面进行显示,猜测是打印时不接受伪元素的样式设置

解决办法:去掉组件自带的伪元素实现的:改为页面样式直接写:

::v-deep .ant-form-item-label > label::after {
  content: none !important;
}

三、完整代码

<template>
  <div>
    <a-modal :dialog-style="{ top: '20px' }" :visible="visible" width="1200px" @cancel="visible = !visible">
      <a-card :body-style="{ height: '70vh', overflowY: 'auto' }" :bordered="false">
        <a-form id="printBox" :form="from">
          <a-row type="flex" justify="center"><div style="font-size: 16px;">(打印时间:2024-11-20 11:11)</div></a-row>
          <a-row type="flex" justify="space-between">
            <a-col span="7">
              <a-form-item label="编号" :label-col="{ span: 10}" :wrapper-col="{span : 14 }">
                :11111
              </a-form-item>
            </a-col>
            <a-col span="7">
              <a-form-item label="名字" :label-col="{ span: 10}" :wrapper-col="{span : 14 }">
                :111
              </a-form-item>
            </a-col>
            <a-col span="7">
              <a-form-item label="日期" :label-col="{ span: 10}" :wrapper-col="{span : 14 }">
                :22222
              </a-form-item>
            </a-col>
          </a-row>
          <a-row type="flex" justify="center">
            <a-table bordered :data-source="dataSource" :columns="columns" :row-key="(record) => record.id" :pagination="false"></a-table>
          </a-row>
          <div style="display: flex;justify-content: center;">
            <div class="table-border">
              <a-row type="flex" justify="space-between">
                <a-col span="8">
                  <a-form-item label="总计" :label-col="{ span: 8}" :wrapper-col="{span : 14 }">
                    :11111
                  </a-form-item>
                </a-col>
                <a-col span="3">
                  <a-form-item :wrapper-col="{span: 20 }">
                    2024-11-20
                  </a-form-item>
                </a-col>
              </a-row>
            </div>
          </div>
          <div style="display: flex;justify-content: center;">
            <div class="table-border">
              <a-row type="flex" justify="space-between">
                <a-col span="7" class="border-right">
                  <a-form-item label="累计" :label-col="{ span: 8}" :wrapper-col="{span : 14 }">
                    :1111
                  </a-form-item>
                </a-col>
                <a-col span="7" class="border-right">
                  <a-form-item label="单个" :label-col="{ span: 10}" :wrapper-col="{span : 14 }">
                    :1
                  </a-form-item>
                </a-col>
                <a-col span="7">
                  <a-form-item label="合计" :label-col="{ span: 10}" :wrapper-col="{span : 14 }">
                    :1111
                  </a-form-item>
                </a-col>
              </a-row>
            </div>
          </div>
          <a-row type="flex" justify="space-between">
            <a-col span="7">
              <a-form-item label="名字" :label-col="{ span: 10}" :wrapper-col="{span : 14 }">
                :11111
              </a-form-item>
            </a-col>
            <a-col span="7">
              <a-form-item label="名字" :label-col="{ span: 10}" :wrapper-col="{span : 14 }">
                :111
              </a-form-item>
            </a-col>
            <a-col span="7">
              <a-form-item label="签名" :label-col="{ span: 10}" :wrapper-col="{span : 14 }">
                :21111
              </a-form-item>
            </a-col>
          </a-row>
        </a-form>
      </a-card>
      <div slot="footer">
        <a-button type="primary" @click="printPDF()">打印</a-button>
      </div>
    </a-modal>
  </div>
</template>

<script>
import printJs from 'print-js'

const columns = [
  {
    title: '序号',
    key: 'number1',
    align: 'center',
    width: 50
  },
  {
    title: '编码',
    dataIndex: 'purchaseModeName',
    align: 'center',
    width: 150
  },
  {
    title: '名称',
    dataIndex: 'materialName',
    align: 'center',
    width: 150
  },
  {
    title: '型号',
    dataIndex: 'specs',
    align: 'center',
    width: 90
  },
  {
    title: '单位',
    dataIndex: 'collectionDate',
    align: 'center',
    width: 150
  },
  {
    title: '数量',
    dataIndex: 'number',
    align: 'center',
    width: 120
  },
  {
    title: '单价',
    dataIndex: 'unitPrice',
    align: 'center',
    width: 150
  },
  {
    title: '金额',
    dataIndex: 'amount',
    align: 'center',
    width: 120,
  }
]
export default {
  data() {
    return {
      visible: false,
      form: this.$form.createForm(this, { name: 'from' }),
      columns,
      dataSource: [{ id: 1, purchaseModeName: '8026t12', amount: 100, unitPrice: 10 }, { id: 2, purchaseModeName: '8026t88hsidab', amount: 3000, unitPrice: 20 }],
    }
  },
  methods: {
    openModal() {
      this.visible = true
    },
    printPDF() {
      const that = this
      setTimeout(() => {
        printJs({
          printable: 'printBox',
          type: 'html',
          targetStyles: '*',
          maxWidth: '1200',
          onl oadingStart: function () {
            console.log('开始加载PDF')
          },
          onl oadingEnd: function () {
            console.log('结束加载PDF')
            that.$emit('loding-success')
          }
        })
      }, 500)
    },
    printPage() {
      window.print();
    }
  }
}
</script>

<style scoped lang="less">
.table-border {
  width: 981px;
  display: block;
  border: 1px solid #0f0f0f;
  border-top: 0;

  .border-right {
    border-right: 1px solid #0f0f0f;
  }
}

::v-deep .ant-table-tbody > tr > td {
  border: none !important;
}

::v-deep .ant-table-bordered .ant-table-body > table {
  border: 1px solid #0f0f0f !important;
}

::v-deep .ant-table-thead > tr > th {
  border: 1px solid #000000 !important;
  text-align: center !important;
  white-space: nowrap !important;
}

::v-deep .ant-form-item-control {
  line-height: 30px !important;
}

::v-deep .ant-form-item-label {
  line-height: 27px !important;
}

::v-deep .ant-form-item {
  margin-bottom: 0 !important;
}

::v-deep .ant-form-item-label > label::after {
  content: none !important;
}
</style>

标签:printJs,效果,form,打印,ant,width,important,table
From: https://www.cnblogs.com/shlbetter/p/18574304

相关文章

  • 使用css实现一个loading的效果
    .loading-container{width:100px;height:100px;position:relative;/*Neededforabsolutepositioningofchildren*/margin:20pxauto;/*Centerthecontainer*/}.loading-spinner{border:4pxsolid#f3f3f3;/*Lightgrey*/border-top:......
  • 使用纯css画出一个右侧滚动顶部进度条的效果
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Right-ScrollingProgressB......
  • STM32 串口打印 NaN的原因分析!!!
    /******************************************************************************@nameconvertToDecimalString*@brief将hex转成字符串。例如0X61A8转成25.000*@paraminput-输入的数组***@return对应的字符串********************************......
  • 电话机器人外呼神器,效果真的这么神奇吗?
    电话机器人外呼神器,其效果确实令人瞩目,称之为“神奇”也并不为过。以下是我从多个维度对其效果的详细阐述:一、高效自动化电话机器人外呼神器能够批量外呼,无需人工手动拨号,同时能筛选掉空号和拒接号码,大大提高了工作效率。据数据表明,人工一天只能拨打200~300通电话,而机器人每......
  • 【stablediffusion教程】AIGC技巧:SD图生图 如何控制变量生成想要的效果?
    SD(StableDiffusion)是目前最流行的本地部署类AIGC工具,它可以说既简单又复杂。简单是因为完全没有绘画功底的用户也可以做出各种风格的精美图片,而复杂则是因为AIGC相对没有那么“听话”,想要AI完全按照自己的想法实现内容还是颇有难度的。此前我们简单介绍过大家最常用的文生......
  • CSS 动画效果实现:图片展示与交互
    ​......
  • Css动画:旋转相册动画效果实现
    ​......
  • 使用antd的ProTable表格,打印时表头不全
    问题项目中使用antd的ProTable表格,在打印时发现表头不全,如下图:表格有5列,但表头只展示了3列,审查元素发现table下有个colgroup来控制表头宽度解决修改代码:在打印时隐藏colgroup即可@mediaprint{colgroup{display:none;}}实现效果如下:......
  • 请使用纯css实现波浪效果
    可以使用纯CSS实现几种不同的波浪效果。以下列出三种常见方法,并提供代码示例:1.使用border-radius创建波浪:这种方法最简单,通过交替使用大的圆角和小的圆角来模拟波浪形状。.wave{width:200px;height:50px;background-color:lightblue;border-radius:50%......
  • 用js怎么实现图片马赛克效果?
    在前端JavaScript中,实现图片马赛克效果主要有两种方法:使用CanvasAPI和使用SVG滤镜。CanvasAPI更为常见和灵活,以下提供使用CanvasAPI实现马赛克效果的代码示例和详细解释:functionmosaic(image,tileSize){constcanvas=document.createElement('canvas');co......