前言
证书打印这里分两种打印方式:一种是将证书模板和文字整体打印出来,根据证书模板以及文字的x、y坐标显示在相应的位置;另一种称之为套打,不打印模板,只打印需要的文字,根据文字的x、y坐标显示在相应的位置。
出现的问题
1.打印的时候图片会时而显示时而不显示
这里使用的打印插件是vue-print-nb,之前的使用方式要打印的区域定义的id,比如‘test’ 和打印按钮上定义v-print=”‘#test’” ,id一致就可以了。但在测试过程中发现,点击打印的时候图片会时而显示时而不显示。排查之后发现可能是异步的问题,使用this.$nextTick(() => {})后问题得到解决。所以,后面改为引入打印插件的核心代码printarea(该文件在vue-print-nb -> src -> packages -> printarea.js),之后的使用方法如下:
1 | import Print from "@/utils/printarea"; |
2.打印的时候图片跨域
在开发过程中,本人的电脑打印一切正常,但是其他小伙伴电脑出现图片跨域。在网上搜了很多方法,发现将图片转化为blob对象是可以解决问题的。
1 | let myImage = new Image(); |
1 | toDataURL(url, callback) { |
3.文字换行
上网搜索了一个方法
1 | textPrewrap(ctx, content, drawX, drawY, lineHeight, lineMaxWidth, lineNum) { |
4.调节文字行间距
一定要加’!important‘,不然权限不够,会不起作用。
1 | #chapterCanvas{ |
5.通过样式调整打印的方向
1 | @media print { |
6.如何只打印需要打印的部分
在套打过程中,不需要显示证书模板,所以只需要给证书模板dom添加以下定义的类,该类定义display:none,也就是说在打印的时候就不会显示了。
1 | <img class="canvas-bg no-print" :src="item.comple_credit_template" :style="{'width': item.comple_credit_template_width+'px', 'height': item.comple_credit_template_height+'px'}"/> |
1 | @media print { |
7.如何下载
通过html2canvas插件将页面转化为图片。注意这里也有跨域问题,需要设置一个属性useCORS: true 。
1 | let that = this |
最后,通过downloadFileByBase64方法,将url处理一下,最后生成下载链接。
1 | function dataURLtoBlob (dataurl, filename) { |
一、证书模板和文字整体打印出来
完整代码如下:
1 | <template> |
二、证书模板不打印,只打印文字
1 | <template> |