node.js - html-pdf 在 docker 中无法创建 pdf
问题描述
我有一个节点 js 应用程序,它部署到 docker 并使用 html-pdf 库。
但是当在本地 docker 容器中尝试时,它返回此错误:
Error: spawn Unknown system error -8
at ChildProcess.spawn (node:internal/child_process:415:11)
at Object.spawn (node:child_process:698:9)
at PDF.PdfExec [as exec] (/srv/node_modules/html-pdf/lib/pdf.js:89:28)
at PDF.PdfToFile [as toFile] (/srv/node_modules/html-pdf/lib/pdf.js:85:8)
at exports.renderPdf (/srv/service/PdfRenderer.js:27:14)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async /srv/routes/Report.js:63:16 {
errno: -8,
code: 'Unknown system error -8',
syscall: 'spawn'
}
这就是我创建 dockerfile 的方式:
FROM mhart/alpine-node:16.4.2
WORKDIR /srv
ADD . .
RUN npm install
RUN apk update && apk add --no-cache fontconfig curl curl-dev && \
mkdir -p /usr/share && \
cd /usr/share \
&& curl -L https://github.com/Overbryd/docker-phantomjs-alpine/releases/download/2.11/phantomjs-alpine-x86_64.tar.bz2 | tar xj \
&& ln -s /usr/share/phantomjs/phantomjs /usr/bin/phantomjs \
&& phantomjs --version
EXPOSE 3000
CMD ["node", "index.js"]
这就是我在节点 js 中呈现 PDF 的方式:
const content = await compile(template, context)
pdf.create(content,
{ format: 'Letter',
footer: { contents: footer, height: '20mm' },
header: { content: '', height: '6mm' },
timeout: 540000 })
.toFile(path, (err, response) => {
if (err) {
fs.unlinkSync(path)
return console.log(err);
}
const data = fs.readFileSync(path)
res.setHeader('Content-Type', 'application/pdf')
res.setHeader('Content-Length', fs.statSync(path).size + 200)
res.send(data)
return fs.unlinkSync(path)
});
在 .toFile() 上不起作用的行我不知道为什么。但我需要返回我尝试安装幻像预构建并添加幻像路径的 pdf 文件,但它仍然返回相同的错误。有什么办法可以解决这个问题
解决方案
此错误似乎与那里有关,phantomjs
并且它也记录在文档中
https://www.npmjs.com/package/phantomjs#installation-fails-with-spawn-enoent
安装失败并生成 ENOENT 这是 NPM 告诉您它无法启动进程的方式。这通常意味着:
节点不在您的 PATH 上,或者没有正确安装。tar 不在您的 PATH 中。在基于 Linux 的平台上,此软件包需要 PATH 上的 tar。
推荐阅读
- tomcat - 通过负载均衡器访问 Tomcat
- mysql - 如何使用 MySQL 更改 Rails 中大型表的“id”列类型
- java - 如何打印由制表符分隔的文件中的第一个单词?
- r - 按多列汇总
- postgresql - 如何在事务模式下将 statement_timeout 与 pgBouncer 一起使用
- javascript - 区分控制器的 2 条路由(NestJS)
- python - 如何确保python读取文件夹中的所有文件?
- javascript - 在输出到 HTML 之前计算数据中的列表项
- javascript - XMLHttpRequest.send() 未发送“UNION SELECT”
- apache-kafka - 有没有办法在 DeadLetterPublishingRecoverer 中找到消费者组?