From d1d83d7c31fb069137fc248db42ecd4e5deed001 Mon Sep 17 00:00:00 2001 From: Diego Muracciole Date: Wed, 7 Feb 2018 12:52:59 -0300 Subject: [PATCH] Fix fonts loading (#195) --- examples/text/output.pdf | Bin 10803 -> 10803 bytes packages/react-pdf/src/elements/Document.js | 1 + packages/react-pdf/src/font/index.js | 23 ++++++++++++++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/examples/text/output.pdf b/examples/text/output.pdf index c91763a5196bae6e7c58e4b4b7b512c2712fdca2..bfaaf4e0956a8e6830f9cba9b3f1aca3343b064b 100644 GIT binary patch delta 77 zcmdlSvN>eKNhUT|&+xE7&&}tV1Q}uMXUs}4_GCWRPPPDNFE6*q$#YrnL7AHy*_0V! J>{aZYN&w!~7=r)+ delta 77 zcmdlSvN>eKNhUVua90<9zs={F1Q}uMXUs}4_GCWRPBx$5Q1_6)$#YrnL7AHy*_0V! J>{aZYN&wg37?J=0 diff --git a/packages/react-pdf/src/elements/Document.js b/packages/react-pdf/src/elements/Document.js index 3c830eb69..abea5657b 100644 --- a/packages/react-pdf/src/elements/Document.js +++ b/packages/react-pdf/src/elements/Document.js @@ -78,6 +78,7 @@ class Document { await this.renderChildren(); this.root.end(); + Font.reset(); } } diff --git a/packages/react-pdf/src/font/index.js b/packages/react-pdf/src/font/index.js index b3c540621..12dea8294 100644 --- a/packages/react-pdf/src/font/index.js +++ b/packages/react-pdf/src/font/index.js @@ -8,6 +8,7 @@ const register = (src, { family, ...otherOptions }) => { fonts[family] = { src, loaded: false, + data: null, ...otherOptions, }; }; @@ -17,12 +18,17 @@ const getRegisteredFonts = () => Object.keys(fonts); const load = async (fontFamily, doc) => { const font = fonts[fontFamily]; + // We cache the font to avoid fetching it many time + if (font && !font.data) { + font.data = isUrl(font.src) ? await fetchFont(font.src) : font.src; + } + + // If the font wasn't added to the document yet (aka. loaded), we do. + // This prevents calling `registerFont` many times for the same font. + // Fonts loaded state will be resetted after document is closed. if (font && !font.loaded) { font.loaded = true; - - const src = isUrl(font.src) ? await fetchFont(font.src) : font.src; - - doc.registerFont(fontFamily, src); + doc.registerFont(fontFamily, font.data); } if (!font && !standardFonts.includes(fontFamily)) { @@ -32,6 +38,14 @@ const load = async (fontFamily, doc) => { } }; +const reset = () => { + for (const font in fonts) { + if (fonts.hasOwnProperty(font)) { + fonts[font].loaded = false; + } + } +}; + const clear = () => { fonts = {}; }; @@ -41,4 +55,5 @@ export default { getRegisteredFonts, load, clear, + reset, };