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

NodeJS中EJS生成HTML转PDF时图片无法显示问题求助

问题:PDF生成时无法显示本地图片

我用Node.js+MySQL从数据库拉取数据,通过EJS生成HTML,再借助npm的html-pdf工具将HTML转为PDF,但PDF里的图片无法显示。图片托管在同一服务器的React项目文件夹中(路径为../html/static/media/...),而Node.js代码位于../server/..目录下。


相关代码及效果

EJS模板代码

<!DOCTYPE html>
<html lang="pt">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width:device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Imóvel <%= name %></title>
    </head>
    <body>
        <section id="header">
            <h1>Immobile</h1>
            <img src='<%= img %>' />
            <h2><%= name %></h2>
        </section>
    </body>
</html>

PDF生成代码

let img = media[0].url;

const name = immobile[0].name

ejs.renderFile("./immobile/pdf/index.ejs", {name:name, img:img}, (err, html) => {
    if (err) {
        console.log("error: " + err);
    } else {
        
        pdf.create(html, {}).toFile("../html/static/media/immobile.pdf", (err,response) => {

            if (err) {
                console.log("Um erro aconteceu: " + err);
            } else {
                res.json({"success":"true","url":"" + response.filename + ""});
            }

        });

    }
});

效果截图

PDF中图片位置显示为空白占位符,无法加载出图片内容。


解决方法

1. 使用绝对文件路径(推荐)

html-pdf依赖的PhantomJS在处理本地图片时,相对路径容易解析错误,建议用Node.js的path模块生成绝对路径:

const path = require('path');

// 拼接图片的绝对路径:从server目录向上到根,再指向目标图片
let imgRelativePath = media[0].url;
let imgAbsolutePath = path.resolve(__dirname, imgRelativePath);

// 把绝对路径传给EJS
ejs.renderFile("./immobile/pdf/index.ejs", {name:name, img:imgAbsolutePath}, (err, html) => {
    // 后续生成PDF的代码不变
});

2. 配置html-pdf的base选项

在pdf.create的配置中指定base参数,设置资源的基础路径,让PhantomJS能正确解析相对路径:

const path = require('path');
// 基础路径设为React项目static/media目录的绝对路径
const basePath = path.resolve(__dirname, '../html/static/media');

pdf.create(html, { base: `file://${basePath}/` }).toFile("../html/static/media/immobile.pdf", (err,response) => {
    // 后续代码不变
});

此时EJS中的图片src可以直接用图片文件名,或者基于basePath的相对路径。

3. 检查文件权限

确保运行Node.js进程的用户拥有读取../html/static/media/目录下图片文件的权限,避免因权限不足导致无法加载图片。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:19:01