在单个 android 设备上使用 PdfDocument 得到奇怪的结果

Getting strange results with PdfDocument on single android device

在 android 应用程序中,我使用 PdfDocument 将报告保存为 pdf 文件。在客户的设备上,我得到了一个奇怪的报告文本结果。

以下是 header 的图像,在 DroidSansMono 中呈现以下文本:


Baus 演示公司
4727 第四大道西南 STE 202
华盛顿州西雅图市 9816
电话:206-932-986
传真:206-932-986

我在大多数设备上都能很好地呈现相同的过程。我检查了 pdf 文件,它有正确的字体。

这是完整的 PDF 文件: PDF File

谁能帮我弄清楚为什么文本会这样呈现?

之所以出现这种奇怪的外观,是因为这正是 PDF 描述的格式。

水平缩放

页面的内容流由三部分组成:

顶部,签名图像上方的所有文本,开头包含说明

2000 Tz

在该部分内,在一些文本之后是 1000 Tz,然后是 2000 Tz,然后是 1000 Tz

Tz 运算符将水平缩放设置为前一个数字的百分比值。因此,这些指令导致所有后续文本(直到重置图形状态的部分结束)水平拉伸 10 或 20 倍!

这解释了为什么字形如此宽,但没有解释为什么它们重叠如此之多。

字形宽度和定位

它们如此重叠的原因是每个字形都单独放置在适合布局的距离,没有水平缩放。

首先,PDF 中的 DroidSansMono 字体信息声明该字体中几乎所有字形的宽度均为 0。因此,无论何时绘制字形,文本插入点不会移动到字形的末尾,而是保持在它的开头。

此外,每个字形都是使用单独的操作绘制的,并且在两个这样的单个字形绘制操作之间,文本插入点通过单独的指令前进。但是这条指令的距离参数适用于没有水平缩放的字形!

这会导致所有重叠。


如果这个 PDF 在大多数设备上渲染得“很好”(即错误地忽略了 Tz 操作),那么在这些设备上使用的 PDF 渲染器显然做的 PDF 很糟糕渲染。