2

我需要将divsHTML 文档中包含的文本呈现为 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 with no luck,但它基本上是在尝试解决同样的问题.

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

4

1 回答 1

0

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

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

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

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

于 2018-09-01T13:02:26.520 回答