使用 Javascript 生成高质量 PDF (jspdf+html2canvas)

2024-03-23

我一直在尝试通过单击页面上的按钮从 HTML 页面转换并生成 PDF,该按钮会使用两个流行的插件自动生成并强制下载页面的 PDF * JSPDF * HTML2Canvas 到目前为止,一切正常,但生成的 PDF 总是模糊且质量不高 导入 js 文件(jquery、html2canvas、jspdf)后。这是我的 JavaScript 代码

function CreatePDFfromHTML() {
    var HTML_Width = $(".html-content").width();
    var HTML_Height = $(".html-content").height();
    var top_left_margin = 15;
    var PDF_Width = HTML_Width + (top_left_margin * 2);
    var PDF_Height = (PDF_Width * 1.5) + (top_left_margin * 2);
    var canvas_image_width = HTML_Width;
    var canvas_image_height = HTML_Height;

    var totalPDFPages = Math.ceil(HTML_Height / PDF_Height) - 1;

    html2canvas($(".html-content")[0]).then(function (canvas) {
        var imgData = canvas.toDataURL("image/jpeg", 1.0);
        var pdf = new jsPDF('p', 'pt', [PDF_Width, PDF_Height]);
        pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin, canvas_image_width, canvas_image_height);
        for (var i = 1; i <= totalPDFPages; i++) { 
            pdf.addPage(PDF_Width, PDF_Height);
            pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height*i)+(top_left_margin*4),canvas_image_width,canvas_image_height);
        }
        pdf.save("invoice_<?php echo $trackingNumber ;?>.pdf");
        $(".html-content").hide();
    });
}

我如何调整代码以使 html2canvas 将页面转换为质量更好的图像(消除模糊并使生成的 PDF 文件更好)


经过几天的搜索,我终于找到了一种通过将 HTML_weight 和 HTMLheight 乘以 3 来提高质量的方法,这是新代码

function CreatePDFfromHTML() {
    var HTML_Width = $(".html-content").width()*3;
    var HTML_Height = $(".html-content").height()*3;
    var top_left_margin = 15;
    var PDF_Width = HTML_Width + (top_left_margin * 2);
    var PDF_Height = (PDF_Width * 1.5) + (top_left_margin * 2);
    var canvas_image_width = HTML_Width;
    var canvas_image_height = HTML_Height;

    var totalPDFPages = Math.ceil(HTML_Height / PDF_Height) - 1;

    html2canvas($(".html-content")[0]).then(function (canvas) {
        var imgData = canvas.toDataURL("image/jpeg", 1.0);
        var pdf = new jsPDF('p', 'pt', [PDF_Width, PDF_Height]);
        pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin, canvas_image_width, canvas_image_height);
        for (var i = 1; i <= totalPDFPages; i++) { 
            pdf.addPage(PDF_Width, PDF_Height);
            pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height*i)+(top_left_margin*4),canvas_image_width,canvas_image_height);
        }
        pdf.save("invoice_<?php echo $trackingNumber ;?>.pdf");
        $(".html-content").hide();
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Javascript 生成高质量 PDF (jspdf+html2canvas) 的相关文章

  • 单击时阻止 jquery TABS 跳跃/向上滚动?

    我使用的引擎调用 jquery tabs js 脚本来处理选项卡功能 问题是 只要选项卡位于页面顶部并且您单击链接 它们就会快速向下滚动到页面底部 我已经尝试解决这个问题几个小时了 所有解决方案都指向类似的答案 但没有一个对我有用 fn t
  • 如何正确转义 HTML 属性中的引号?

    我在网页上有一个下拉菜单 当值字符串包含引号时 该下拉菜单会损坏 其值为 asd 但在 DOM 中它始终显示为空字符串 我已经尝试了所有我知道的方法来正确转义字符串 但无济于事
  • 无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)

    我正在尝试使用苹果的cloudkit js文件以建立与 CloudKit 的服务器到服务器连接 然而 尽管配置混乱了几个小时 我似乎无法让 CloudKit 认为我的请求有效 我的配置逻辑非常简单 const privateKeyFile
  • 开始使用 Three.js 中的行进立方体

    我是 Three js 的新手 正在寻找教程来帮助我开始了解如何在 Three js 中使用 Marching Cubes 到目前为止 我在 Three js 中看到的一些使用它的项目对我来说有点复杂 所以一个简单的教程会很好 谢谢 像您一
  • 为什么有人将(Apache mod_expires 参数)ExpiresByType 设置为“访问加 0 秒”?

    在审查答案时这个帖子 https stackoverflow com questions 9933012 how to use mod headers and mod expires to cache 我不明白为什么这里使用 0 秒作为最佳
  • ajax 调用成功后点击链接 href

    我有一个正常的链接 a href http www google com class continue Continue a 我已将点击绑定到一个事件来发布 ajax 请求 如下所示 continue click function ajax
  • Twitter bootstrap 远程模式每次都显示相同的内容

    我正在使用 Twitter bootstrap 我已经指定了一个模式 div class modal hide div class modal header div div
  • 是否可以向 JavaScript 函数发送可变数量的参数?

    是否可以从数组向 JavaScript 函数发送可变数量的参数 var arr a b c var func function debug alert arguments length for arg in arguments alert
  • 在 Typescript 中从基类创建子类的新实例[重复]

    这个问题在这里已经有答案了 我想创建新实例Child班级来自Base类方法 这有点复杂 但我会尽力解释 这是一个例子 class Base constructor clone Here i want to create new instan
  • 使用点符号将数字传递到函数中

    如果我有一个对象和函数 var obj 1234 example sample 5678 example sample function example num str if obj num hasOwnProperty str manip
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • 仅使用 CSS 向电话号码添加空格

    我有一个生成 HTML 电话号码的页面 如下所示 div class phone 01987123456 div 我想要的只是在数字内添加一个空格 如下所示 01987 123456 生成的数字和 HTML 始终相同 但我只能访问客户端代码
  • 使用 Google 地图 API 进行反向地理编码

    我正在研究 JavaScript Google Map API 版本 3 更准确地说 正在研究反向地理定位 在 的帮助下官方文档 http code google com intl fr apis maps documentation ge
  • 主干集合排序

    我制作了我的第一个主干应用程序 但在集合排序方面遇到了一些问题 使用这个后 var SortedFriends MyFriends sortBy function friend return friend get uid console l
  • 如何制作实时jquery效果?

    我想制作一个实时提要阅读器 并且我想要一个解决方案 使新项目无需刷新页面即可出现 并且具有像friendfeed一样的滚动效果 你可以在这里看到我在说什么 http www vimeo com 4029954 http www vimeo
  • jQuery clone() 复制数据...有时...?

    使用下面的示例 我有一个tr我正在复制 它包含一个 jQueryautocomplete 第一次克隆时 自动完成功能不起作用 因为附加的data items 一片空白 第二次单击 添加 按钮时 自动完成功能将起作用 此后 再次单击 添加 会
  • 为什么-标签没有关闭

    这是一个普遍问题 我的教授都无法回答 为什么我不必关闭 HTML 中的标签 所有其他标签都必须关闭 例如 or 那么为什么不呢 首先 它根本不是一个标签 在名义上基于 SGML 或 XML 的 HTML 版本中 它是文件类型声明 它具有在
  • html 下钻下拉所选值未插入 MYSQL

    我有两个下拉列表 首先从数据库下拉填充 根据第一个下拉列表的选定值从数据库填充第二个下拉列表 document ready function c change function var c1 c selected text if c1 aj
  • 将记录转换为序列化表单数据以通过 HTTP 发送

    有没有办法转换此记录 TError record code Word message String end TState record caption String address Cardinal counters TArray
  • CSS 未使用 req.params 或其他内容加载

    我对节点 表达等非常陌生 我制作了一个博客应用程序 但遇到了问题 我正在使用 mongoose node express 和 ejs 当我打电话时 router get posts function req res Post find fu

随机推荐

  • 升级到 Babel 7:无法读取 null 的属性“绑定”

    我刚刚升级到Babel 7 https babeljs io docs en index html 从 6 开始 运行以下命令 npm remove babel cli npm install save dev babel cli babe
  • 对象 scalatest 不是包 org 的成员

    我想在 scalatest 中为我的玩具项目编写一些测试 当我使用sbt我通过安装了scalatestlibraryDependencies org scalatest scalatest 2 0 M5 test 在我的项目根目录中buil
  • “foldp”是否违反了 FP 的不可变状态原则?

    我正在学习 Elm七周内增加七种语言 http pragprog com book 7lang seven more languages in seven weeks 下面的例子让我很困惑 import Keyboard main lift
  • vim 中嵌入 awk 语法高亮

    我有一个语法文件 用于突出显示 bash 脚本中嵌入的 awk syn include AWKScript syntax awk vim syn region AWKScriptCode matchgroup AWKCommand star
  • PHPMailer 不发送 CC 或 BCC

    我已经测试以下代码几个小时了 该电子邮件将发送到通过以下方式添加的地址 mail gt AddAddress 在收到的电子邮件中注明了抄送 但抄送人没有收到电子邮件 我到处找过 但找不到解决办法来解释为什么会发生这种情况 我已经运行了测试
  • 获取 iPhone 上已安装应用程序的列表

    有没有办法 某些 API 来获取 iPhone 设备上已安装应用程序的列表 在搜索类似问题时 我发现了一些与url registration 但我认为必须有一些 API 来执行此操作 因为我不想对应用程序执行任何操作 我只想要列表 不 应用
  • 子域名指向同一IIS中的不同网站

    我有一个 IIS 服务器 运行一个默认网站 一个在 LandingPage 路径中运行的 React 应用程序以及一个由 api 中的 React 应用程序使用的 API 所以基本上我有 localhost 80 gt 默认 MVC 网站
  • C++ 类使用未定义类型

    我有一个我制作的类 我在类上方的线程中使用它 即使我在顶部做了一个类的原型 它仍然会抛出这些错误 错误 C2027 使用未定义类型 foo class foo DWORD WINAPI demo LPVOID param foo a cla
  • 如何在 React Native 中获取“打开前的键盘高度”?

    环境 React Native 0 60 4 Problem 我正在开发聊天应用程序 聊天有表情符号选择器 表情符号选择器必须与键盘具有相同的高度 我需要在键盘打开之前获取键盘的高度 我尝试使用键盘侦听器 但它们在打开后给出高度 我的最终目
  • 通过 Javascript 修改第 n 个子级

    是否可以使用纯js动态修改css nth child属性 tile nth child 10n 1 clear both 例如 像这样使用 js 添加 正如Pariket Thakur所说 你可以使用document querySelect
  • Spring Data (Spring Boot) 和 Joda Time 字段映射的问题

    我有一些带有 Joda DateTime 字段的实体 当尝试启动应用程序时 我收到以下错误 org springframework beans factory BeanCreationException Error creating bea
  • Hibernate Criteria 按子记录计数排序

    我有两个类 新闻和评论 它们之间具有一对多关联 我正在使用 Hibernate Criteria 从数据库中获取新闻 我希望我的新闻按照评论数排序 session createCriteria News class n criteria c
  • sql select语句给出列错误

    当我使用 SELECT order id from order where order id U687678601 我收到错误 错误 1054 未知列 where 子句中的 U687678601 但是当我输入时 SELECT order i
  • 是否有一个包含所有 Bootstrap 元素的巨大“资产页面”,我可以重新设置样式? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 http twitter github com bootstrap base css html htt
  • 在android的子目录中创建文件

    是否可以使用android中的openFileOutput方法在 data data packagename files 目录下创建的子目录中创建文件 即 data data packagename files 目录中有一个名为 text
  • Kohana——命令行

    我正在尝试在我的 Web 应用程序中 假分叉 一个进程 通过 SMTP 发送电子邮件 并且该应用程序是基于 Kohana 构建的 command test email exec php index php command gt dev nu
  • django-orm 不区分大小写的顺序

    我知道 我可以从 DJango ORM 运行不区分大小写的搜索 喜欢 User objects filter first name contains jake User objects filter first name contains
  • Android Compose 设置视图高度(以像素为单位而不是 dp)

    我想以像素而不是 dp 为单位设置视图高度 Box modifier Modifier height 100 dp 在此示例中 框的高度设置为 100 dp 并且修改器函数仅接受 dp 如何设置 Box 的高度 以像素为单位 Kilian
  • 在 Swift 中链接多个异步函数

    我正在尝试编写一系列函数 在要求用户确认某些内容之前验证用户的信息 想象一个购物应用程序 我首先必须检查用户是否添加了卡 然后我必须检查他们是否有足够的余额 然后我可以要求他们确认付款 我可以编写异步方法来检查卡 例如 func check
  • 使用 Javascript 生成高质量 PDF (jspdf+html2canvas)

    我一直在尝试通过单击页面上的按钮从 HTML 页面转换并生成 PDF 该按钮会使用两个流行的插件自动生成并强制下载页面的 PDF JSPDF HTML2Canvas 到目前为止 一切正常 但生成的 PDF 总是模糊且质量不高 导入 js 文