Vb6 生成真实字体的PDF

Vb6 生成真实字体的PDF,vb6,pdf-generation,truetype,Vb6,Pdf Generation,Truetype,我正在vb6中生成真正类型字体的pdf文件。对于true type字体,我们必须在字体字典中提到一个名为Widths的数组。我在获取所有字体的宽度数组值时遇到困难。有人能帮我吗…?在OP解释的评论中 实际上我从这里下载了一个项目文件。在这里,他正在生成真正类型字体的pdf。在clsPDFCreator类中,他正在调用名为CreateFontTimes的函数,该函数将写入宽度数组值。在这个函数中,他提到了Time New Roman字体的数组值。像wise一样,我也可以提到其他字体的数组值 方法C

我正在vb6中生成真正类型字体的pdf文件。对于true type字体,我们必须在字体字典中提到一个名为Widths的数组。我在获取所有字体的宽度数组值时遇到困难。有人能帮我吗…?

在OP解释的评论中

实际上我从这里下载了一个项目文件。在这里,他正在生成真正类型字体的pdf。在clsPDFCreator类中,他正在调用名为CreateFontTimes的函数,该函数将写入宽度数组值。在这个函数中,他提到了Time New Roman字体的数组值。像wise一样,我也可以提到其他字体的数组值

方法
CreateFontTimes
(对于其他字体的选择,类似地还有多个其他字体)返回一个对象,该对象包含相应字体的多个属性,其中有一个
Widths
数组,该数组是从硬编码数组初始化的,类似于
pdfFontStyle.pdfNormal

awTemp = New Int16() {0, 250, 333, 408, 500, 500, 833, 778, 180, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, _
 333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480, 541, 778, 500, 778, 333, 500, 444, 1000, 500, 500, 333, 1000, 556, 333, 889, 778, 611, 778, 778, 333, 333, 444, 444, 350, 500, 1000, 333, 980, 389, 333, 722, 778, 444, 722, _
 250, 333, 500, 500, 500, 500, 200, 500, 333, 760, 276, 500, 564, 333, 760, 500, 400, 549, 300, 300, 333, 576, 453, 250, 333, 300, 310, 500, 750, 750, 750, 444, 722, 722, 722, 722, 722, 722, 889, 667, 611, 611, 611, 611, 333, 333, 333, 333, 722, 722, 722, 722, 722, 722, 722, 564, 722, 722, 722, 722, 722, 722, 556, 500, _
 444, 444, 444, 444, 444, 444, 667, 444, 444, 444, 444, 444, 278, 278, 278, 278, 500, 500, 500, 500, 500, 500, 500, 549, 500, 500, 500, 500, 500, 500, 500, 500}
现在OP显然想为其他字体创建类似的方法,并想知道如何检索宽度信息

数组项的顺序 首先,您需要知道宽度在该数组中的显示顺序。这实际上非常简单,在
CreateFontTimes
本身中,您可以看到设置了第一个和最后一个宽度的索引:

    .FirstChar = 32
    .LastChar = 255
在调用方法
LoadFont
中,您可以看到字体是通过

"/Encoding /WinAnsiEncoding"
该编码在附录D.2“字符码(八进制)/WIN”列中的“拉丁字符集和编码”中规定

出于某种原因(可能是为了便于并行维护VB6和较新版本),数组中有一个前导条目0,后面的条目将被忽略

因此,数组中的顺序是

0
width of *space*      " " 
width of *exclam*     "!"
width of *quotedbl*   """
width of *numbersign* "#"
width of *dollar*     "$"
width of *percent*    "%"
width of *ampersand*  "&"
...
手动检索图示符的宽度 检索字形宽度的一个选项是在字体编辑器(如font forge)中打开有问题的字体文件并手动复制宽度。通过双击图示符,您可以看到该图示符的绘图说明,例如,符号和该符号的绘图说明

沿着箭头可以找到宽度,本例中为1593

但是,在vbpdf中使用此值之前,必须先缩放此值,因为PDF字体通常假定em宽度为1000,而字体文件可能具有不同的度量值,您可以在“常规”选项卡上的“字体信息”对话框中找到:

因此,您必须将1593除以2048,然后乘以1000,得到777.83203125,在上面的数组中四舍五入为778:

awTemp = New Int16() {0, 250, 333, 408, 500, 500, 833, 778, 180, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, _
                                                       ^^^
通过程序检索图示符的宽度 显然,手动查找宽度是一项相当枯燥的任务,您可以通过使用程序来加速它。您将在msdn上找到感兴趣的函数,例如


“我在获取所有字体的宽度数组值时面临困难”-确切地说是哪个困难?你尝试了什么,在哪里卡住了?@mkl,例如,4 0 obj>endobj。这里我想知道如何获得宽度的值。(stackoverflow新手,很抱歉不恰当的评论)。好的,但是你需要什么?您正在寻找一个库或API来解析字体文件吗?或者,您是否拥有其中一个,但不知道如何使用它们检索字形宽度?或者你有字体的字形宽度,但不知道哪个宽度属于宽度数组中的哪个位置?还是这个问题是另一个问题?@Sachin:我知道你对堆栈溢出还不熟悉,欢迎光临。然而,你需要在你的问题上投入更多的精力。就目前情况而言,它可能过于宽泛和不明确。你的评论应该是(你看到问题下方的编辑链接了吗?点击它。)。更好的是,请阅读并回来改进您的问题。@mkl实际上我从这里下载了一个项目文件。在这里,他正在生成真正类型字体的pdf。在clsPDFCreator类中,他正在调用名为CreateFontTimes的函数,该函数将写入宽度数组值。在这个函数中,他提到了Time New Roman字体的数组值。像wise一样,我也可以提到其他字体的数组值。非常感谢@mkl。它真的帮了我很多。嗨@mkl,还需要一个帮助。你能帮我找到其他的值吗?比如Flags,FontBBox,StemV,ItalicAngle,CapHeight,XHeight,ascend,degress,Leading,MaxWidth,AvgWidth。我不是一个真正的字体专家。但是上面显示的“常规”选项卡上已经可以找到其中一些条目(上升和下降在第一行;不要忘记缩放;PDF希望下降为负数),斜角在第三行。最大宽度和平均宽度可以从您拥有的宽度数组中计算。您可以在font forge显示的一些示例字符中测量StemV、CAPHEIGH和XHeight。宽度、前导和X高度是可选的,因此您不需要它们。边界框应该在head表中,但我在Font Forge中没有看到。