我遇到了返回非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";
答案 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,对吗? (哎呀,新线程......我可能应该在这里注册:-))