在vue中将网页保存成pdf并解决html2canvas生成截图不全问题

本来写完的文章,但是最近又发现了新的解决办法,现在更新一下

说个偷懒的办法,直接调用window.print() 方法就可以开启浏览器自带的打印功能。
如果还需要只截取网页部分可以在截图前将body替换掉,方法有很多可自行百度。

下面在说一种方法

首先引入两个工具,这里借用jspdf和html2canvas两个工具生成

这里是下载链接 https://download.csdn.net/download/sunyv1/12424774
下面示范的是网络链接,但是那个生成会出现最下面的问题,建议用上面链接下载的
在index.html中引入(全局引入)
本来想用包管理器的,结果jspdf死活下载不下来

<script src="https://cdn.bootcss.com/jspdf/1.5.3/jspdf.debug.js"></script>
<script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.min.js"></script>

我这里是不想页面太乱所以单独写了个方法放在pdf.js(随便建在哪,待会能找到就行)

编辑器可能会报红,不用管

export const downPdf = (id) => {
  html2canvas(
    document.getElementById(id),
    {
      dpi: 172,//导出pdf清晰度
      onrendered: function (canvas) {
        var contentWidth = canvas.width;
        var contentHeight = canvas.height;

        //一页pdf显示html页面生成的canvas高度;
        var pageHeight = contentWidth / 592.28 * 841.89;
        //未生成pdf的html页面高度
        var leftHeight = contentHeight;
        //pdf页面偏移
        var position = 0;
        //html页面生成的canvas在pdf中图片的宽高(a4纸的尺寸[595.28,841.89])
        var imgWidth = 595.28;
        var imgHeight = 592.28 / contentWidth * contentHeight;

        var pageData = canvas.toDataURL('image/jpeg', 1.0);
        var pdf = new jsPDF('', 'pt', 'a4');

        //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
        //当内容未超过pdf一页显示的范围,无需分页
        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('content.pdf');
      },
      //背景设为白色(默认为黑色)
      background: "#fff"
    })
}

来到要使用的页面引入并使用

<template>
  <div class="mbti">
    <button @click="downPdf">下载</button>
    <div id="mbti" class="home">
    这里是你要生成pdf的部分
    </div>
  </div>
</template>

<script>
import { downPdf } from '../lib/pdf';  // 引入刚刚定义的方法,路径是你自己建的
export default {
  methods: {
    downPdf() {
      downPdf("mbti")
    }
  }
}
</script>

<style lang="less" scope="scoped">
</style>

正常来说到这里就结束了的,但是我在用的时候还遇到了许多坑。下载下来的PDF时不时的缺点什么还有就是生成的PDF位置也有问题,这些是超出屏幕的部分

这是由于html2canvas生成图片的时候不全导致的。我也是找了许多解决方案,下面分享两个:
1.显示被截取的元素绝不能有 overflow: hidden;,否则超出的部分就无法截取。
2.超过屏幕的部分截取异常,但是把屏幕滑到最顶端截取就正常了(我也不知道html2canvas出什么毛病)。既然是这样那就在截取之前加入以下代码,强制跳到顶端就能解决了。
window.pageYOffset = 0;
document.documentElement.scrollTop = 0
document.body.scrollTop = 0;

这里再做一个记录,就是从npm下载的包可能有问题导致截图不全,这里上传一份我的文件
点击这里下载

至此呢已经可以解决功能问题了,如果你们还有更好的解决方案欢迎留言。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
可以使用 jsPDFhtml2canvas 库,具体实现步骤如下: 1. 安装 jsPDFhtml2canvas 库。 ``` npm install jspdf html2canvas --save ``` 2. 在 Vue 组件中引入 jsPDFhtml2canvas 库。 ``` import jsPDF from 'jspdf' import html2canvas from 'html2canvas' ``` 3. 在 Vue 组件中定义方法,用于保存网页为横向 PDF 并打印。 ```javascript methods: { saveAndPrint() { // 获取需要保存PDF 的 DOM 元素 const element = document.getElementById('pdf-content') // 将 DOM 元素转换为 Canvas html2canvas(element, { allowTaint: true, useCORS: true, scale: 1, }).then(canvas => { const contentWidth = canvas.width const contentHeight = canvas.height // 设置 PDF 页面大小为横向 A4 const pdfWidth = contentWidth / 2.75 const pdfHeight = contentHeight / 2.75 // 创建 jsPDF 实例 const pdf = new jsPDF('l', 'mm', [pdfWidth, pdfHeight]) // 将 Canvas 转换为片,并添加到 PDFpdf.addImage(canvas.toDataURL('image/png'), 'PNG', 0, 0, pdfWidth, pdfHeight) // 保存 PDF 并打印 pdf.save('example.pdf') pdf.autoPrint() }) } } ``` 4. 在模板中添加需要保存PDF 的 DOM 元素,并绑定保存和打印事件。 ```html <template> <div> <div id="pdf-content"> <!-- 需要保存PDF 的内容 --> </div> <button @click="saveAndPrint">保存并打印</button> </div> </template> ``` 注意事项: - 需要保存PDF 的 DOM 元素需要有明确的宽度和高度。 - 如果需要保存的内容包含片等跨域资源,需要设置 `allowTaint` 和 `useCORS` 为 `true`,否则可能会保存失败。 - `addImage` 方法的第二个参数需要根据片格式调整,如果是 PNG 格式则为 `'PNG'`,如果是 JPG 格式则为 `'JPEG'`。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值