1

我在返回非 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";
4

3 回答 3

1

我是 CAM-PDF 的作者。您的 PDF 不合规。从 PDF 1.7 规范,第 3.2.3 节“字符串对象”:

“在文字字符串中,反斜杠 (\) 用作各种目的的转义字符,例如在字符串中包含换行符、非打印 ASCII 字符、不平衡括号或反斜杠字符本身。[...] \ddd 转义序列提供了一种表示可打印 ASCII 字符集之外的字符的方法。”

如果您有大量的非 ASCII 字符,您可以使用十六进制字符串表示法来表示它们。

编辑:鉴于 a_note 的替代答案,也许我对规范的解释是不正确的。我将不得不重新审视这个......当然,这个领域的规范可能会更清晰。

于 2012-05-11T22:46:26.340 回答
1

抱歉打扰,恕我直言,先生,但文件符合要求。第 3.2.3 节进一步指出:

[\ddd] 表示法提供了一种仅使用 ASCII 字符来指定 7 位 ASCII 字符集之外的字符的方法。但是,任何 8 位值都可能出现在字符串中。

于 2012-05-16T23:14:13.577 回答
0

“接收”——在哪里?你得到“Õ”而不是预期什么?究竟在做什么?你知道windows命令提示符使用dos代码页,而不是windows-1252,对吧?(哎呀,又是新线程......也许我应该在这里注册:-))

于 2012-05-18T17:29:48.687 回答