如何计算/宽度表?

时间:2018-05-29 20:30:35

标签: pdf winapi mfc pdf-generation

我的MFC应用程序生成PDF,现在我正在尝试嵌入TrueType字体,嵌入一个字体,我需要“告诉”PDF上的字体对象Glyph Widths

我无法获取这些值,我已尝试使用GetCharABCWidthsFloatGetCharWidthFloat并与this answer结合使用,表示我需要使用公式(advance * 1000) / unitsPerEm(缩放GetCharWidthFloat的结果以获得进展)。

但我不明白我会如何扩展?是否有返回这些值的winApi函数?

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

1 em 等于 12 points
see reference

对于MM_TEXT映射模式,字体高度定义为:

lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
//or 
lfHeight = round(PointSize * GetDeviceCaps(hDC, LOGPIXELSY) / 72.0f);

see LOGFONG documentation

例如,对于桌面屏幕,在100%DPI时,GetDeviceCaps(hDC, LOGPIXELSY)返回96。在这种情况下,我们有:

  

1em = 16,在100%DPI下      或
     1em = 20,DPI为125%      或
     1em = 24,在150%DPI下

double inch_per_pixel_y = (double)dc.GetDeviceCaps(LOGPIXELSY);

int size_em = 1;
int size_from_em = (int)round(size_em * inch_per_pixel_y / 6.0f);
printf("size_from_em %d\n", size_from_em);

size_em = (int)round(size_from_em * 6.0f / inch_per_pixel_y);
printf("size_from_em %d\n", size_em);

请注意,我们在这里失去了很多精确度。也许这就是PDF与因子1000相乘的原因。

使用dc.GetDeviceCaps(LOGPIXELSX)进行宽度计算。