Как acrobat кодирует аннотации, добавленные в виде заметок в pdf? - PullRequest
1 голос
/ 17 декабря 2008

Мы читаем и пишем заметки / аннотации / комментарии к PDF-файлам с помощью элемента управления activex в нашем приложении в течение ряда лет. Недавно мы обновились до Delphi2009 с поддержкой Unicode. Следующее вызывает проблемы.

Когда мы звоним

CAcroPDAnnot.GetContents

Результаты кажутся довольно странными, и мы теряем наши символы Unicode. Это не похоже на сохранение в виде строки ANSI, которая обычно приводит к возвращению ????? вместо этого мы получаем строку, такую ​​как

, És, «ú,É • -Z ×, ð,Ð, ¢, ½,ç

Для строки японских символов.

Однако, если я сохраню комментарии в pdf-файле в файле данных через меню в самом pdf-файле, он записывается в файл как что-то вроде

0kL0Oeå0k~¨ª0'0r0D0_0 ‰

Последний может быть экспортирован и повторно импортирован в PDF-файл акробата и воссоздает правильные символы Юникода. Однако, когда я вызываю CAcroPDAnnot.GetContents в моем коде, он возвращается как-то еще.

  1. Не поврежден ли CAcroPDAnnot.GetContents?
  2. Есть ли схема кодирования, о которой мне следует знать?
  3. Есть ли альтернатива, которую я мог бы сделать?

Спасибо

Ответы [ 3 ]

2 голосов
/ 03 февраля 2009

, És, «ú,É • -Z ×, ð,Ð, ¢, ½,ç

Это строка:

に 行 く 日 に 風邪 を ひ い た ら

в кодировке CP-932, также известной как Shift-JIS, ужасная, но прискорбно все еще популярная кодировка в Японии.

В настоящее время вы интерпретируете его как CP-1252 (Windows Western European). Если ваш компонент для чтения PDF не преобразует его для вас автоматически, вам нужно найти способ определить кодировку документа и преобразовать его вручную.

Я не знаю, что Delphi предоставляет для чтения кодировок, но получили ли вы кодировки для Shift-JIS, установленные в Windows, из панели управления -> Региональные параметры -> «Установить файлы для восточноазиатских языков»? Если нет, то это может объяснить, почему он не может автоматически конвертировать, возможно.

1 голос
/ 03 февраля 2009

Вы не совсем даете нам много информации для работы.

Я так понимаю, вы говорите о методе GetContents класса "Acrobat.CAcroPDAnnot". Какую версию Acrobat вы используете? Возможно, вы переключали версии (или запускали обновление) примерно в то время, когда начинали программировать с Delphi 2009?

Тогда: как вы создали объект? Если вы используете файл * _TLB.pas, сгенерированный из DLL, вы уверены, что он все еще соответствует? (Попробуйте сгенерировать заново, если не уверены).

Третье: как вы называете метод? Какой тип переменной вы присваиваете результат?

Что также может помочь, если вы могли бы предоставить образец аннотации (желательно, включая символы, не входящие в ASCII); и для этой аннотации:

  • как это должно выглядеть (и как оно выглядит внутри Reader)
  • что возвращается при использовании Delphi до 2009 года *
  • что он возвращает при использовании Delphi 2009 *

(* предпочтительно HEX-байтовые коды строк (ansi / wide); но вывод из инспектора Ctrl-F7 должен подойти)

Тогда, возможно, кто-то может дать более значимый ответ.

0 голосов
/ 31 января 2009

Хорошо, одно из основных отличий между Delphi 2009 и более ранними версиями заключается в том, что тип строки по умолчанию - это строка в кодировке Юникод. Это означает, что если вы используете тот же компонент ActiveX, что и в предыдущих версиях, вы передаете строки Unicode в строки ASCII, и это, как правило, не очень хорошая идея.

Существует несколько вариантов решения этой проблемы:

  • Попытайтесь обновить компонент ActiveX, чтобы он поддерживал полные строки Юникода.
  • Используйте AnsiString, а не строку для связи с компонентом ActiveX. В этом случае вы все еще можете использовать старый интерфейс, но вы по-прежнему связаны с теми же ограничениями.
  • Используйте другой элемент управления, который создает PDF. Есть много чего найти, но будьте готовы изменить большую часть вашего программного обеспечения. (Некоторые элементы управления основаны на XML и используют кодировку.)
...