PhantomJS中的字体提示行为?

时间:2013-02-11 13:25:08

标签: pdf browser fonts phantomjs

我需要将HTML文档中divs中包含的文本呈现为PDF。我正在考虑使用PhantomJS,但有一点非常重要。不同的浏览器和平台以不同方式呈现文本如果我有以下代码:

<div style='width:150px; height:80px; position:absolute; top:130px; left:78px'>
<p> Some text, yayy! :) </p>
</div>

它可以在一个浏览器上呈现如下:

                              Some text, yayy!:)

但另一个像这样:

                              Some text, 
                              yayy!:)

发生了什么(因为字体提示,我猜),第一个例子中的文字以一定的宽度结束,适合包含div,但由于第二个字体呈现浏览器,文本最终只占用了一个不适合容器的空间,并且不得不环绕下一行。我无法承受输出结果的这种不可靠性。如果HTML在一行上有它,我也需要PDF在同一行上。

我实际上在这里问了一个相关的问题:Make fonts on Windows render like Mac/Linux: disabling font-hinting and/or deal with anti-alias on client side没有运气,但基本上是在试图解决同样的问题。

PhantomJS可以做些什么吗?或者PhantomJS可以至少以某种方式计算文本的真实宽度,而不涉及字体提示和涉及的任何其他事情?或者可以计算一下如果包含暗示可能会呈现什么?或者任何事情,只要PDF上的内容出现在HTML上。 (鉴于我正在处理的应用程序,我没有自由更改包含DIV)的CSS样式。

1 个答案:

答案 0 :(得分:0)

字体提示几乎可以肯定不是改变此处文本宽度的原因。字体提示包括进行一些小的调整,以使轮廓字体的边缘对齐到屏幕像素。这些调整是在每个字符内进行的,不应更改该字符的整体宽度。

在各个平台上,由于许可问题,字体的版本略有不同。由于法律原因,macOS和GNU / Linux通常不能完全复制Microsoft的字体,因此,距离您最近的是一种基本看起来相同(且名称相似)但实际上不相同的字体字体。因此,除非您可以在页面上提供自己的字体文件(网络字体),否则跨平台的宽度会有一定的变化。

PhantomJS像其他浏览器一样使用系统字体。因此,使用PhantomJS不会自动为您提供一些与系统字体不同的“跨平台”字体。

如果您需要100%的可重复性,那么我建议创建一个虚拟机(或Docker映像),其中安装了一组标准字体,并在所有地方使用。只是不要忘记在需要时对其应用安全补丁。