Est-il possible d'inclure des polices personnalisées dans jsPDF?
Avec la bibliothèque de base, si je console le journal 'doc.getFontList ()' j'obtiens:
Courrier, Helvetica, Times, courrier, helvetica, times
Mais, disons que je veux utiliser 'Comic Sans' (pas que je le ferais; o)) est-ce possible?
Encore mieux, pourrais-je utiliser une police stockée localement et déclarée sur le site avec @ font-face?
J'ai trouvé que c'était possible en modifiant jsPDF.js
Pour exposer la méthode addFont
existante dans l'API publique.
Dans jsPDF.js
, Recherchez:
//---------------------------------------
// Public API
Ajoutez ce qui suit:
API.addFont = function(postScriptName, fontName, fontStyle) {
addFont(postScriptName, fontName, fontStyle, 'StandardEncoding');
};
J'ai mis cette méthode près d'autres méthodes de police pour plus de clarté - API.setFont
, API.setFontSize
, API.setFontType
, Etc.
Maintenant dans votre code, utilisez:
doc.addFont('ComicSansMS', 'Comic Sans', 'normal');
doc.setFont('Comic Sans');
doc.text(50,50,'Hello World');
Cela fonctionne pour moi avec les polices @ font-face incluses avec css avant de charger jsPDF, ainsi que les polices système. Il y a probablement une meilleure façon de le faire en utilisant le framework de plugins de jsPDF, mais cette solution rapide et sale devrait au moins vous aider.
Notez que doc.getFontList()
n'affichera pas les polices ajoutées:
// TODO: iterate over fonts array or return copy of fontmap instead in case more are ever added.
Cela semble beaucoup plus facile avec la dernière version de jsPDF
(1.5.3) :
Si vous regardez dans le dossier jsPDF-master
> fontconverter
, il y a un fichier fontconverter.html
. Ouvrez dans votre navigateur et utilisez le Browse...
pour naviguer et sélectionner votre .ttf
fichier de polices.
Cliquez sur "Créer".
La page proposera un "téléchargement" à enregistrer. Cela produira un .js
fichier appelé [quelque chose comme] RopaSans-Regular-normal.js
. Cela doit être inclus dans votre page produisant les PDF. Personnellement, je l'ai fait dans l'en-tête de la page principale (et veuillez noter l'ordre des script
s):
<!-- pdf creation -->
<script src="FileSaver.js-master/src/FileSaver.js"></script>
<script src="jsPDF-master/dist/jspdf.debug.js"></script>
<!-- custom font definition -->
<script src="path-to-the-file-just-saved/RopaSans-Regular-normal.js" type="module"></script>
Maintenant dans votre PDF en js:
doc.setFont('RopaSans-Regular');
doc.setFontType('normal');
Voici la solution que j'utilise ...
Tout d'abord, comme d'autres l'ont mentionné - vous avez besoin de ces deux bibliothèques:
Ensuite - la deuxième bibliothèque nécessite que vous lui fournissiez au moins une police personnalisée dans un fichier nommé default_vfs.js
. J'utilise deux polices personnalisées - Arimo-Regular.ttf et Arimo-Bold.ttf - toutes deux de Google Fonts. Donc, mon fichier default_vfs.js
Ressemble à ceci:
(
(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);
De toute évidence, votre version serait différente, selon la ou les polices que vous utilisez.
Il y a un tas de façons d'obtenir la chaîne encodée en Base64 pour votre police, mais j'ai utilisé ceci: https://www.giftofspeed.com/base64-encoder/ .
Il vous permet de télécharger un fichier de police .ttf et vous donnera la chaîne Base64 que vous pourrez coller dans default_vfs.js
.
Vous pouvez voir à quoi ressemble le fichier réel, avec mes polices, ici: https://cdn.rawgit.com/stuehler/jsPDF-CustomFonts-support/master/dist/default_vfs.js
Ainsi, une fois vos polices stockées dans ce fichier, votre code HTML devrait ressembler à ceci:
<script src="js/jspdf.min.js"></script>
<script src="js/jspdf.customfonts.min.js"></script>
<script src="js/default_vfs.js"></script>
Enfin, votre code JavaScript ressemble à ceci:
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");
C'est probablement évident pour la plupart, mais dans cette méthode addFont()
, les trois paramètres sont:
addFileToVFS()
dans le fichier default_vfs.js
setFont()
dans votre JavaScriptsetFontType()
dans votre JavaScriptVous pouvez voir cela fonctionner ici: https://codepen.io/stuehler/pen/pZMdKo
J'espère que cela fonctionne aussi bien pour vous que pour moi.
J'utilise Angular 8 et réponse de Todd a fonctionné pour moi.
Une fois que vous avez obtenu le fichier .js à partir de fontconverter.html, vous pouvez l'importer dans TypeScript comme suit:
import fontref = require('path/to/font/CustomFont-normal.js')
Ensuite, tout ce que vous avez à faire pour charger la police est 'call' fontref
comme ceci:
makePdf() {
let doc = new jsPDF();
fontref; // 'run' .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
}