vue支持pdf写入导出和中文不显示问题!

一、首先一个简单的方案,

直接把网页转成图片,然后再转成pdf,此方法较为简单!

1、下载组件,然后直接复制下面方法保存成 exportPdf.js 文件

npm install --save html2canvas //html页面转换成图片
npm install jspdf --save //把base64转换为PDF
import html2Canvas from 'html2canvas'
import { jsPDF } from "jspdf"

export default function getPdfExport(id, title = 'pdf') {
    return new Promise((resolve, reject) => {
        html2Canvas(document.querySelector(`#${id}`), {
            allowTaint: true
        }).then(function (canvas) {
            let contentWidth = canvas.width
            let contentHeight = canvas.height
            let pageHeight = contentWidth / 592.28 * 841.89
            let leftHeight = contentHeight
            let position = 0
            let imgWidth = 595.28
            let imgHeight = 592.28 / contentWidth * contentHeight
            let pageData = canvas.toDataURL('image/jpeg', 1.0)

            // 转成pdf 
            let PDF = new jsPDF('', 'pt', 'a4')
            if (leftHeight < pageHeight) {
                PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
            } else {
                while (leftHeight > 0) {
                    PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
                    leftHeight -= pageHeight
                    position -= 841.89
                    if (leftHeight > 0) {
                        PDF.addPage()
                    }
                }
            }
            PDF.save(title + '.pdf')
            // 转成图片
            let aLink = document.createElement("a");
            aLink.style.display = "none";
            aLink.href = pageData;
            aLink.download = title + ".jpg";
            // 触发点击-然后移除
            document.body.appendChild(aLink);
            aLink.click();
            document.body.removeChild(aLink);
            // 返回
            resolve('success')
        }
        )
    })
}

2、页面内使用

 <div id="pdfHtml" @click="handlePdf">...</div>
 
 import getPdfExport from '@/utils/exportPdf'
    handlePdf() {
            this.pdfLoading = true
            getPdfExport('pdfHtml', '标题').then(res => {
                setTimeout(() => {
                    this.pdfLoading = false
                    this.$message.success('pdf 保存成功')
                }, 1000)

            }).catch(err => {
                this.pdfLoading = false
                this.$message.error('pdf 保存失败')
            })
        }

二、自定义写入


上面方法比较是图片导入的,而且设计到长图会导致截断问题,所以我们还可以自定义内容!

1、中文问题解决

自己写当然最蛋疼的是中文了,因为插件内置只有英文

2.1.1、下载

https://github.com/parallax/jsPDF

image.png

2.1.2、打开页面,拿本地字体生成js文件

打开fontconverter/fontconverter.html,把你本地字体上传 

C:\Windows\Fonts 里面有很多中文字体,复制一个出来!

image.png

上传就会得到一个js文件!复制放到项目里面

2.1.3、引入字体文件

import '../../static/js/simhei-normal.js' // 引入刚得到的js文件
export function setJsPDF(id) {
    const pdf = new jsPDF(
        {
            orientation: "P",//l 横向 p 纵向 
            unit: "px",//单位设置
            hotfixes: [20],
            format: 'a4',// 纸张大小 默认a4. 可选a0-a10 或者数组[宽,高][925.44, 357.5] 单位是px
            putOnlyUsedFonts: true
        }
    );
     pdf.setFont('simhei', 0); // 设置字体为你引入的字体
     console.log(pdf.getFontList()) // 字体列表
    pdf.text('哈哈哈134', 55, 180);
    pdf.save('报表.pdf')
     }

然后就可以了!

2、常见的一些操作

    var doc = new jsPDF();
    // 打印所有可用的字体
    console.log(doc.getFontList());
    // 设置字体(内置的几种字体都是不支持中文,中文字体需要自己添加)
    doc.setFont("simhei");
    // 设置字体大小
    doc.setFontSize(20);
    // 添加文字内容,左边距离和上边距离
    doc.text('哈哈哈134', 55, 180);
    // 添加图片(图片转成DataURL形式:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQA...)
    //左上距离,图片长宽
   doc.addImage(images, 'PNG', 55, 55, 100, 100);
    // 保存pdf
    doc.save('报表.pdf')

3、表格问题

下载插件

 cnpm install  --save jspdf-autotable
  doc.autoTable({
      styles: {
                font: 'simhei',
            },
        head: [['Name', 'Email', 'Country']],
        body: [
            ['David', 'david@example.com', 'Sweden'],
            ['Castille', 'castille@example.com', 'Spain'],
        ],
    })


相关内容

发表评论

验证码:
点击我更换图片

最新评论