PDF规范-以点为单位获取字体大小

PDF规范-以点为单位获取字体大小,pdf,fonts,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

我试图用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
...
然而,我在PDF规范中找不到任何支持这种转换的内容,我检查的库(PDFBox、iTextSharp、Spire PDF)中都没有列出字体大小,只有21.33

我应该使用CTM(由cm操作员定义)将字体大小缩放回正确的比例,还是这纯粹是偶然的


pdf文件如下:

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

我检查过的库(PDFBox、iTextSharp、Spire PDF)都没有列出字体大小,只有21.33

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


现在,关于你的方法:

为了从该字体大小转换回点,我打算使用cm操作符的比例(y)生成点大小:

21.33 * 0.75 = 15.9975
21.33 * 0.75 = 15.9975
虽然一些图书馆这样称呼它,但将第四个cm参数称为“scale(y)”是误导性的。例如,如果文本旋转90°,则通常为空,而图形表示通常不会降低到零高度

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


最后,让我们讨论一下你到底在追求什么

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

但一旦组合矩阵中出现剪切,“字体大小”的含义就不再明显了

  • 您可能指的是原始垂直线(一个单位高)转换为的长度
  • 您可能指的是转换后的线条在与转换后的字体基线成直角的线条上的投影长度
  • 或者,您可能是指转换后的直线投影到与观察到的基线成直角的直线上的长度

前两个数字用简单的线性代数计算起来很简单。第三个数字可能更难,因为您必须确定人类在生成的PDF中观察到的基线。在创新性地使用变换的情况下,这可能是非常重要的

cm
操作相互连接,因此是的,当处理
Tf
运算符时,第一次缩放操作中的系数
0.75
仍然是“有效的”。这不是真正的转换;所有的图形操作都是使用矩阵完成的。有没有一种方法可以将字体大小的缩放表示为矩阵操作,因为它是一个标量值,所以不可能将其乘以矩阵?在问题中的示例中,scaleX的值=0.75,scaleY的值=0.75(负),因此乘以X的比例是有意义的,但我无法找出这样做的理由。这就是我们如何在给定各种变换矩阵的情况下计算点的大小。我仍然不能100%确定它在每种情况下都是正确的,但在大多数情况下它似乎“足够接近”。