【发布时间】:2017-12-28 15:38:33
【问题描述】:
我正在尝试用 C# 编写 PDF 解析器,但遇到了一个问题,我不确定如何解释规范。
除非另有规定,PDF 文档中的用户空间为 1/72 英寸(即 1pt)。
Tf 运算符提供的比例将字体从标准大小(通常为 1 个用户空间单位/1pt)缩放到正确的显示大小。
我有以下页面内容:
1 0 0 -1 0 792 cm
q
0 0 612 792 re
W* n
q
.75 0 0 .75 0 0 cm
1 1 1 RG 1 1 1 rg
/G0 gs
0 0 816 1056 re
f
0 0 816 1056 re
f
0 0 816 1056 re
f
Q
Q
q
0 0 612 791.25 re
W* n
q
.75 0 0 .75 0 0 cm
1 1 1 RG 1 1 1 rg
/G0 gs
0 0 816 1055 re
f
0 96 816 960 re
f
0 0 0 RG 0 0 0 rg
BT
/F0 21.33 Tf
1 0 0 -1 0 140 Tm
96 0 Td <0037> Tj
13.0280762 0 Td <004B> Tj
11.8616943 0 Td <004C> Tj
4.7384338 0 Td <0056> Tj
ET
BT
/F1 21.33 Tf
1 0 0 -1 0 140 Tm
136.292267 0 Td <0001> Tj
ET
...
我知道示例中定义的 2 个文本操作的字体大小为 16pt,但 Tf 运算符使用的大小为 21.33。为了从这个字体大小转换回点,我打算使用 cm 运算符的比例(y)来制作点大小:
21.33 * 0.75 = 15.9975
但是,我在支持此转换的 PDF 规范中找不到任何内容,而且我检查的所有库(PDFBox、iTextSharp、Spire PDF)都没有将字体大小列为 21.33。
我应该使用 CTM(由 cm 运算符定义)将字体大小调整回正确的比例,还是这纯粹是机会?
【问题讨论】:
-
cm操作 concatenate 到彼此,所以是的,当处理Tf运算符时,第一个缩放操作中的因子0.75仍然“有效” .这不是真正的转换。 所有图形运算都是使用矩阵完成的。 -
有没有办法将字体大小的缩放表示为矩阵运算,因为它是一个标量值,不可能将它乘以矩阵?在问题的示例中,scaleX 的值 = 0.75,scaleY 的值 = -0.75(负),所以乘以 X 比例才有意义,但我不知道这样做的理由。
-
在给定各种变换矩阵的情况下,这就是我们最终计算点大小的方式。 github.com/UglyToad/PdfPig/blob/master/src/UglyToad.PdfPig/…我仍然不能 100% 确定它在每种情况下都是正确的,但对于大多数用途来说似乎“足够接近”。