Пользовательский шрифт JSPDF Добавить не работает

Код CSS

@font-face {
    font-family: Calibri;
    src: url("fonts/calibri.ttf");
    font-style: normal;
}

Код JS

doc.setFont('Calibri');
doc.setFontSize(7.5);
doc.setFontType("normal");
doc.text(10, 10, "Hi, How r u");

Я хочу добавить шрифт Calibri, но он не работает

Список js script включен

<script src="/assets/global/scripts/jspdf/jspdf.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/acroform.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/from_html.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/addhtml.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/addimage.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/annotations.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/autoprint.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/canvas.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/cell.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/context2d.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/javascript.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/outline.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/prevent_scale_to_fit.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/split_text_to_size.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/standard_fonts_metrics.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/svg.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/total_pages.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/zlib.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/png.js" type="text/javascript"></script> 
<script src="/assets/global/scripts/jspdf/plugins/addimage.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/png_support.js" type="text/javascript"></script>
<script src="/assets/global/scripts/jspdf/plugins/filesaver.js" type="text/javascript"></script>

CSS

/*
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
*/
/* 
    Created on : Apr 23, 2017, 12:57:52 PM
    Author     : common
*/

@font-face {
    font-family: Calibri;
    src: url("fonts/calibri.ttf");
    font-style: normal;
}

/*
@font-face {
    font-family: Calibri;
    src: url("fonts/calibrii.ttf");
    font-style: italic;
}

@font-face {
    font-family: Calibri;
    src: url("fonts/calibrib.ttf");
    font-style: normal;
    font-weight: bold;
}

@font-face {
    font-family: Calibri;
    src: url("fonts/calibriz.ttf");
    font-style: italic;
    font-weight: bold;
}*/

Ответ 1

Для jsPdf версии 1.4.0 и более поздних версий есть возможность использовать пользовательский шрифт (ttf). Пользовательский шрифт должен быть закодирован в base64. К сожалению, не все шрифты работают.

var doc = new jsPDF('landscape');

// to generate 'yourCustomFontTtfBase64Encoded' you can use 
// jsPDF-CustomFonts-support library (on their
// github page there are all instructions for that)
doc.addFileToVFS('yourCustomFont.ttf', 'yourCustomFontTtfBase64Encoded');

doc.addFont('yourCustomFont.ttf', 'yourCustomFont', 'normal');

doc.setFont('yourCustomFont');

Библиотека поддержки jsPDF-CustomFonts для генерации yourCustomFontTtfBase64Encoded находится здесь: https://github.com/sphilee/jsPDF-CustomFonts-support

Ответ 2

Привет, вы можете попробовать и изменить шрифты, подобные этому,

API.addFont = function(fontScript, font, style) {
      addFont(fontScript, font, style, 'StandardEncoding');
    };

выше, вам нужно будет добавить в lib/перед вызовом изменения шрифта, но я бы предложил добавить тег script сразу после загрузки jspdf и добавить эту функцию в тег script.

Теперь вам нужно добавить шрифт css,

а затем вы можете изменить шрифт pdf таким образом.

doc.addFont('fonts/calibri.ttf', 'Calibri', 'normal');
doc.setFont('Calibri');
doc.text(50,50,'Now this is Calibri');

Ответ 3

В настоящий момент вы не можете.

Если вы посмотрите на исходный код, вы увидите, что есть переключатель, который, если он не знает шрифта, возвращает times как шрифт

switch (fontName) {
      case 'sans-serif':
      case 'verdana':
      case 'arial':
      case 'helvetica':
        fontName = 'helvetica';
        break;
      case 'fixed':
      case 'monospace':
      case 'terminal':
      case 'courier':
        fontName = 'courier';
        break;
      case 'serif':
      case 'cursive':
      case 'fantasy':
      default:
        fontName = 'times';
        break;
    }

Вы можете использовать один из этих шрифтов или отредактировать библиотеку для поддержки вашего шрифта.

В противном случае в библиотеке продолжается работа, которая добавляет поддержку пользовательских шрифтов: https://github.com/sphilee/jsPDF-CustomFonts-support

После добавления всех необходимых файлов вы должны использовать его следующим образом:

doc.addFont('fonts/calibri.ttf', 'Calibri', 'Calibri-normal', 'normal');

Ответ 4

Как указано выше, вы можете использовать библиотеку поддержки jsPDF-CustomFonts в https://github.com/sphilee/jsPDF-CustomFonts-support.

Есть инструкции по файлу READ.ME, но я получил следующие инструкции https://github.com/sphilee/jsPDF-CustomFonts-support/issues/16#issuecomment-307174041:

  • Загрузите шрифт .ttf в Font Squirell https://www.fontsquirrel.com/tools/webfont-generator
  • Нажмите кнопку загрузки, и вы получите сжатый файл с новым .ttf файлом. Теперь вам нужно закодировать base64 https://www.giftofspeed.com/base64-encoder/.
  • Когда у вас есть код base64 вашего шрифта, вам нужно перейти в файл vfs_fonts.js, который вы загрузили с помощью поддержки jsPDF-CustomFonts https://github.com/sphilee/jsPDF-CustomFonts-support и после того, как один из "," используется для разделения разных шрифтов в этом файле, вы должны добавить: "YOUR_FONT_NAME.ttf" : "ВАШ BASE64 CODE" (не забудьте закончить с запятой в конце, после котировок).
  • После этого вы можете добавить функцию doc. AddFont ( "YOUR_FONT_NAME.ttf" , "YOUR_FONT_NAME.ttf" , "нормальный", "WinAnsiEncoding" ).

Ответ 5

Вот решение, которое я использую. Хорошо работает (см. Ниже для работы codepen)...

Во-первых, как уже упоминали другие - вам понадобятся эти две библиотеки:

  1. jsPDF: https://github.com/MrRio/jsPDF
  2. jsPDF-CustomFonts-support: https://github.com/sphilee/jsPDF-CustomFonts-support

Далее - вторая библиотека требует, чтобы вы предоставили ей хотя бы один пользовательский шрифт в файле 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);

Очевидно, что ваша версия будет выглядеть по-разному, в зависимости от используемых вами шрифтов.

Существует множество способов получить строку в кодировке Base64 для вашего шрифта, но я использовал это: https://www.giftofspeed.com/base64-encoder/.

Он позволяет вам загрузить файл шрифта .ttf и даст вам строку Base64, которую вы можете вставить в default_vfs.js.

Вы можете увидеть, как выглядит настоящий файл с моими шрифтами, здесь: https://cdn.rawgit.com/stuehler/jsPDF-CustomFonts-support/master/dist/default_vfs.js

Итак, когда ваши шрифты сохранены в этом файле, ваш HTML должен выглядеть следующим образом:

    <script src="js/jspdf.min.js"></script>
    <script src="js/jspdf.customfonts.min.js"></script>
    <script src="js/default_vfs.js"></script>

Наконец, ваш код JavaScript выглядит примерно так:

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() три параметра:

  1. Имя шрифта, которое вы использовали в функции addFileToVFS() в файле default_vfs.js
  2. Имя шрифта, которое вы используете в функции setFont() в вашем JavaScript
  3. Стиль шрифта, который вы используете в функции setFontType() в вашем JavaScript

Вы можете увидеть это работает здесь: https://codepen.io/stuehler/pen/pZMdKo

Надеюсь, это работает так же хорошо для вас, как и для меня.