jsPDF/html2canvas 通常会丢失空格和文本错位

2024-02-27

我正在使用 html2canvas 和 jsPDF 生成 pdf 客户端。无论我选择什么设置,我都会在 html 到 pdf 渲染中丢失字母空格。

有设置可以解决这个问题吗?我已经检查了 API 并更改了我能想到的所有可能的设置,但间距没有改变。

显示空间损失的图像

之前(在浏览器中为 html):

之后(pdf):

Code

代码使用 html2canvas 和 jsPDF。

async pdfOrder() {
    const doc = new jsPDF({
      orientation: "p",
      unit: "mm",
      format: "a4",
      precision: 5
    });
    const options = {
      background: "white",
      scale: 3
    };

    for (let i = 0; i < this.numberOfPages; i++) {
      const div = document.getElementById("html2Pdf-" + i.toString());
      // create array of promises
      await this.addPage(doc, div, options, i);
    }

    // Name of pdf
    const fileName = "XXX.pdf";

    // Make file
    await doc.save(fileName);
  }

  private addPage(
    doc: jsPDF,
    div: HTMLElement,
    options: any,
    pageNumber: number
  ): any {
    // return promise of canvas to a page
    return html2canvas(div, options).then(canvas => {
      // Converting canvas to Image
      const imgData = canvas.toDataURL("image/PNG");
      // Add image Canvas to PDF
      const bufferX = 4;
      const bufferY = 4;
      const imgProps = (doc as any).getImageProperties(imgData);
      const pdfWidth = doc.internal.pageSize.getWidth() - 2 * bufferX;
      const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
      if (pageNumber > 0) {
        doc.addPage();
      }
      doc.addImage(
        imgData,
        "JPEG",
        bufferX,
        bufferY,
        pdfWidth,
        pdfHeight,
        undefined,
        "FAST"
      );
      doc.setPage(pageNumber);
      const pdfOutput = doc.output();
      // using ArrayBuffer will allow you to put image inside PDF
      const buffer = new ArrayBuffer(pdfOutput.length);
      const array = new Uint8Array(buffer);
      for (let i = 0; i < pdfOutput.length; i++) {
        array[i] = pdfOutput.charCodeAt(i);
      }
    });
  }

添加非零值letter-spacingcss 似乎修复了。

letter-spacing: 0.01px;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jsPDF/html2canvas 通常会丢失空格和文本错位 的相关文章

  • 如何显示 GroupList 的 FormArray?

    我正在尝试制作一个交互式表单 在每一行上列出一个项目以及一个删除按钮 在我的示例中称为 verwijderen 这些项目是从数据库中检索的 并且每个项目都实例化为名为的自定义对象LaborPeriod 然后这些对象被转化为FormGroup
  • Angular 停止 Enter 键提交

    I am trying to stop the Enter from submitting my button and rather make it point to another function I tried trapping th
  • 没有导出的成员/节点模块

    我刚刚开始使用 5 分钟快速入门找到的 Angular 2 Typescripthere https angular io docs ts latest quickstart html 我遇到了一个看起来很常见的问题 但可能有点不同 我遇到
  • 如何转义角度 HttpParams?

    在 Angular 服务中 我使用 HttpParams 将字符串发送到服务 get phone string Observable
  • Angular 2 重复标头

    使用时出现重复标头问题
  • 创建 AoT 兼容的服务工厂

    我正在尝试为缓存服务创建一个服务工厂 主要要求是每次可以使用不同的字符串实例化单个服务 最终的结果会有多个cache每个服务都由唯一定义databaseName 每个缓存可以有一个或多个stores也由唯一定义storeName 其他服务将
  • 观众:覆盖单个测试的提供者(角度通用)

    我构建了一个小型角度应用程序 现在正在编写单元测试 到目前为止一切顺利 但是当我尝试测试我的 authGuard 时 我遇到了一些问题 我在用观众 https github com ngneat spectator 我在规范的提供者部分中提
  • Angular 6 - 找不到模块“@angular-devkit/build-angular”

    更新到 Angular 6 0 1 后 出现以下错误ng serve Could not find module angular devkit build angular from home Projects myProjectName E
  • FakeAsync/tick (Async/whenStable) 与 detectorChanges()

    您能帮我区分这两件事吗 根据我的理解 如果你只使用 observable 你可以使用 detectorChanges 因此 您可以直接更改组件属性或监视服务调用并返回可观察的值 然后调用 detectorChanges 更改将在 html
  • 原生元素聚焦功能不起作用

    我试图通过单击按钮自动聚焦在输入元素上 请参阅打字稿 ViewChild envFilter envFilter ElementRef onFilterSelect this envFilter nativeElement focus 在
  • 如何在 Angular 项目中使用 Bootstrap?

    我开始我的第一次Angular应用程序和我的基本设置已完成 我怎样才能添加引导程序我的申请 如果您可以提供一个示例 那么这将是一个很大的帮助 如果您使用Angular CLI要生成新项目 还有另一种方法可以使 bootstrap 可访问角度
  • Angular Libraries Monorepo:是否可以为每个库使用不同的版本?

    只是一个简单的问题 我似乎找不到答案 我正在尝试构建一个应该能够使用 angular cli v8 的 monorepo 但仍然能够编译和构建为 v2 v3 v4 等制作的库 主要是组件和服务 版本之间发生了很多变化 所以让我们举个例子 V
  • 如何将窗口注入到服务中?

    我正在用 TypeScript 编写一个 Angular 2 服务 它将利用localstorage 我想注入对浏览器的引用window对象到我的服务中 因为我不想引用任何全局变量 例如 Angular 1 x window 我怎么做 这目
  • 如何使用深度等于 (Angular 7)

    通过 VS Code 自动导入 import deepEqual require deep equal 不起作用 错误 TS1202 定位时无法使用导入分配 ECMAScript 模块 考虑使用 import as ns from mod
  • Angular - 如何解析 event.path 内的对象

    现在这是一个很难解释的复杂问题 我会尽力解释 我有一个弹出窗口 我想从中唯一地标识单击事件是来自弹出窗口内部还是外部 我的第一个方法 我用一个包住了整个弹出框div与id 说 独特 因此 我将单击事件与主机侦听器绑定 我将为其获取事件对象
  • 可从 Angular2 中的

    使用 Angular 2 从按钮的 onclick 事件创建可观察对象的首选方法是什么 我不确定从组件代码中的 DOM 获取本机元素是否被认为是最佳实践 我该怎么做 或者是否还有其他我不知道的快捷方式 别想太多 ViewChild butt
  • 在业力测试中按类名获取两个div(Angular 4.0)

    我有这样的看法 div div class header title Example title 1 div div div div class header title Example title 2 div div 在我的业力测试中 我
  • 无法读取未定义的“触及”属性

    为什么我会收到此错误无法读取未定义的属性 为什么无法读取formName controls email touched但它能够阅读formName get custDetails touched
  • 找不到“节点”的类型定义文件

    更新 Angular Webpack 和 TypeScript 后出现奇怪的错误 知道我可能会错过什么吗 当我使用 npm start 运行应用程序时 出现以下错误 at loader Cannot find type definition
  • 如何读取firebase推送通知内容并在ionic2中触发方法?

    是否可以访问push notificationionic 2 中的内容并在通知到达时执行一堆代码或event fire 我建议使用科尔多瓦插件 firebase https github com arnesson cordova plugi

随机推荐

  • Appmaker组访问权限供开发人员将组添加到角色

    我在这篇文章中找到了一些有用的信息 将 google 群组添加到角色 https stackoverflow com questions 49573392 adding google groups to roles 51430901 514
  • 如何检查字典是否是另一个复杂字典的子集

    我需要验证另一个字典是否是另一个字典的子集 有一个技巧 在这些字典中有字典数组 超集 dct 1 x x y t 123 a a subset dict 2 x x y t 123 from 检查字典是否是另一个字典的子集的递归函数 htt
  • 如何在 WinUI 3 中从 C# 调用 Powershell 函数

    我正在尝试调用 PowerShell 脚本文件中的函数 我在用WinUI 3 我在调试器输出中得到难以理解的输出 并且 PowerShell 脚本似乎根本没有执行 我已验证当我直接从 PowerShell 运行 PowerShell 脚本
  • C# 最高字符串

    这看起来很微不足道 但我没有通过谷歌找到答案 我正在寻找排序字符串列表末尾的信号量字符串的高值 在我看来 char highest ToString 应该这样做 但这比较低 而不是高 显然 创建尽可能高的字符串是不可能的 因为它总是低于相同
  • 在 spring-mvc 上处理密码确认

    我正在 spring mvc 中进行用户增删改查 我的模型具有以下属性 private Long id private String password private String username private Collection
  • 电子邮件营销经理如何报告退回的电子邮件?

    谁能指出我如何处理捕获退回电子邮件信息的正确方向 我正在考虑编写一个电子邮件活动经理 并且希望能够报告该数据 您可以编写一个应用程序来轮询坏邮件文件夹以识别退回的电子邮件 发送电子邮件后 您应该等待一段时间 然后再检查电子邮件是否已送达或退
  • pandas数据框的条件过滤

    我有一个关于足球结果的熊猫数据框 数据帧的每一行代表一场足球比赛 每场比赛信息如下 Day WinningTeamID LosingTeamID WinningPoints LosingPoints WinningFouls 1 13 1
  • 如何输出DOM文档?

    也许我遗漏了一些东西 但是这段代码中的 DOM 对象是空的 input file get contents http www google com doc new DOMDocument doc gt loadHTML input supr
  • 如何在 MLPClassifier 中设置初始权重?

    我找不到设置神经网络初始权重的方法 有人可以告诉我如何设置吗 我正在使用 python 包 sklearn neural network MLPClassifier 这是供参考的代码 from sklearn neural network
  • JS 闭包上下文对象的生命周期?

    背景 我正在尝试移植长生不老药演员模型语言原语转换为 JS 我想出了一个解决方案 用JS 来模拟receiveelixir 关键字 使用 接收器 函数和生成器 这是一个简化的实现和演示 向您展示这个想法 APIs type ActorRef
  • 即使使用相同的密钥库,更新 apk SHA1 也会有所不同

    I have uploaded my app to Goggle Play few months back after signing it with a release keystore I have stored that Keysto
  • 检查 exec.Cmd 是否在 Go 中运行完毕

    我正在尝试检查是否exec Cmd 在跑在这些场景中 在我真正开始命令之前 命令开始之后但完成之前 命令完成后 这将允许我终止该命令 如果它正在运行 以便我可以使用不同的参数再次启动它 下面是一个简单的用例 c exec Command o
  • 网络浏览器无法打开新窗口

    我刚刚找到了一份远程工作的新工作 我必须通过打开一堆页面并登录来开始我的一天 我很想自动化这个过程 因为它可能有点乏味 我想保留我的个人浏览窗口并打开一个包含我需要的所有页面的新窗口 这是我想做的事情的要点 import webbrowse
  • iOS 8 / Safari 8 不支持 ASP.NET AJAX 扩展

    iOS 8 推出后 我们的网站突然停止运行 ASP NET UpdatePanel 内的每次回发都会导致一个空页面 如果在 Safari 8 在 Mac 上 中将用户代理设置为 Chrome 它仍然有效 我已经发现 一些 ScriptRes
  • 受歧视工会没有多余的财产检查

    给定的是受歧视的联合类型S1 S2 S3 type S1 d1 foo type S2 d1 bar isSuccess true type S3 d1 baz isSuccess false errorMessage string typ
  • Google App Engine:添加到任务队列比执行数据存储写入更快吗?

    我正在尝试通过将后台任务添加到任务队列而不是立即执行操作来优化应用程序的一些面向用户的部分 对于 CPU 密集型任务来说 这样做是一个明显的选择 但是如果只是保存数据呢 平均而言 执行 taskqueue add 操作或 db put 操作
  • 如何切换标记?

    我制作标记的代码 for var marker in markers var posMarker new google maps Marker position new google maps LatLng markers marker l
  • 重定向多个标准输入?

    我有三个文件 名为一 二 三 其中一项包含 1 3 2 两个包含 4 6 5 三包含 7 9 8 当我发出以下命令时 sort lt One lt Two lt Three 我得到输出 7 8 9 但是当我发出以下命令时 sort One
  • 使用 Inno Setup 安装时应用程序无法运行

    我正在开发桌面数据库应用程序 使用rdlc报告和reportviewer 开发过程中一切顺利 reportviewer 可以顺利显示所有数据 我使用 Inno Setup 部署应用程序 但是当我安装该应用程序时 报告查看器不显示数据 当数据
  • jsPDF/html2canvas 通常会丢失空格和文本错位

    我正在使用 html2canvas 和 jsPDF 生成 pdf 客户端 无论我选择什么设置 我都会在 html 到 pdf 渲染中丢失字母空格 有设置可以解决这个问题吗 我已经检查了 API 并更改了我能想到的所有可能的设置 但间距没有改