【问题标题】:How to get the accurate font size(height) in pdf如何在pdf中获得准确的字体大小(高度)
【发布时间】:2015-05-19 22:14:20
【问题描述】:

我有一个示例 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

【问题讨论】:

  • 您不是在寻找字体大小,而是在寻找 glyph 大小——众所周知,这很难获得。 字体的大小与它所包含的字符的大小无关。
  • 您在此处的链接指向 Microsoft 的 Live OneDrive 以及在 Word 的在线版本中打开的内容。您能否将实际的 PDF 文件发布到某个地方?
  • 更新了示例pdf的链接onedrive.live.com/?cid=af5d216ec9b3d680
  • PDF 中文本中的字形不会延伸到基线以下,但字体大小的特定部分是为该基线以下的字形部分保留的。因此,框高度远小于字体大小。

标签: parsing pdf fonts itextsharp itext


【解决方案1】:

好的 - 我看了你的文件,你基本上已经被冲洗掉了。这是科学的答案,现在让我澄清一下:)

错误的 PDF!
您作为示例的 PDF 包含未嵌入的字体。您在那里的“/F1 Tf”命令指向该页面的资源字典中的字体“ArialMT”。因为没有嵌入字体,所以你只有两种选择:

  1. 尝试在系统上找到实际字体并从中提取必要的信息。
  2. 使用 PDF 中的信息。让我们开始吧。

字体描述符
这是 pdfToolbox 中检查 PDF 文件中字体的图像(注意:我与此工具相关联):

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

系统信息 你没有说为什么你需要这些信息,所以进一步建议变得有点困难。但是,如果您无法从 PDF 中获取信息,那么您唯一的选择就是忍受 PDF 中的不准确信息,或者求助于您的代码运行所在的系统以获得更多信息。

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

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

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

【讨论】:

    【解决方案2】:

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

    确实,您的 PDF 显示如下:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      相关资源
      最近更新 更多