如何在不使用 gulp 工具的情况下在 Angular 中使用 pdfmake 自定义字体?

2023-11-29

安装自定义字体文件的标准方法是通过 gulp 工具,如下所述:https://pdfmake.github.io/docs/fonts/custom-fonts-client-side/

但如果这对你和我在 Windows 上失败了,这似乎是一个兔子洞,当然还有另一种方法来获取数据。是的。

选项1是修改vsf_fonts.jsandpdfmake.js 在node_modules/pdfmake/build 目录中。在第一个中,您将添加数据,在第二个中,您将修改 defaultClientFonts 对象。我承认我对此有点模糊,因为问题是,如果您运行过“npm update”或类似的操作,您将清除所有这些更改,下面的选项 2 更好,因为它保留了所有库存代码独自一人,最终会变得更简单。无需详细而准确地描述方法can工作,我,可能其他人,都建议不要这样做。

我的应用程序是 Angular 8 设置,生成检查 PDF 客户端。所以我需要一种 MICR 字体。 (编辑添加:当我升级到 Angular 9、Angular 10 和 Angular 11 时仍然有效。)

我提出的“如何使用自定义字体”的解决方案如下。


  • 首先,您需要获取 ttf 字体,并将其转换为 有用的东西。使用类似工具对其进行 Base64 编码https://www.base64decode.org/(请务必切换到encode和 向下滚动一点以将文件拖放到那里)
  • 现在您有一个如下文件:“encoded-20200619201035.txt”
  • 创建一个新文件,我称之为 GnuMICR.ttf.Base64.encoded.ts
  • 将编码文件的全部内容复制/粘贴到您导出的变量中。 MICR 是一种很小的字体,它有超过 6,000 个字符长,所以你看到的“.....”是 6,000 个章程,我不会用它来炸毁 stackoverflow,这会让它变得不可读

GnuMICR.ttf.Base64.encoded.ts 文件仅包含这一行:

export const strGnuMICR:string = "AAEAAAALAIAAA.....FDAUQCQ1IAAAA=";

现在,在您正在使用的主代码中,您需要在顶部包含常规 pdfmake:

import pdfMake       from 'pdfmake/build/pdfmake'
import pdfFonts      from 'pdfmake/build/vfs_fonts'

以及导入你的字体(我的字体位于我创建的一个名为 fonts 的子目录中。不要使用 asset 子目录,它将在 dev 中工作,但不会被拉入以进行正确的构建):

import { strGnuMICR } from './../../fonts/GnuMICR.ttf.Base64.encoded'

pdfmake 谈论“虚拟文件系统”,当您看到变量“时就暗示了这一点”vfs_fonts”,但实际上,它只是一个数组。您还会看到默认值是像“Roboto-Regular.ttf”这样的文件名,但这又不是虚拟文件系统上的文件:“Roboto-Regular.ttf”只是vfs_fonts.js 数组中数据的名称。为了清楚起见,您没有对实际文件执行任何操作,它全部使用您已经构建的 Base64 编码变量。

深入到您在主代码中进行工作的位置:

 generatePDF(){
 
 // this adds our base64 encoded data to the existing 'virtual file system'
 pdfFonts.pdfMake.vfs['GnuMICR_b64']=strGnuMICR
 
 // you're going to wipe out the standard stuff when you create this
 // variable, so we need to add the stock Roboto fonts back in. I 
 // set all fonts to the same thing, as "italic MICR" would be silly. 
 pdfMake.fonts = {
     Roboto: {
         normal:      'Roboto-Regular.ttf',
         bold:        'Roboto-Medium.ttf',
         italics:     'Roboto-Italic.ttf',
         bolditalics: 'Roboto-MediumItalic.ttf'
     },
     GnuMICR:{
         normal:      'GnuMICR_b64',
         bold:        'GnuMICR_b64',
         italics:     'GnuMICR_b64',
         bolditalics: 'GnuMICR_b64'
     },
 }
 // that's it, all the install work is done
 
 // build the pdf, using our new font via a style we define
 let docDefinition = 
     {
     content: [
         {text:'regular Roboto text'},
         {text:'and a line of MICR text follows:'},
         {text:'C11111111C A222222222A 333333333C 0123456789',style:'micr'},
         ],
     styles:{
         micr:{
             font: 'GnuMICR',
             fontSize: 12,
             }
         },
      defaultStyle:{
          font: 'Roboto',
          fontSize: 15,
          }
      };
 
     // annnnnnd generate that PDF!!
     pdfMake.createPdf(docDefinition).open();
  }      

好处:

  • 不必安装/对抗 gulp 工具
  • 您的字体存在于您的代码库中,因此可以进行版本控制
  • 挺容易

缺点:

  • 您不会将此字体添加到系统范围内可用的 pdfmake“库”中,因此每次编写一些代码来制作 PDF 时都会执行此操作。如果您正在编写数十种不同的 PDF 制作实用程序,那么其他方法可能更适合您。如果您只需要制作一个或几个,没什么大不了的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用 gulp 工具的情况下在 Angular 中使用 pdfmake 自定义字体? 的相关文章

  • Angular 6 中的 Http 错误处理

    我正在尝试使用 Angular 6 中的以下类来处理 http 错误 我从服务器收到 401 未经授权状态 但我没有看到控制台错误消息 HttpErrorsHandler ts 文件 import ErrorHandler Injectab
  • html 表格单元格的条件格式

    是否有现成的解决方案可以对 HTML 表格进行条件格式设置 通过条件格式 我更感兴趣的是根据该列或其他列 在同一个表中 的值 数字 将不同的颜色作为单元格背景 类似于我们在 Excel 条件格式 gt 色阶 gt 红黄绿中的内容 我想在通过
  • 了解 sort() 比较函数

    我正在使用一个电子商务平台 该平台无法重新排序产品属性字段的选项 这真的很糟糕 因为要插入新选项 您几乎必须删除所有现有选项并重新开始 我正在尝试在客户端进行操作 这是我正在处理的内容 这是针对鞋码的 9 EE 9 1 2 EE 10 EE
  • Angular with/Angular Material - 对话框主题损坏

    您好 我遇到了 Angular Material 主题在对话框组件中中断的问题 其中文本和其他组件的颜色未按应有的方式工作 在 app component 中 我有一个设置图标按钮来打开对话框 main settings dialog 但当
  • 在鼠标光标位置添加 cytoscape 节点

    我想在画布上的单击事件上的鼠标箭头位置添加一个 cytoscape 节点 我怎样才能做到这一点 我的方法 效果不太好 我可以通过单击创建一个节点 但无法确保创建的节点的位置位于我单击的位置 使用这样的东西 cy click function
  • Web 组件 - 服务/非 html 组件

    所以我来自 Angular 想看看如何创建vanilla Web components 现在 从 Angular 开始 我们倾向于将事物分开 组件 充当 HTML CSS 和一些 javascript 然后是 服务 主要负责收集数据和执行不
  • javascript jquery 使用脚本更改脚本的src

    我有一个 JavaScript 脚本 它有一个 src 元素 这个 src 是一个 url 我想使用 javascript 更改它 一次更改为其他内容 或者动态创建它 使用 javascript jquery 动态创建脚本元素的最佳方法是什
  • 如何动态突出显示网页上的字符串?

    我想创建带有 url 的页面 例如 http xyzcorp schedules 2015Aug24 Aug28 Jim Hawkins http xyzcorp schedules 2015Aug24 Aug28 Billy Bones
  • Angular 5 Http拦截器刷新JWT令牌

    我已经实现了令牌保存 检索的逻辑 并且我也有刷新调用 问题是 当我在 HttpInterceptor 中拦截 403 时 同时进行的其他调用也会刷新令牌 我很乐意保留这些调用 直到我的令牌刷新为止 创建我所说的请求 信号量 Injectab
  • 如何以编程方式退出或关闭 Javascript UWP 应用程序? (Windows 10)

    我制作了一个游戏 它需要自己的退出按钮 我无法使用CoreApplication Exit https msdn microsoft com en us library windows apps windows applicationmod
  • 有没有办法将变量从 javascript 导入到 sass 或反之亦然?

    我正在制作一个依赖于块概念的 CSS 网格系统 所以我有一个基本文件 例如 max columns 4 block width 220px block height 150px block margin 10px 它被 mixin 使用 m
  • 了解 JavaScript - 资源

    使用 StackOverflow 的微型 Digit Blog 功能进行描述here https stackoverflow com about 我想发布以下我刚刚看到的 我觉得很有趣的谷歌技术谈话视频 我一直在理解 javascript
  • Angular 2 获取当前路线

    所以我需要以某种方式检查我是否在主页上执行某些操作 而在其他页面上则不执行此操作 该组件也在所有页面上导入 如果我在主页上 如何检测该组件 Thanks 尝试这个 import Router from angular router expo
  • 在 React Navigation 中将 props 传递给自定义抽屉导航器

    在反应导航抽屉菜单中 我想显示用户名 John Doe 它处于我的主要组件的状态 Router 我怎样才能将自定义抽屉内容组件传递给它 额外信息 我从 AsyncStorage 中获取此名称 组件已挂载 这是我的代码 export defa
  • 在 Fabric.js 中按宽度/高度在另一个画布对象内居中和缩放画布对象

    Goal 将一个对象 水平和垂直 置于另一个对象 矩形或组 的中心canvas via Fabric js或者通过Javascript保持原始对象的长宽比相同 但也不超过父对象的宽度 高度比例 父对象 矩形或组 不会居中于canvas元素
  • 如何打开弹出窗口并用父窗口中的数据填充它?

    如何使用 JavaScript jQuery 使用父页面中 JS 变量的数据填充弹出窗口 在我的示例中 我有一个文件名数组 我在父窗口中最多列出五个 如果还有更多 我想提供一个链接来打开弹出窗口并列出数组中的每个帖子 因此 如果我打开一个包
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • 使用 AngularJS 多部分表单数据将文件上传到 Google Cloud Storage

    我正在尝试使用 AngularJS 中指定的多部分方法将图像文件上传到 Google Cloud Storagehttps cloud google com storage docs json api v1 how tos upload m
  • JavaScript:测试与执行

    我想知道检查字符串 例如邮件 密码等 的最佳方法是什么 i exec a vs i test a exec返回值 test true test 1 way var mail req body mail if check mail exec
  • 如何使用 jQuery 或 JavaScript 聚焦 或 标签?

    for var i 0 i

随机推荐