如何在pdf中获得准确的字体大小(高度)

时间:2015-05-19 22:14:21

标签: parsing pdf fonts itextsharp itext

我有一个示例pdf(附件),它包含一个文本对象和一个高度几乎相同的矩形对象。然后我使用itextrup检查了pdf的内容,如下所示:

1 1 1 RG
1 1 1 rg
0.12 0 0 0.12 16 50 cm
q
0 0 m
2926 0 l
2926 5759 l
0 5759 l
0 0 l
W
n
Q

1 1 1 RG
1 1 1 rg
q
0 0 m
2926 0 l
2926 5759 l
0 5759 l
0 0 l
W
n
/F1 205.252 Tf
BT
0 0 0 RG
0 0 0 rg
/DeviceGray CS
/OC /oc1 BDC
0 -1 1 0 1648 5330 Tm
0 Tc
100 Tz
(Hello World) Tj
ET
Q
q
0 0 m
2926 0 l
2926 5759 l
0 5759 l
0 0 l
W
n
0 0 0 RG
0 0 0 rg
/DeviceGray CS
6 w
1 j
1 J
1649 5324 m
1649 4277 l
1800 4277 l
1800 5324 l
1649 5324 l
S
EMC
Q

显然用户空间矩阵由[0.12 0 0 0.12 16 50]确定,矩形的高度为(1800-1649)* 0.12 * 1 = 18.12,对于字体大小我使用205.252 * 0.12 = 24.63024。由于这两个值不接近,我的问题是如何获得字体的高度/大小?

sample.pdf

2 个答案:

答案 0 :(得分:1)

好的 - 我看了你的文件,你基本上都是软管。这是科学的答案,现在让我澄清一下:)

错误的PDF!
您在那里作为示例包含的PDF包含未嵌入的字体。您在那里的“/F1 Tf”命令指向该页面的资源字典中的字体“ArialMT”。由于尚未嵌入字体,因此您只有两个选项:

  1. 尝试在系统中找到实际字体并从那里提取必要的信息。
  2. 使用PDF中的信息。让我们从那开始吧。
  3. 字体描述符
    以下是pdfToolbox中检查PDF文件中字体的图像(注意:我与此工具相关联):

    enter image description here

    我已经删除了一些“Widths”表,但除此之外,这是PDF文档中此字体的所有信息。这意味着您可以访问每个字形的宽度,但您无法访问每个字形的高度。关于高度的唯一信息是字体边界框,它是所有字形边界框的并集​​。换句话说,字体边界框保证足够大,可以包含字体中的任何字形(水平和垂直)。

    系统信息 您没有说为什么您需要此信息,因此进一步建议变得有点困难。但是,如果您无法从PDF中获取信息,那么您只能选择使用PDF中的不准确信息,或转向运行代码的系统以获得更多信息。

    如果你安装了ArialMT字体,你基本上可以尝试找到字体文件,然后解析TrueType字体文件以找到每个字形的边界框。我做到了,这不好笑。

    您可以查看您的系统是否无法以更好的方式为您提供信息。许多操作系统/语言都有文本调用,可以为您提供准确的测量。如果没有,您可以通过在白色图像上呈现黑色所需的文本然后检查像素以查看您的位置以及文本字符串中最大字形的大小来强制它。

    虽然最后一个选项听起来很浪费,但它可能是最快和最容易实现的,而且 - 根据您的需要 - 可能实际上是最好的选择。

答案 1 :(得分:1)

  

我有一个示例pdf(附件),它包含一个文本对象和一个高度几乎相同的矩形对象。

确实,您的PDF显示如下:

screen shot

但是看一下这个很快就会意识到你的文本“Hello World”中的字形不会像'g','j'或其他一些字形一样延伸到基线之下:

Some data concerning 'g'

(基线是通过字形原点的行)

  

由于两个值不接近,我的问题是如何获得字体的高度/大小

显然,基线下面的这种下降所需的空间也必须是字体大小的一部分。

因此,它完全正确且不是问题盒子的高度(18.12)远小于字体大小(24.63024)。

BTW,这与描述字体大小为1的规范相对应,该字体大小被排列,使得紧密间隔的文本行的标称高度为1个单位,参见。第9.2.2节“ISO 32000-1的显示文本基础”。紧密间隔的线显然不仅需要包括基线上方的字形部分,还要包括下面的字形部分。此外,它还包括这些线之间的小间隙,因为即使是紧密间隔的线也不会相互接触。