Firebase Functions环境下Puppeteer无法应用自定义字体的问题求助
Firebase Functions环境下Puppeteer无法应用自定义字体的问题求助
大家好,我在Firebase Cloud Function里用puppeteer-core搭配chrome-aws-lambda做网页爬取,还想给页面应用自定义字体。但不管我怎么通过page.addStyleTag注入@font-face规则,生成的截图里字体就是不生效,实在搞不懂哪里出问题了。
我的代码如下:
const scraper = async (url: string) => { let browser; try { browser = await puppeteer.launch({ args: ["--no-sandbox", "--disable-web-security"], executablePath: await chromium.executablePath, headless: chromium.headless, }); const page = await browser.newPage(); // 设置移动端的用户代理和视窗 await page.setUserAgent( "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36" ); await page.setViewport({ width: 390, height: 844, deviceScaleFactor: 3 }); await page.goto(url, { waitUntil: "domcontentloaded" }); await page.waitForTimeout(5000); // 留时间确保字体加载完成 // 加载自定义字体 const fontPath = path.join(__dirname, "..", "fonts", "Vazirmatn-Regular.ttf"); const fontBuffer = fs.readFileSync(fontPath); const fontBase64 = fontBuffer.toString("base64"); const fontDataUrl = `data:font/ttf;base64,${fontBase64}`; // 把字体注入页面 await page.addStyleTag({ content: ` @font-face { font-family: 'Vazirmatn'; src: url(${fontDataUrl}) format('truetype'); } * { font-family: 'Vazirmatn', sans-serif !important; font-size: 24px; } `, }); // 生成截图或评估页面样式 await page.screenshot({ path: "output.png", fullPage: true }); } catch (error) { console.error("爬取网站出错:", error); throw new Error("爬取网站失败"); } finally { if (browser) { await browser.close(); } } };
具体问题
- 自定义字体完全没应用到渲染后的页面上
- 整个过程没有任何报错,但页面还是用的默认字体
- 这个问题只在Firebase Functions环境中出现
我已经试过的办法
- 改用
page.evaluate()手动往页面中插入样式 - 测试本地字体文件(就是当前使用的Vazirmatn)
- 换成谷歌字体的外部链接来加载字体
- 启动Puppeteer时添加
--disable-web-security参数
想请教大家的问题
- 在Firebase Functions中运行的Puppeteer,是不是对自定义字体有特殊限制?
- 除了我现在用的方法,还有别的办法能在Puppeteer里加载并强制应用字体吗?
- 会不会是Firebase的执行环境本身缺少字体渲染的相关支持?
真心希望能得到各位的指点,谢谢大家!
备注:内容来源于stack exchange,提问作者Alireza Navaie
相关产品推荐
相关产品推荐

