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

在Next.js项目中配置@react-pdf/renderer自定义字体遇阻

Next.js 中 @react-pdf/renderer 自定义字体问题解决

你遇到的核心问题是字体路径错误,Next.js 对静态资源的访问规则和普通 React 项目不同,具体修正方案如下:

1. 修正字体路径

Next.js 的 public 目录是静态资源根目录,访问时不需要加上 public/ 前缀。把字体路径里的 public/ 去掉,直接从根目录开始写:

// pdf.ts 修正后的代码
import { Document, Page, Text, Image, Link, View, StyleSheet, PDFViewer, Font} from '@react-pdf/renderer';

Font.register({
  family: 'PrimaSerif',
  fonts: [
    {
      src: '/assets/font/PrimaSerif/FontPrimaSerif_Regular.ttf',
      fontStyle: 'normal', 
      fontWeight: 'normal',
    },
    {
      src: '/assets/font/PrimaSerif/FontPrimaSerif_Bold.ttf',
      fontStyle: 'normal', 
      fontWeight: 'bold',
    }
  ],
});

2. 验证文件路径准确性

  • 确认字体文件确实存在于 public/assets/font/PrimaSerif/ 目录下
  • 注意文件名大小写(部署到 Linux 服务器时大小写敏感,本地开发可能忽略)

3. 处理服务器组件兼容性

如果你的 PDF 组件是服务器组件,@react-pdf/renderer 的字体注册逻辑在服务端无法正确加载本地字体,需要:

  • 将 PDF 相关代码放在客户端组件中(在组件文件顶部加 'use client' 指令)
  • 或者用 next/dynamic 禁用 SSR 导入组件:
// 页面组件示例
import dynamic from 'next/dynamic';

// 禁用 SSR 加载 PDF 组件
const PDFViewerComponent = dynamic(() => import('../components/pdf'), {
  ssr: false,
});

export default function PDFPage() {
  return <PDFViewerComponent />;
}

4. 检查字体格式

确保 .ttf 文件没有损坏,部分特殊字体可能需要转换为兼容的格式(比如同时提供 .woff 格式备用)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:17:32