CAM :: PDF返回非ascii字符而不是引号

时间:2012-05-11 01:37:44

标签: perl pdf cam-pdf

我遇到了返回非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 here

Tj中返回的文本通常有一个非ASCII字符。在PDF中,实际字符几乎总是引用,单引号或双引号。

在复制时我发现返回的字符在PDF中是一致的,但在PDF中有所不同。我还注意到PDF正在使用特定的字体文件。我现在正在研究字体文件,看看是否可以将相同的字符映射到不同的二进制值。

:编辑: 关于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";

3 个答案:

答案 0 :(得分:1)

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

  

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

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

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

答案 1 :(得分:1)

很抱歉,干扰并且充分尊重,先生,但文件符合IS。第3.2.3节进一步说明:

  

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

答案 2 :(得分:0)

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

相关问题