【问题标题】:Phantom JS + Docker: html font-family is not respected when converting from HTMLPhantom JS + Docker:从 HTML 转换时不尊重 html 字体系列
【发布时间】:2021-05-26 02:10:58
【问题描述】:

当我在 docker 和 Node 中运行我的 phantomjs 应用程序时,它运行良好(将 HTML 转换为 Jpeg)。
但是,当我将它发布到 docker 容器时,字体名称不再受到尊重。

这个应用程序将 HTML 转换为 jpeg、pdf 或其他媒体,使用 html-convert npm,它是 phantomjs 的包装器

码头文件:

FROM node:latest
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
CMD node app.js
EXPOSE 8081

package.json

{
  "name": "htmlconverter",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "dependencies": {
    "body-parser": "^1.18.2",
    "ent": "^2.2.0",
    "express": "^4.16.3",
    "generator-azuresfcontainer": "^1.0.0",
    "html-convert": "^2.1.7",
    "html-entities": "^1.2.1",
    "memorystream": "^0.3.1",
    "phantomjs": "*",
    "phantomjs-prebuilt": "*",
    "picture-tube": "^1.0.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": ""
}

app.js

var http = require("http");
var express = require('express');
var htmlConvert = require('html-convert');
var url = require('url');
var querystring = require('querystring');
var Readable = require('stream').Readable;
var bodyParser = require('body-parser');

var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('/', function (req, res) {
    var html = unescape(req.body.html);
    var format = req.body.format;
    var orientation = req.body.orientation;
    var convert = htmlConvert({
        format: format,
        orientation: orientation
    });
    var s = new Readable();
    s._read = function noop() { };
    s.push(html);
    s.push(null);
    var result = s.pipe(convert());
    result.pipe(res);
});

var server = app.listen(8081, function () {
    var host = server.address().address;
    var port = server.address().port;

    console.log("Example app listening at http://%s:%s", host, port);
});

邮递员(从 html 生成 jpeg):

http://127.0.0.1:8081/

{
    "html": "<!DOCTYPE html><html><head><style>body {background-color: powderblue; font-family: 'Comic Sans MS';}h1   {color: blue;}p    {color: red;}</style></head><body><h1>This is a heading</h1><p>This is a paragraph.</p></body></html>",
    "format":"jpeg",
    "orientation":"Landscape"
}

在启动“node app.js”后,在调用 POST 时观察“Comic Sans”字体是否正常

然后运行 ​​Docker,并观察使用的默认字体:

docker build -t htmlconverter .
docker run -p 8081:8081 htmlconverter 

我在 Windows 10 中运行它

有什么想法吗?

【问题讨论】:

  • 您能根据您的应用程序的功能解释“字体名称不再受到尊重”吗?您是否遇到控制台错误?
  • @brandon-barnett 没有控制台。我只是无法让任何“字体系列”属性起作用。生成pdf或jpeg时只使用默认字体
  • @brandon-barnett,我添加了更多细节
  • 你可以参考另一个 docker 镜像的 GitHub issue,也许这会有所帮助 github.com/astefanutti/decktape/issues/79 和 github.com/GoogleChrome/puppeteer/issues/2230 StackOverflow 上的类似问题 stackoverflow.com/questions/48694808/…
  • @HemantSingh,谢谢,这似乎是一个无法真正解决的问题。我切换到 Chrome/Puppeteer,我的 Comic Sans 看起来仍然与 Arial 相似..与 Phantom 的问题基本相同

标签: node.js docker phantomjs


【解决方案1】:

查看以下链接以获取解决方案。 link

Please add the scripts to the Dockerfile:
RUN apk add fontconfig ttf-dejavu
RUN apk add --no-cache curl &&
cd /tmp && curl -Ls https://github.com/dustinblackman/phantomized/releases/download/2.1.1/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 &&
apk del curl

I did it and it works well. (node:12.20-alpine3.12)

【讨论】:

    【解决方案2】:

    这就是我让我的应用与 Puppeteer 一起工作的方式。
    注意:我切换到 Chrome Headless,因为 PhantomJS 是一个带有阴暗 Lic 协议的恐龙,没有像样的支持

    FROM node:latest
    
    # See https://crbug.com/795759
    RUN apt-get update && apt-get install -yq libgconf-2-4
    
    # Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)
    # Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer
    # installs, work.
    RUN apt-get update && apt-get install -y wget --no-install-recommends \
        && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
        && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
        && apt-get update \
        && apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst ttf-freefont \
          --no-install-recommends \
        && rm -rf /var/lib/apt/lists/* \
        && apt-get purge --auto-remove -y curl \
        && rm -rf /src/*.deb
    
    RUN echo "deb http://httpredir.debian.org/debian jessie main contrib" > /etc/apt/sources.list \
       && echo "deb http://security.debian.org/ jessie/updates main contrib" >> /etc/apt/sources.list \
        && echo "ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true" | debconf-set-selections \
        && apt-get update \
        && apt-get install -y ttf-mscorefonts-installer \
        && apt-get clean \
        && apt-get autoremove -y \
        && rm -rf /var/lib/apt/lists/*
    
    WORKDIR /app
    COPY package.json /app
    RUN npm install
    COPY . /app
    CMD ["node", "app.js" ]
    EXPOSE 8081
    

    【讨论】:

      【解决方案3】:

      该字体不在node:latest 图像中。您需要先安装 MS 字体系列。我无法将工作的 Dockerfile 放在一起,但这些命令应该可以工作

      1. wget http://ftp.de.debian.org/debian/pool/contrib/m/msttcorefonts/ttf-mscorefonts-installer_3.6_all.deb
      2. dpkg -i ttf-mscorefonts-installer_3.6_all.deb
      3. apt-get install -f -y

      第二个命令抛出错误,导致 docker 镜像构建失败。好吧,如果您找到忽略此错误的方法,您应该能够在 Dockerfile a 中包含命令并使用 MS 字体构建它。

      【讨论】:

      • 我无法在最新的节点上安装它。你能提出一个不同的 Docker FROM 吗?
      • 我发现这个:运行 echo "deb httpredir.debian.org/debianjessie main contrib" > /etc/apt/sources.list \ && echo "deb security.debian.orgjessie/updates main contrib" >> /etc /apt/sources.list \ && echo "ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula 选择真" | debconf-set-selections \ && apt-get update \ && apt-get install -y ttf-mscorefonts-installer \ && apt-get clean \ && apt-get autoremove -y \ && rm -rf /var/lib/apt/列表/*
      • 所以,你得到我的 50!
      • /bin/sh: dpkg: 未找到
      猜你喜欢
      • 2020-11-27
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2022-11-26
      相关资源
      最近更新 更多