能否为Perl模块PDF::Create导入TrueType字体以扩展PDF可用字体?
解决PDF::Create无法使用自定义TrueType字体的问题
首先得明确:PDF::Create本身确实不支持直接添加自定义TrueType字体到它的PostScript BaseFont列表。这个模块的设计初衷就是依赖PDF标准内置的那几款BaseFont(Courier、Helvetica、Times等),没有提供嵌入外部TrueType字体的原生功能。不过别担心,有两个可行的解决办法:
方案1:换用支持TrueType字体的PDF生成模块(推荐)
如果可以调整你的脚本,我强烈推荐改用PDF::API2或者CAM::PDF这类更强大的模块,它们原生支持TrueType字体嵌入,操作也很直观。
比如用PDF::API2的示例代码:
use PDF::API2; # 初始化PDF对象 my $pdf = PDF::API2->new(); my $page = $pdf->page(); my $text_layer = $page->text(); # 加载你安装的TrueType字体(替换成你的字体实际路径) my $custom_font = $pdf->ttfont('/usr/share/fonts/truetype/your-font.ttf'); # 设置字体和字号 $text_layer->font($custom_font, 14); # 定位并添加文本 $text_layer->translate(50, 700); $text_layer->text('这是用自定义TrueType字体生成的标签内容'); # 保存PDF文件 $pdf->saveas('custom-label.pdf');
这个方法的优势是简单直接,不需要额外转换字体,而且PDF::API2的功能比PDF::Create更丰富,后续扩展标签功能也更方便。
方案2:将TrueType字体转换为PostScript Type1字体(仅当必须用PDF::Create时)
如果你因为某些原因必须继续使用PDF::Create,那可以把TrueType字体转换成PostScript Type1格式,再尝试嵌入到PDF中。步骤如下:
- 安装字体转换工具
ttf2pt1(Debian Stretch下可以直接用apt安装):
sudo apt-get install ttf2pt1
- 转换TrueType字体为Type1格式:
ttf2pt1 /path/to/your-font.ttf output-font-name
执行后会生成.pfb(字体二进制文件)和.afm(字体度量文件)两个文件。
- 在PDF::Create中手动注册这个Type1字体:
use PDF::Create; my $pdf = PDF::Create->new('filename' => 'type1-label.pdf'); my $page = $pdf->new_page('MediaBox' => [0, 0, 612, 792]); # 读取Type1字体的pfb文件内容 open my $font_fh, '<:raw', 'output-font-name.pfb' or die $!; my $font_data = do { local $/; <$font_fh> }; close $font_fh; # 注册自定义Type1字体 my $custom_font = $pdf->font( 'BaseFont' => 'CustomType1Font', 'Subtype' => 'Type1', 'FontDescriptor' => { 'FontName' => 'CustomType1Font', 'FontFile' => $pdf->new_obj(), 'Ascent' => 800, # 这些参数需要从afm文件中获取,或者手动调整 'Descent' => -200, 'CapHeight' => 700, 'Flags' => 32, } ); # 将字体数据嵌入到PDF对象中 $custom_font->{'FontDescriptor'}->{'FontFile'}->{' stream'} = $font_data; # 使用自定义字体 my $text = $page->text(); $text->font($custom_font, 12); $text->translate(100, 100); $text->text('Test with converted Type1 font'); $pdf->close();
注意:这个方法比较繁琐,需要手动处理字体度量参数(比如Ascent、Descent这些值要从.afm文件中提取),而且容易出现字体显示异常的问题,所以只推荐在必须保留PDF::Create的情况下使用。
内容的提问来源于stack exchange,提问作者gatorreina
相关产品推荐
相关产品推荐

