- 论坛徽章:
- 7
|
jjboy110 发表于 2013-12-24 11:27 ![]()
对内部字体的理解应该是当前运行系统存在的字体,不应该是perl这个模块包含的字体,从prFont的解释中能看出来这个函数的作用是调用系统存在的字体 这个模块本身又没打包字体,也没动态生成字体,prFont调用的当然是系统存在的字体,不过,我说的很清楚了内部字体(准备翻译是内建字体列表里的字体)不等同与系统存在的字体。我都说除了我引用的那段文档以外,我有看过这个模块的代码,你不想相信我说的话坚持那样理解我也没有办法,因此这是我最后一次回复这个帖子。不过,我在下面会给出更充分的说明,至于你是否仍然不相信,那我就管不着也不想管了。
首先,我引用的那段文档用的是the list of core built-in fonts,注意是built-in不是system,是“内建”,不是“系统”,另外,我从来没说过是这个模块包含的字体,是说这个list,是由这个模块预定义的,而且我在上次的回贴中也说得很清楚,所谓预定义,也就是给字体取个别名,加载一下这个字体,然后把相关信息存在一个哈希里边,这个哈希就是实质上的the list of core built-in fonts,而那个预定义的list概念来说就是Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique or abbreviated TR, TB, TI, TBI, C, CB, CO, CBO, H, HB, HO, HBO. (Symbol and ZapfDingbats or abbreviated S, Z, also belong to the predefined fonts, but there is something with them that I really don't understand. You should print them first on a page, and then use other fonts, otherwise they are not displayed.)(这个list引用自文档,不保证和实际的代码实现完全一致)。
另外,我之所以提我看过代码,除了让自己的话更有说服力一点以外,更重要的是因为你说你自己写看过代码,所以我是想传达给你你如果还搞不清楚的话就自己去看看代码,这也是我不想再管的另一个原因。下面贴一部分那个模块的代码来说明问题:- sub prFont
- { my $nyFont = shift; # $nyFont 就是你提供给prFont的参数
- my ($intnamn, $extnamn, $objektnr, $oldIntNamn, $oldExtNamn);
-
- if (! $pos)
- { errLog("No output file, you have to call prFile first");
- }
- $oldIntNamn = $aktuellFont[foINTNAMN];
- $oldExtNamn = $aktuellFont[foEXTNAMN];
- if ($nyFont)
- { ($intnamn, $extnamn, $objektnr) = findFont($nyFont);# $nyFont是在findFont里进行处理的
- }
- else
- { $intnamn = $aktuellFont[foINTNAMN];
- $extnamn = $aktuellFont[foEXTNAMN];
- }
- if ($runfil)
- { $log .= "Font~$nyFont\n";
- }
- if (wantarray)
- { return ($intnamn, $extnamn, $oldIntNamn, $oldExtNamn, \%font);
- }
- else
- { return $intnamn;
- }
- }
复制代码- sub findFont()
- { no warnings;
- my $Font = shift || '';#这个是传进来的参数
-
- if (! (exists $fontSource{$Font})) # Fonten måste skapas 如果在 %fontSource里找不到的话
- { if (exists $stdFont{$Font})
- { $Font = $stdFont{$Font};} # 那么可以是%stdFont里的字体
- else
- { $Font = $genFont; } # Helvetica sätts om inget annat finns,否则$Font就取$genFont,这个就是Helvetica,原注释应该想说这种意思,虽然用的不是英文说的,我上次看过$genFont的定义,你不相信的话可以自己在那个模块里找这个的定义,下面如果引用其他代码的时候有碰巧有$genFont的定义的话我会注释出来,要是没有我就不单独给你贴这个的定义了
- if (! (exists $font{$Font})) # 如果这个字体不存在于 %font里(但是它要么在%stdFont里,要么就是Helvetica,不可能是其它)
- { $objNr++;
- $fontNr++;
- my $fontAbbr = 'Ft' . $fontNr; #定义别名
- my $fontObjekt = "$objNr 0 obj<</Type/Font/Subtype/Type1" .
- "/BaseFont/$Font/Encoding/WinAnsiEncoding>>endobj\n";#加载Type1字体对应的encoding信息(这个只对Type1字体是必要的,对于我们现在常用的ttf和otf字体,也就是TrueType字体没用)
- $font{$Font}[foINTNAMN] = $fontAbbr; #加到%font里
- $font{$Font}[foREFOBJ] = $objNr;
- $objRef{$fontAbbr} = $objNr;
- $fontSource{$Font}[foSOURCE] = 'Standard';#加到%fontSource里
- $objekt[$objNr] = $pos;
- $pos += syswrite UTFIL, $fontObjekt;
- }
- }
- else # 如果在%fontSource里
- { if (defined $font{$Font}[foREFOBJ]) # Finns redan i filen
- { ; }
- else # 不在%font里,而foSOURCE是Standard的话,就做与上面相同的别名和encoding的定义
- { if ($fontSource{$Font}[foSOURCE] eq 'Standard')
- { $objNr++;
- $fontNr++;
- my $fontAbbr = 'Ft' . $fontNr;
- my $fontObjekt = "$objNr 0 obj<</Type/Font/Subtype/Type1" .
- "/BaseFont/$Font/Encoding/WinAnsiEncoding>>endobj\n";
- $font{$Font}[foINTNAMN] = $fontAbbr;
- $font{$Font}[foREFOBJ] = $objNr;
- $objRef{$fontAbbr} = $objNr;
- $objekt[$objNr] = $pos;
- $pos += syswrite UTFIL, $fontObjekt;
- }
- else # 如果不是standard 就不加载相应的字体属性,但是相应的,这个字体必需是已经在当前处理的PDF文件里内嵌了的字体
- { my $fSource = $fontSource{$Font}[foSOURCE];
- my $ri = rindex($fSource, '_');
- my $Source = substr($fSource, 0, $ri);
- my $Page = substr($fSource, ($ri + 1));
-
- if (! $fontSource{$Font}[foORIGINALNR])
- { errLog("Couldn't find $Font, aborts");
- }
- else
- { my $namn = extractObject($Source, $Page,
- $fontSource{$Font}[foORIGINALNR], 'Font');
- }
- }
- }
- }
- $aktuellFont[foEXTNAMN] = $Font;
- $aktuellFont[foREFOBJ] = $font{$Font}[foREFOBJ];
- $aktuellFont[foINTNAMN] = $font{$Font}[foINTNAMN];
- $aktuellFont[foTYP] = $font{$Font}[foTYP];
-
- $sidFont{$aktuellFont[foINTNAMN]} = $aktuellFont[foREFOBJ];
- if (! $pos)
- { errLog("No output file, you have to call prFile first");
- }
- return ($aktuellFont[foINTNAMN], $aktuellFont[foEXTNAMN], $aktuellFont[foREFOBJ]);
- }
复制代码
- our %stdFont = # 而 stdFont就是所谓的内建列表,(之前我还没说,事实上这些字体对PDF阅读器来说它知道如何去系统目录下找对应的系统字体,如果找不到的话会用相近的字体进行替换,所以=>右边给的其实是PDF文档认识的字体名而非系统内的字体的字体名,PDF文档认识的字体并不多)
- ('Times-Roman' => 'Times-Roman',
- 'Times-Bold' => 'Times-Bold',
- 'Times-Italic' => 'Times-Italic',
- 'Times-BoldItalic' => 'Times-BoldItalic',
- 'Courier' => 'Courier',
- 'Courier-Bold' => 'Courier-Bold',
- 'Courier-Oblique' => 'Courier-Oblique',
- 'Courier-BoldOblique' => 'Courier-BoldOblique',
- 'Helvetica' => 'Helvetica',
- 'Helvetica-Bold' => 'Helvetica-Bold',
- 'Helvetica-Oblique' => 'Helvetica-Oblique',
- 'Helvetica-BoldOblique' => 'Helvetica-BoldOblique',
- 'Symbol' => 'Symbol',
- 'ZapfDingbats' => 'ZapfDingbats',
- 'TR' => 'Times-Roman',
- 'TB' => 'Times-Bold',
- 'TI' => 'Times-Italic',
- 'TBI' => 'Times-BoldItalic',
- 'C' => 'Courier',
- 'CB' => 'Courier-Bold',
- 'CO' => 'Courier-Oblique',
- 'CBO' => 'Courier-BoldOblique',
- 'H' => 'Helvetica',
- 'HB' => 'Helvetica-Bold',
- 'HO' => 'Helvetica-Oblique',
- 'HBO' => 'Helvetica-BoldOblique',
- 'S' => 'Symbol',
- 'Z' => 'ZapfDingbats');
复制代码 而%fontSource一开始是空的,就是通过调用上面的findFont()把标准字体在需要的时候慢慢加进去的。
好吧,我的解释就到这里,多的话不说了,回复这个帖子感觉真浪费时间,要不是因为我对现在的老板很不爽,也不会有闲功夫放下自己的工作来回这么无聊的贴(好吧,对于自己的回复被实质的当成了没有任何意义的东西而稍微激动了一下,其实也不是那么要紧)。 |
|