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

使用Puppeteer addStyleTag注入CSS生成PDF时GCF报意外令牌错误

问题:GCP Cloud Function部署时注入CSS生成PDF报错

我用Handlebars的index.hbs和alert.css文件,通过以下代码注入CSS生成PDF,本地测试正常,但部署到GCP Cloud Function时出现语法错误。

生成PDF的代码

await page.setContent(await compile('alert', deeta));
await page.addStyleTag({path: './templates/alert.css'})
const pdf = await page.pdf({
   format: 'A4',
   printBackground: true
});

有效CSS内容

body {
  width: 97.7%;
  box-sizing: border-box;
}

h1 {
  margin: 0;
}

.header {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
  height: 70px;
  width: 100%;
  background-color: black;
  padding: 10px;
}

生成的HTML结构

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>My Title</title>
</head>

<body>
  <div class="header">
    <h1 class="title">RAPID Alert</h1>
    <img src="./logo.jpg" alt="logo here"/>
  </div>

  <div class="content">
    <img class="dependent-img" src="{{dependentImage}}" />
    <div class="dependent-data">
      <div class="dependent-name">
        <h1>Name: </h1>
        <h1 class="name">Jon Doe Smith</h1>
      </div>
    </div>
  </div>
  
</body>
</html>

报错信息

Detailed stack trace: /workspace/templates/alert.css:1
body {
     ^
Unexpected token '{'

解决方法

1. 读取CSS内容后用content参数注入

云环境中路径解析可能出问题,直接读取CSS文件内容,避免路径依赖:

const fs = require('fs').promises;
const path = require('path');

// ...
await page.setContent(await compile('alert', deeta));
// 读取CSS文件内容
const cssPath = path.join(__dirname, './templates/alert.css');
const cssContent = await fs.readFile(cssPath, 'utf8');
// 用content参数注入样式
await page.addStyleTag({content: cssContent});
const pdf = await page.pdf({
   format: 'A4',
   printBackground: true
});

2. 确保使用绝对路径

GCP Cloud Function的根目录是/workspace,用__dirname拼接绝对路径,避免相对路径解析错误:

const path = require('path');

// ...
await page.addStyleTag({
  path: path.resolve(__dirname, './templates/alert.css')
});

3. 直接将CSS嵌入Handlebars模板

把CSS内容直接写到index.hbs的<head>标签里,彻底规避文件读取和路径问题:

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>My Title</title>
  <style>
    body {
      width: 97.7%;
      box-sizing: border-box;
    }

    h1 {
      margin: 0;
    }

    .header {
      display: flex;
      flex-direction: row;
      justify-content: space-between;
      align-items: center;
      height: 70px;
      width: 100%;
      background-color: black;
      padding: 10px;
    }
  </style>
</head>

内容的提问来源于stack exchange,提问作者Pis7ftw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:40:15