首页 > 其他分享 >html2Canvas+JsPDF在每一页上面插入内容

html2Canvas+JsPDF在每一页上面插入内容

时间:2024-12-08 11:10:01浏览次数:7  
标签:JsPDF html2Canvas 插入 let pageNumber leftHeight PDF 页面

有一个功能,是将html页面转成pdf下载下来,已用html2Canvas+JsPDF实现。页面上面有一个多行标题,打印的时候多页只会在第一页有,客户想要每一页都有。
解决方法:

打印的时候,可以看做打印的区域不动,页面纸往上移,继续打印下面部分。
我的想法是,每次页面纸往上移的时候,可以少移一部分,让上个页面一部分留在下个页面,然后用我的多行标题盖住。
页面中用一个容器保留我的多行标题,打印的时候转成图片,插入要打印的头部。

点击查看代码
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'

export default{
    install (Vue, options) {
        Vue.prototype.getPdf = function (id,title,flag) {
            let titleImage = ''
            if(flag == 'record') {
                // 标题,插入页面头部用
                html2Canvas(document.querySelector('.pdf-title'), {
                    // allowTaint: true
                    useCORS:true,// 看情况选用上面还是下面的,
                    allowTaint: true,
                    scrollY: - window.screenY,
                    scrollX: - window.screenX,
                }).then(function (canvas) {
                    titleImage = canvas.toDataURL('image/jpeg', 1.0)
                })
            }
            return new Promise((resolve, reject) =>{
                html2Canvas(document.querySelector(`#${id}`), {
                    // allowTaint: true
                    useCORS:true,// 看情况选用上面还是下面的,
                    allowTaint: true,
                    scrollY: - window.screenY,
                    scrollX: - window.screenX,
                }).then(function (canvas) {
                        let contentWidth = canvas.width
                        let contentHeight = canvas.height
                        let pageHeight = contentWidth / 592.28 * 841.89 // 计算每一页 PDF 的高度
                        let leftHeight = contentHeight // 剩余需要处理的高度,初始值: contentHeight
                        let position = 0 // 图像在 PDF 中的位置
                        let imgWidth = 595.28
                        let imgHeight = 592.28 / contentWidth * contentHeight
                        let pageNumber = 1;
                        let pageData = canvas.toDataURL('image/jpeg', 1.0)
                        const titleHeight = 50; // 根据实际情况调整
                        let PDF = new JsPDF('', 'pt', 'a4')
                        if (leftHeight < pageHeight) {
                            PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
                            PDF.setPage(pageNumber)
                            PDF.setFontSize(10)
                            PDF.text(' ' + pageNumber, PDF.internal.pageSize.width - 10, PDF.internal.pageSize.height - 10, {
                                align: 'center'
                            });
                        } else {
                            while (leftHeight > 0) {
                                PDF.addImage(pageData, 'JPEG', 0,position, imgWidth, imgHeight);
                                PDF.setFontSize(10)
                                PDF.setPage(pageNumber)
                                PDF.text(' ' + pageNumber, PDF.internal.pageSize.width - 10, PDF.internal.pageSize.height -   10, {
                                    align: 'center'
                                });
                                PDF.text(name, 0, 0, {
                                    align: 'center'
                                });
                                if(flag == 'record') {
                                    // 页面多截出来一点,用标题盖住
                                    if(pageNumber == 1)leftHeight -= pageHeight
                                    else{
                                        leftHeight -= (pageHeight - titleHeight)
                                        PDF.addImage(titleImage, "JPEG", 16, 0, PDF.internal.pageSize.width - 31, titleHeight)
                                    }
                                    position -= (841.89 - titleHeight)
                                } else {
                                    leftHeight -= pageHeight
                                    position -= 841.89
                                }
                                if (leftHeight > 0) {
                                    PDF.addPage()
                                    pageNumber++;
                                }
                            }
                        }
                        PDF.save(title + '.pdf')
                        resolve('end')
                    }
                )
            })
        }
    }
}
遇到问题: 开始时怕会有异步问题,在第一个html2Canvas上面添加了await,发现生成的pdf会模糊,去掉即可。

标签:JsPDF,html2Canvas,插入,let,pageNumber,leftHeight,PDF,页面
From: https://www.cnblogs.com/mulu777/p/18593187

相关文章

  • 数据结构 (31)插入类排序
    前言     数据结构中的插入类排序是一种简单直观的排序算法,其核心思想是通过构建有序序列,将未排序的数据逐个插入到已排序的序列中,直到所有元素都排序完毕。一、基本思想    插入排序的基本思想是将数组分为已排序和未排序两部分,初始时,已排序部分只包含一......
  • 数据结构6.1--插入排序
    目录1.基本思想1.2直接插入排序1.3希尔排序(缩小增量排序)1.基本思想直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。实际中我们玩扑克牌,就用......
  • C# 检测USB设备插入的电脑
    https://mp.weixin.qq.com/s/_SQVTQH-ReBwLby-fmWbfg在许多应用场景中,能够实时检测USB设备的插入和移除对于提高用户体验和程序的响应性至关重要。本文将介绍如何在Windows环境下,使用C#编写一个简单的程序来监听USB设备的插入和移除事件。前提条件为了跟随本教程,您需要具备以下......
  • jQuery炫酷插入和移动元素动画特效插件
    MagicMove是一款效果非常棒的JQUERY炫酷插入和移动元素动画特效插件。元素的动画和过渡效果在如今的页面设计中对用户的体验至关重要。这款插件可以以非常平滑的方式在指定元素之前插入其它元素,并且当最右边的元素超出容器时会自动下移插入到下一行的第一个位置,整体效果非常不错......
  • 算法之旅:二叉树的删除、验证与插入(98,700,701,450)
    ......
  • 希捷硬盘插入电脑无反应数据恢复
    当希捷硬盘插入电脑无反应时,数据恢复是一个复杂但可能实现的过程。以下是一些建议的步骤,以帮助您尝试恢复数据:一、初步检查与准备1.检查连接:确保硬盘的数据线和电源线都已正确连接,没有松动或损坏。尝试更换数据线或连接到不同的USB端口,以排除连接问题。2.检查电源:对于外接电......
  • 向PostgreSQL数据库插入Date类型数据报错
    问题场景这个是公司项目进行更改,将项目的数据库从Oracle版本改为PostgreSQL版本时发生的错误。控制台报错内容。SQL:insertintotable(...,RQ,...)select...,?,...unionallselect...,?,...//(这里的...省略了其他字段,主要是RQ日期类型报错就没列出)Cause:org.post......
  • redis开门之批量插入pipeLine
    Redis开门之批量插入Pipeline下发数据同步到Redis中,数据少的话几千条,多则达百万级。其中一个场景是把下发的数据同步到Redis中,数据同步完成后,把数据写入到文件中,下发给客户,客户调用。某天......产品经理:小A,我发现我们这个数据整体下发的流程耗时有点长啊...从拉取数据到处理下发......
  • 35. 搜索插入位置
    题目:https://leetcode.cn/problems/search-insert-position/description/思路:二分查找Java代码:importjava.util.Scanner;classSolution{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);inta[]=newint[4];for(inti=0;i<a......
  • 【全流程】eclipce解决javaweb项目向数据库插入中文字符时乱码问题
    问题背景:使用jdk1.8tomcat9.0.72eclipce2021版本maven2-8-4问题描述:制作javaweb项目时想实现向数据库里增加值,传英文没问题,但是传中文时发现乱码,最开始我以为是传输问题解决过程:建议按流程自己检查一遍1.先检查数据库字母集2,检查eclipce软件设置,按我发的第三篇参考......