You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否为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中。步骤如下:

  1. 安装字体转换工具ttf2pt1(Debian Stretch下可以直接用apt安装):
sudo apt-get install ttf2pt1
  1. 转换TrueType字体为Type1格式:
ttf2pt1 /path/to/your-font.ttf output-font-name

执行后会生成.pfb(字体二进制文件)和.afm(字体度量文件)两个文件。

  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:31:21