-
Notifications
You must be signed in to change notification settings - Fork 9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Custom Fonts not loaded when pdf generated #3183
Comments
If you intend to use this only for pdf then maybe you could base64 encode the font and load it via url. |
I ams still facing this issue, @aslushnikov do you have any suggestions? |
Not sure if you've seen #422 , but it might be relevant to your issue. |
I also facing the same issue. I have attached the PDf file generated from Puppeteer. @font-face .ffc{font-family:ffc;line-height:1.589369;font-style:normal; |
Hi @shibli786, I have found a work around, it seem like the font need to be rendered as lead one time, so i have create a dummy <body>
<div class="__dump ff36">_</div>
...
</body> See my real code here: const rfont = /@font-face.*font-family:([^;]+)/g;
function prepareContent(html) {
const $ = cheerio.load(html);
const $body = $('body');
const $style = $('style');
const fonts = [];
$style.each((_, elem) => {
const $this = $(elem);
$this.html().replace(rfont, (_, font) => fonts.push(font));
});
fonts.forEach((font) => {
$body.prepend(`<div class="__dump ${font}">_</div>`);
});
return $.html();
}
(async () => {
html = prepareContent(html);
const browser = await puppeteer.launch();
const page = await browser.newPage();
// await page.goto(`file:${path.join(__dirname, 'books/Computer Programming with C++/1 - Introduction.html')}`, {
await page.setContent(html);
await page.evaluateHandle('document.fonts.ready');
await page.evaluate(() => {
var dumps = document.querySelectorAll('.__dump');
dumps.forEach((dump) => dump.parentNode.removeChild(dump));
})
await page.pdf({path: 'hn.pdf', format: 'A4'});
await browser.close();
})(); |
i had the same issue. i finally ended up using fonts served in directory on public URL as CDN and it works fine for me right now. |
I'll expose my tests in case is useful for anyone to continue debug or to find a better solution: I am generating a pdf from an await page.goto(`data:text/html,${htmlString)}`, { waitUntil: 'networkidle0' })
const pdf = await page.pdf() Since the html string uses an external font I tried different options that I'll describe below. However only the last one works without differences on two environments.
In all those scenarios, the resulting The solution that works cross platform is to pass this @font-face {
font-family: 'Inconsolata';
src: url(data:application/font-woff2;charset=utf-8;base64,…),
url(data:application/font-woff;charset=utf-8;base64,…);
font-weight: normal;
font-style: normal;
} I hope there are better solutions since the base64 string for only one style of a font family is pretty big, and increases in cases where more styles or families are needed in the same page. |
@elrumordelaluz Have you tried the above with |
@elrumordelaluz @billyvg What worked for us is to wait till the font's are actually loaded before you create your pdf file, using this command:
This seems the best solution so far. As you can use custom fonts that are registered system wide and do not need to load them as base64 strings. All credits go to this post: #422 (comment) EDIT: Important to note that we are using custom fonts that are imported system wide and NOT inline as base64 encoded. |
I have tried some of the solutions above but none of them hold up when generating 30+ pdfs so i ended up doing this try {
await page.goto(url, { waitUntil: 'load', timeout: 5 * 1000 });
} catch {
await page.goto(url, { waitUntil: 'networkidle2', timeout: 15 * 1000 });
} giving puppetteer some room to breath between opening pages also seems to help , as I had very inconsistent results |
None of the above solutions to fix the loading issues worked for me. I've done the base 64 encoding and the time delay hacks. The page and its custom fonts render fine through the web browser, but show up blank in the PDF. What worked for me what installing the font in the OS as a system font and then referencing it by name in the style sheet. For my Linux instance, and in Docker, copying the TTF file into |
I have the same issue currently, and It's probably not a network-related issue, because the fonts are loaded, I can see the correct fonts when I take a screenshot exactly before generating the PDF, but the fonts are not loaded in PDF for some reason. For now, changing the puppeteer product to firefox fixed this issue. |
We're marking this issue as unconfirmed because it has not had recent activity and we weren't able to confirm it yet. It will be closed if no further activity occurs within the next 30 days. |
We also noticed that web fonts sometimes don't render in PDFs created with Puppeteer 14.3.0 and Node 12.22.8 |
you can try this alixaxel/chrome-aws-lambda#246 (comment). This worked for me |
I don't know yet whether it will work in all cases, but this is the first thing that worked for me. Can you say more about what this does? It looks to me like it does not actually add a time delay. It just waits for load instead of for networkidle2. Is that right? Since others have said this doesn't help them, would it help to add an actual sleep as well, and how should that be done? |
It turns out that only worked for me on the first try. :( I tried adding a sleep afterward ( None of the advice here is working for me. I also tried generating a screenshot first, etc. |
In some cases this is a bug related to the Access-Control-Allow-Origin limitations. If you trust the url source, adding |
Worked like a charm! Thansk @evmer ! |
Try |
The only thing that worked for me was base64 inlining the fonts. |
I tried this and my webfonts do not appear. If I use |
I used |
|
I try to generate a PDF with custom font but it doesn't work when I inject fonts like this :
Someone have an idea how to import fonts correclty ?
I need a solution that works with any url -> http://localhost:3000, http://xxxxx.com ....
It works when I generated a fonts folder in my build and I inject fonts like this :
I convert my html to pdf like this :
The text was updated successfully, but these errors were encountered: