生成真实字体的PDF

时间:2016-10-26 06:54:52

标签: vb6 pdf-generation true-type-fonts

我在vb6中生成真实字体的pdf文件。对于真实字体,我们必须在字体字典中提到名为Widths的数组。我在为所有字体获取widths数组的值时遇到困难。任何人都可以帮助我......?

1 个答案:

答案 0 :(得分:2)

OP在评论中解释了

  

实际上我在这里从http://www.luigimicco.altervista.org/doku.php/vbpdf下载了一个项目文件。在这里,他正在生成真实字体的pdf。在clsPDFCreator类中,他正在调用一个名为CreateFontTimes的函数,该函数将写入widths数组值。在这个函数中,他提到了Time New Roman字体的数组值。我也可以提到其他字体的数组值。

方法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中,您会看到使用

将字体导入PDF
"/Encoding /WinAnsiEncoding"

并且此编码在附件D.2和#34;拉丁字符集和编码"中的PDF specification中指定。在列" CHAR CODE(OCTAL)/ 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)中打开相关字体文件并手动复制宽度。通过双击字形,您可以看到它的绘图说明,例如:对于&符这个

ampersand

在箭头后面,您会找到宽度,在这种情况下为1593.

在vbpdf中使用之前必须缩放此值,因为PDF字体通常假设em宽度为1000,而字体文件可能有不同的度量,您可以在" General&上的字体信息对话框中找到它。 #34;标签:

font information

因此,你必须将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上找到感兴趣的功能,例如