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

Astro部署Vercel后pdfmake自定义字体找不到问题求助

解决Astro部署Vercel后PDF自定义字体找不到的问题

问题分析与修复方案

1. 优化Vercel适配器的文件包含规则

Vercel打包函数时,includeFiles用glob模式匹配比逐个列文件更可靠,避免路径拼写遗漏:

adapter: vercel({
  functionPerRoute: true,
  includeFiles: ["./public/resources/fonts/**/*.ttf"],
}),

2. 修正字体路径的获取逻辑

本地运行时process.cwd()指向项目根目录,但Vercel函数的运行目录是打包后的子目录,改用import.meta.url推导绝对路径更稳定:

import path from "path";
import { fileURLToPath } from "url";
import type { TFontFamilyTypes } from "pdfmake/interfaces";

// 获取当前模块的绝对路径
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 根据当前文件位置推导字体目录(自行调整层级,比如当前文件在src/lib则用../../public)
const pathToFonts = path.join(__dirname, "../../public/resources/fonts");

const fonts: Record<string, TFontFamilyTypes> = {
  Roboto: {
    normal: path.join(pathToFonts, "Roboto-Regular.ttf"),
    bold: path.join(pathToFonts, "Roboto-Bold.ttf"),
    italics: path.join(pathToFonts, "Roboto-Italic.ttf"),
    bolditalics: path.join(pathToFonts, "Roboto-BoldItalic.ttf"),
  },
};

export { fonts };

3. 直接加载字体文件内容(最稳妥方案)

绕开路径依赖问题,直接把字体文件读成Buffer传给pdfmake:

import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
import type { TFontFamilyTypes } from "pdfmake/interfaces";

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const pathToFonts = path.join(__dirname, "../../public/resources/fonts");

const fonts: Record<string, TFontFamilyTypes> = {
  Roboto: {
    normal: fs.readFileSync(path.join(pathToFonts, "Roboto-Regular.ttf")),
    bold: fs.readFileSync(path.join(pathToFonts, "Roboto-Bold.ttf")),
    italics: fs.readFileSync(path.join(pathToFonts, "Roboto-Italic.ttf")),
    bolditalics: fs.readFileSync(path.join(pathToFonts, "Roboto-BoldItalic.ttf")),
  },
};

export { fonts };

4. 排查Vercel运行日志

去Vercel控制台查看对应函数的错误日志,日志里会显示找不到的具体路径,根据实际路径调整代码,能快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:41:14