html-pdf 无法在 docker 中创建 pdf

问题描述 投票:0回答:4

我有一个 Node 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"]

这就是我在 Node 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 文件 我尝试安装 phantom prebuild 并添加 phantomPath 但它仍然返回相同的错误。 有什么办法可以解决这个问题吗

node.js docker phantomjs html-pdf
4个回答
3
投票
FROM node:8-alpine

WORKDIR /srv
# [omitted] git clone, npm install etc....

ENV PHANTOMJS_VERSION=2.1.1
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
ENV PATH=$PATH:/home/node/.npm-global/bin
RUN apk update && apk add --no-cache fontconfig curl curl-dev && \
    cd /tmp && curl -Ls https://github.com/dustinblackman/phantomized/releases/download/${PHANTOMJS_VERSION}/dockerized-phantomjs.tar.gz | tar xz && \
    cp -R lib lib64 / && \
    cp -R usr/lib/x86_64-linux-gnu /usr/lib && \
    cp -R usr/share /usr/share && \
    cp -R etc/fonts /etc && \
    curl -k -Ls https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-${PHANTOMJS_VERSION}-linux-x86_64.tar.bz2 | tar -jxf - && \
    cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs

COPY package.json package-lock.json ./
RUN npm install phantomjs-prebuilt --s
RUN npm install -g html-pdf
RUN npm install
RUN chmod -R a+rwx /srv
RUN apk --update add ttf-ubuntu-font-family fontconfig && rm -rf /var/cache/apk/*
COPY . ./
VOLUME /srv
USER node



EXPOSE 3000
CMD ["node", "index.js"]

这就是我在复制并重新安装其他软件包后通过安装 phantomjs 预构建和 html-pdf 来解决问题的方法。还安装回字体系列,以便我的报告中有文本。否则 pdf 中的文本将为空白


1
投票

此错误似乎与

phantomjs
有关,并且也记录在文档中

https://www.npmjs.com/package/phantomjs#installation-fails-with-spawn-enoent

安装失败并出现 ENOENT 这是 NPM 告诉您它无法启动进程的方式。它通常意味着:
节点不在您的 PATH 上,或者未正确安装。 tar 不在您的路径中。该软件包需要 tar 位于基于 Linux 的平台上的 PATH 中。


0
投票

我也遇到同样的问题。

您需要手动安装 PhantomJS,因为 phantomjs-prebuilt 无法在 linux alpine 中工作,如您所见this


0
投票

我的工作解决方案(更新虚拟链接,因为上面的链接是404)

FROM node:16-alpine3.12
WORKDIR /
ADD . .

RUN npm install

ENV PHANTOMJS_VERSION=2.1.1
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
ENV PATH=$PATH:/home/node/.npm-global/bin
RUN apk update && apk add --no-cache fontconfig curl curl-dev && \
    cd /tmp && curl -Ls https://github.com/topseom/phantomized/releases/download/${PHANTOMJS_VERSION}/dockerized-phantomjs.tar.gz | tar xz && \
    cp -R lib lib64 / && \
    cp -R usr/lib/x86_64-linux-gnu /usr/lib && \
    cp -R usr/share /usr/share && \
    cp -R etc/fonts /etc && \
    curl -k -Ls https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-${PHANTOMJS_VERSION}-linux-x86_64.tar.bz2 | tar -jxf - && \
    cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs

COPY package.json package-lock.json ./
RUN npm install phantomjs-prebuilt --s
RUN npm install -g html-pdf
RUN npm install
RUN apk --update add ttf-ubuntu-font-family fontconfig && rm -rf /var/cache/apk/*
COPY . ./
USER node

EXPOSE 3000
CMD ["node", "app.js"]
© www.soinside.com 2019 - 2024. All rights reserved.