我正在尝试用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
...
我知道示例中定义的两个文本操作的字体大小为16pt,但Tf操作符使用了21.33的大小。为了将这种字体大小转换回点数,我打算使用cm操作符的比例(y),使点数大小为:
21.33 * 0.75 = 15.9975
然而,我在PDF规范中找不到支持此转换的内容,并且我检查的所有库(PDFBox、iTextSharp和Spire PDF)都将字体大小列为21.33,没有其他的信息。
我应该使用CTM(由cm运算符定义)将字体大小缩放回正确比例,还是这只是纯粹的巧合?
PDF文件在这里:https://github.com/UglyToad/PdfPig/blob/master/src/UglyToad.PdfPig.Tests/Integration/Documents/Single%20Page%20Simple%20-%20from%20google%20drive.pdf。
cm
操作将彼此连接在一起,因此,在处理Tf
运算符时,第一个比例操作中的因子0.75
仍然是“有效”的。这不是真正的转换;所有图形操作都使用矩阵完成。 - Jongware