在 jsPDF 中是否可以包含自定义字体?
使用基本库,如果我控制台输出 'doc.getFontList()',我会得到:
Courier, Helvetica, Times, courier, helvetica, times
但是,假如我想使用 'Comic Sans'(虽然我不会这么做),这可以实现吗?
更好的是,我能否使用一个本地存储的并在网站上使用 @font-face 声明的字体?
在 jsPDF 中是否可以包含自定义字体?
使用基本库,如果我控制台输出 'doc.getFontList()',我会得到:
Courier, Helvetica, Times, courier, helvetica, times
但是,假如我想使用 'Comic Sans'(虽然我不会这么做),这可以实现吗?
更好的是,我能否使用一个本地存储的并在网站上使用 @font-face 声明的字体?
我发现这可以通过修改jsPDF.js
来公开现有的addFont
方法实现。
在jsPDF.js
中,查找:
//---------------------------------------
// Public API
添加以下内容:
API.addFont = function(postScriptName, fontName, fontStyle) {
addFont(postScriptName, fontName, fontStyle, 'StandardEncoding');
};
为了更加清晰,我把这个方法放到了其他字体方法的附近 - API.setFont
, API.setFontSize
, API.setFontType
等。
现在在你的代码中,使用:
doc.addFont('ComicSansMS', 'Comic Sans', 'normal');
doc.setFont('Comic Sans');
doc.text(50,50,'Hello World');
这对我来说有效,使用@font-face字体在加载jsPDF之前包含在CSS中,以及系统字体。可能有更好的方法使用jsPDF的插件框架来做到这一点,但是这个快速而粗糙的解决方案至少应该让您开始。
请注意,doc.getFontList()
将不会显示添加的字体:
// TODO: iterate over fonts array or return copy of fontmap instead in case more are ever added.
借助最新版本的jsPDF
(1.5.3),这似乎变得更加容易:
如果你在文件夹jsPDF-master
> fontconverter
中查看,会发现一个名为fontconverter.html
的文件。在浏览器中打开该文件,并使用“浏览...”按钮浏览并选择你的.ttf
字体文件。
点击“Create”按钮。
页面将提供“下载”操作以保存一个.js
文件,类似于RopaSans-Regular-normal.js
。需要将其包含在生成PDF的页面中。个人建议放置在页面头部(请注意
这是我正在使用的解决方案...
首先,正如其他人所提到的 - 你需要这两个库:
接下来 - 第二个库要求你至少提供一个名为default_vfs.js
的自定义字体文件。我正在使用两种自定义字体 - Arimo-Regular.ttf 和 Arimo-Bold.ttf - 都来自Google Fonts。因此,我的default_vfs.js
文件看起来像这样:
(
(function (jsPDFAPI) {
"use strict";
jsPDFAPI.addFileToVFS('Arimo-Regular.ttf','[Base64-encoded string of your font]');
jsPDFAPI.addFileToVFS('Arimo-Bold.ttf','[Base64-encoded string of your font]');
})(jsPDF.API);
default_vfs.js
中。 <script src="js/jspdf.min.js"></script>
<script src="js/jspdf.customfonts.min.js"></script>
<script src="js/default_vfs.js"></script>
const doc = new jsPDF({
unit: 'pt',
orientation: 'p',
lineHeight: 1.2
});
doc.addFont("Arimo-Regular.ttf", "Arimo", "normal");
doc.addFont("Arimo-Bold.ttf", "Arimo", "bold");
doc.setFont("Arimo");
doc.setFontType("normal");
doc.setFontSize(28);
doc.text("Hello, World!", 100, 100);
doc.setFontType("bold");
doc.text("Hello, BOLD World!", 100, 150);
doc.save("customFonts.pdf");
addFont()
方法中,三个参数分别是:
default_vfs.js
文件中的addFileToVFS()
函数中使用的字体名称setFont()
函数中的字体名称setFontType()
函数中的字体样式async function loadFont(src, name, style, weight) {
const fontBytes = await fetch(src).then(res => res.arrayBuffer());
var filename = src.split('\\').pop().split('/').pop();
var base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(fontBytes)));
var callAddFont = function () {
this.addFileToVFS(filename, base64String);
this.addFont(filename, name, style, weight );
};
jsPDF.API.events.push(['addFonts', callAddFont]);
}
这样调用:
await loadFont("/css/fonts/exo-2-v9-latin-ext_latin-italic.ttf", "Exo-2", "italic", 400);
await loadFont("/css/fonts/exo-2-v9-latin-ext_latin-regular.ttf", "Exo-2", "normal", 400);
await loadFont("/css/fonts/exo-2-v9-latin-ext_latin-500.ttf", "Exo-2", "normal", 500);
await loadFont("/css/fonts/exo-2-v9-latin-ext_latin-500italic.ttf", "Exo-2", "italic", 500);
一旦你从fontconverter.html获得了.js文件,你可以像这样在typescript中导入它:
import fontref = require('path/to/font/CustomFont-normal.js')
然后,您只需要“调用”fontref
即可加载字体:
makePdf() {
let doc = new jsPDF();
fontref; // 'call' .js to load font
doc.getFontList(); // contains a key-value pair for CustomFont
doc.setFont("CustomFont"); // set font
doc.setFontType("normal");
doc.setFontSize(28);
doc.text("Hello", 20, 20);
window.open(doc.output('bloburl')); // open pdf in new tab
}
https://github.com/MrRio/jsPDF/blob/master/README.md#use-of-utf-8--ttf
//使用必要的配置,请参阅文档http://raw.githack.com/MrRio/jsPDF/master/docs/jsPDF.html
import MuliSemiB64 from "../functions/MuliSemiB64";
let doc = new jsPDF({
orientation: "p",
unit: "px",
format: "a5",
});
doc.addFileToVFS("MULI-SEMIBOLD.TTF", MuliSemiB64());
//MuliSemiB64()是一个函数,返回Muli ttf文件的base64字符串格式,将你的字体ttf文件转换并复制该字符串,保存到一个变量中,并使用该函数返回该字符串。使用像https://www.giftofspeed.com/base64-encoder/这样的网站进行转换。
doc.addFont("MULI-SEMIBOLD.TTF", "Muli-Semi-Bold", "Semi-Bold");
doc.setFont("Muli-Semi-Bold", "Semi-Bold");
doc.text("Have Fun :*", 35, 25);
npm i jspdf-customfonts
然后在index.html的head标签中添加以下文件以进行默认配置。script src="https://unpkg.com/jspdf@latest/dist/jspdf.min.js"></script>
<script src="dist/jspdf.customfonts.min.js"></script>
<script src="dist/default_vfs.js"></script>