You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数

想请教大家的问题

  1. 在Firebase Functions中运行的Puppeteer,是不是对自定义字体有特殊限制?
  2. 除了我现在用的方法,还有别的办法能在Puppeteer里加载并强制应用字体吗?
  3. 会不会是Firebase的执行环境本身缺少字体渲染的相关支持?

真心希望能得到各位的指点,谢谢大家!

备注:内容来源于stack exchange,提问作者Alireza Navaie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:28:05