PDF规范 - 以点数获取字体大小

时间:2017-12-28 15:38:33

标签: pdf fonts

我正在尝试用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运算符定义)将字体大小缩放到正确的比例或者这只是纯粹的机会?

pdf文件位于:https://github.com/UglyToad/PdfPig/blob/master/src/UglyToad.PdfPig.Tests/Integration/Documents/Single%20Page%20Simple%20-%20from%20google%20drive.pdf

1 个答案:

答案 0 :(得分:3)

首先,您与其他文本提取器的比较基于一个误解:

  

我检查的库(PDFBox,iTextSharp,Spire PDF)都没有列出除21.33之外的任何字体。

所有这些库返回的“font size”参数只是 Tf 指令的大小参数,而不是您在最终文档中观察到的有效字体大小。所以你与其他图书馆的比较没有意义。

现在,关于你的方法:

  

为了将此字体大小转换回点,我打算使用cm运算符的比例(y)来计算磅值:

21.33 * 0.75 = 15.9975

虽然有些图书馆这样称呼它,但是调用第四个 cm 参数“scale(y)”会产生误导。例如。如果文本旋转了90°,它通常为空,而图形表示通常减少到零高度。

因此,仅使用“scale(y)”参数不起作用,您必须考虑整个转换。

最后让我们讨论一下你的实际目标。

只要组合变换矩阵(当前变换矩阵+文本矩阵+水平缩放)是正交的并且文本行遵循这种正交性,你的字体大小概念的含义是相当明显的。

但是只要组合矩阵中存在剪切,“字体大小”的含义就不再明显了。

  • 您可能指的是原始垂直线(一个单位高)转换成的长度。
  • 您可能指的是该变换线投影到与变换后的字体基线成直角的直线上的长度。
  • 或者您可能意味着该变换线投影到与观察到的基线成直角的直线上的长度。

使用简单的线性代数计算前两个数字是微不足道的。第三个数字可能更难,因为您必须在生成的PDF中确定人类观察到的基线。如果创新地使用转换,这可能是非平凡的

相关问题