CAM::PDF, возвращающий не ascii символ вместо кавычек

У меня проблемы с возвращением не 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;

Вы можете скачать образец.pdf здесь

Текст, возвращаемый в Tj, часто имеет один символ, который не является ASCII. В PDF фактическим символом почти всегда является кавычка, одинарная или двойная.

При воспроизведении этого я обнаружил, что возвращаемый символ является непротиворечивым в PDF, но различается среди PDF. Я также заметил, что PDF использует определенный файл шрифта. Сейчас я изучаю файлы шрифтов, чтобы узнать, можно ли сопоставить один и тот же символ с различными двоичными значениями.

: edit: По поводу Windows-1252. Мой PDF возвращает "" "вместо апострофов. Символ is является шестнадцатеричным 0xD5 в Windows-1252 и UTF-8. Если идея заключается в том, что символ закодирован с помощью 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 ответа

Решение

Я автор CAM-PDF. Ваш PDF не соответствует. Из спецификации PDF 1.7, раздел 3.2.3 "Строковые объекты":

"Внутри буквальной строки обратная косая черта (\) используется в качестве escape-символа для различных целей, таких как включение символов новой строки, непечатаемых символов ASCII, несбалансированных скобок или самого символа обратной косой черты в строке. [...] Экранирующая последовательность \ddd предоставляет способ представления символов за пределами печатаемого набора символов ASCII."

Если у вас есть большое количество не-ASCII символов, вы можете представить их, используя шестнадцатеричную строковую нотацию.

РЕДАКТИРОВАТЬ: Возможно, моя интерпретация спецификации неверна, учитывая альтернативный ответ a_note. Мне придется вернуться к этому... Конечно, спецификации могут быть более ясными в этой области.

Извините, что вмешиваюсь и при всем уважении, сэр, но файл совместим. Раздел 3.2.3 далее гласит:

Нотация [\ddd] позволяет указать символы вне 7-битного набора символов ASCII, используя только символы ASCII. Однако любое 8-битное значение может появиться в строке.

"получение" - где? Вы получаете "Õ" вместо ожидаемого что? И что конкретно делать? Вы знаете, что в командной строке Windows используется кодовая страница DOS, а не Windows-1252, верно? (Ой, новая тема снова... вероятно, я должен зарегистрироваться здесь:-))

Другие вопросы по тегам