2

我正在运行 html-pdf 以使用 phantomJS 通过 nodejs 生成 PDF 并在 aws lambda 上运行它。我有自定义字体,使用路径引用它们 css (src: url('path/fonts.ttf');会导致 pdf 呈现为一张大图像,并且文件大小比原始字体大 10 倍。

所以我将其更改为在本地引用字体,以修复文件大小问题更改qt_qpa_fontdirhome变量到我的本地字体目录并且它可以工作。字体现在显示并且文件大小恢复正常。但是,字体的字母间距/字距不正确。

当我通过路径引用字体时,这也是一个问题,但我使用 xml 使用共享字体文件夹中的 fonts.conf 文件修复了这个问题:

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
 <match target="font">
  <edit mode="assign" name="rgba">
   <const>rgb</const>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="hinting">
   <bool>true</bool>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="hintstyle">
   <const>hintslight</const>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="antialias">
   <bool>true</bool>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="lcdfilter">
   <const>lcddefault</const>
  </edit>
 </match>
</fontconfig>

既然字体是在本地引用的,那么这个修复就没有帮助了。我是否还必须指定 QT 字体配置文件路径?或更改fonts.conf?

在此处输入图像描述 在此处输入图像描述

4

1 回答 1

0

这是我刚刚在 AWS Lambda for htmltopdf 上为自定义字体工作的内容。

我在我的根项目字体目录中创建了一个字体目录,并将我的所有字体都放在那里。同样在该目录中,我创建了一个如下所示的 fonts.conf 文件:

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <dir>/var/task/fonts/</dir>
      <cachedir>/tmp/fonts-cache/</cachedir>
      <config></config>
    </fontconfig>

然后在我的(基于 node.js 的)处理程序函数中,我设置了一个 ENV var 来告诉 fontconfig 在哪里可以找到字体。

process.env.FONTCONFIG_PATH='/var/task/fonts'- 如果它不起作用,请更改路径'/var/task'

之后,我可以在我的模板中按名称(只是 Bitter)引用一种字体,比如 Bitter。

我根据这个项目中关于让 RSVG 使用 Lambda 上的自定义字体的技巧来解决这个问题:https ://github.com/claudiajs/rsvg-convert-aws-lambda-binary/blob/master/README.md#使用自定义字体

注意:如果您在生成的 pdf 中遇到任何字母变小问题,请将您现有的 fonts.conf 修改为以下

    <fontconfig>
        <dir>/var/task/fonts/</dir>
        <cachedir>/tmp/fonts-cache/</cachedir>
         <!--
         Load local system customization file
        <include ignore_missing="no">conf.d</include> -->
        <match target="font">
            <edit mode="assign" name="rgba">
                <const>rgb</const>
            </edit>
        </match>
        <match target="font">
            <edit mode="assign" name="hinting">
                <bool>true</bool>
            </edit>
        </match>
        <match target="font">
            <edit mode="assign" name="hintstyle">
                <const>hintslight</const>
            </edit>
        </match>
        <match target="font">
            <edit mode="assign" name="antialias">
                <bool>true</bool>
            </edit>
        </match>
        <match target="font">
            <edit mode="assign" name="lcdfilter">
                <const>lcddefault</const>
            </edit>
        </match>    
        <config></config>
    </fontconfig>
于 2019-10-14T15:00:03.277 回答