我在返回非 ascii 字符时遇到问题。我不确定问题存在于哪个级别。它可能是实际的 PDF 编码、CAM::PDF 使用的解码(即 FlateDecode)或 CAM::PDF 本身。下面返回一个字符串,其中包含用于创建 PDF 的命令(Tm、Tj 等)。
use CAM::PDF;
my $filename = "sample.pdf";
my $cam_obj = CAM::PDF->new($filename) or die "$CAM::PDF::errstr\n";
my $tree = $cam_obj->getPageContentTree(1);
my $page_string = $tree->toString();
print $page_string;
您可以在此处下载 sample.pdf
Tj 中返回的文本通常有一个非 ASCII 字符。在 PDF 中,实际字符几乎总是单引号或双引号。
在重现此内容时,我发现返回的字符在 PDF 中是一致的,但在 PDF 中有所不同。我还注意到 PDF 正在使用特定的字体文件。我现在正在研究字体文件,看看是否可以将相同的字符映射到不同的二进制值。
:edit: 关于 Windows-1252。我的 PDF 返回一个“Õ”而不是撇号。在 Windows-1252 和 UTF-8 中,Õ 字符是十六进制 0xD5。如果想法是字符是用 Windows-1252 编码的,那么它应该是十六进制的 0x91 或 0x92,但它不是。这就是为什么以下对角色没有任何作用的原因:
use Encode qw(decode encode);
my $page_string = 'Õ';
my $characters = decode 'Windows-1252', $page_string;
my $octets = encode 'UTF-8', $characters;
open STS, ">TEST.txt";
print STS $octets . "\n";