|
|
|
|
|
|
|
|
СТАТЬИ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Дмитрий Юнов Национальные гипертекстовые Bookmark'и для PDF, созданных из публикации FrameMaker и Frame+SGML.
Известные продукты FrameMaker и Frame+SGML. являются признанным мировым стандартом для подготовки бумажной технической документации и управления документами в течении последних 8-10 лет для платформ, использующих MacOS, Windows и UNIX. Особым удобством является встроенная мощная возможность легко получать PDF версию законченной публикации с гипертекстовыми ссылками, индексами и оглавлением, представленным как Bookmark в PDF. Единственная проблема состоит в том, что текст с языком, отличным от Western (English, German, French, ...), будет представлен некорректно. Выход состоит в собственной обработке полученного PS файла перед операцией превращения его в PDF с помощью Acrobat Distiller. Процедура предварительной обработки PS файла для исправления данного дефекта FrameMaker/Frame+SGML описана ниже для Windows и документов, использующих CP 1251 Cyrillic. Все принципы, изложенные здесь, полностью применимы для документов FrameMaker/Frame+SGML, использующих как другие кодовые страницы, так и иные операционные системы (MacOS, Solaris, AIX, HP-UX, Irix, Linux etc.) в своем окружении.
Пример навигационного окна Acrobat 5 и PDF документа с хорошо построенной системой Bookmark, созданной из FrameMaker публикации.
Создание Bookmark При печати из FrameMaker если вы указали в его основном диалоге Print флаг Generate Acrobat Data и настроили PDF Setup опции, находящиеся рядом с флажком, созданный вами PS файл будет содержать специальные PDFMark операторы для создания Acrobat Distiller'ом навигационных Bookmark.
Однако, в том случае, если ваша FrameMaker/Frame+SGML публикация создана на русском, украинском, белорусском, языках Балтии, современном греческом, языках Центральной и Восточной Европы или любом другом языке, отличном от поддерживаемых кодовой страницей 1252 Western, вы получите на экране в Acrobat набор немецкой, французской и португальской диакритики вместо своего национального текста. Дело в том, что FrameMaker/Frame+SGML не поддерживает Unicode enconding для языков документа, отличных от Western группы (и японского, китайского и корейского). Поэтому ваш национальный текст будущих Bookmarks будет представлен внутри PS документа в неправильной кодировке - так называемом build-in Acrobat encoding. Нам данный формат представления текста ничем не интересен - по той причине, что он игнорирует языки, с которыми мы работаем. Например, текст будущей PDF закладки абвгдеёжзий....эюя будет представлен внутри PS файла как: (\340\341\342\343\344\345\270\346\347\350\351 ... \374\306\330) Однако Acrobat 4 и 5 (PDF формат версий 1.3 и 1.4) поддерживают и Unicode encoding. Формат Unicode текстовой строки для корректной обработки PS файла Acrobat Distiller'ом очень прост и выглядит для примера выше так: <04300431043204330434043504510436043704380439...044D044E044F> Обратите внимание на круглые (Acrobat encoding) и угловые (Unicode encoding) скобки, в которые заключен текст. Таким образом, задача вполне тривиальна и состоит в том, чтобы найти внутри PS файла все PDFMark операторы для Bookmarks, выделить внутри них поля с текстовыми строками в build-in Acrobat encoding и заменить их на аналогичные по содержанию поля, использующие Unicode encoding. Для автоматизации задачи проще всего использовать Perl или любой скриптовый язык, который нравится пользователю. Внутри полученного PS файла эта разметка представлена в следующем виде: ###############################################
[ /Creator (FrameMaker 6.0) /CreationDate (D:20010823095456) /ModDate (D:20010823115211) /DOCINFO FmPD2 [/Dest/F/DEST FmPD2 [/Dest/G999212/Title(\340\341\342\343\ ... \374\306\330)/Count 1/OUT FmPD2 [/Dest/G999213/Title(\340\341\342\343\350\351 ... \374\306\330)/OUT FmPD2 [/Dest/G999493/Title(\340\341\342\343\350\351 ... \374\306\330)/OUT FmPD2 [/Dest/G999472/Title(ABCD efgh-123)/OUT FmPD2 [ /PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW FmPD2 [/Dest/L/DEST FmPD2 ; : N : N 463 148/G999197 FmPA 463 6518/G999194 FmPA ; %%EndDocument ###############################################
Оранжевым цветом выделены различные переменные, которые могут отличаться в вашем случае от данного примера. Красным цветом выделен искомые текстовые поля, содержимое которых копируется из вашей публикации при создании PS файла с включенной опцией Generate Acrobat Data. С ними-то мы и работаем. Далее, после обработки Acrobat Distiller'ом, текст из них попадает в Bookmarks и быть представлен в навигационном окне Acrobat'а. Внутри строки кириллического текста могут встречаются лишние пробелы, добавленные FrameMaker после некоторых символов. При нашей обработке их нужно удалять. Логично, что если есть латинский текст, он также должен быть представлен в Unicode. Таблица Latin Unicode представлена в конце статьи. Хотя вы и можете смешивать в тексте Bookmark символы из разных кодовых страниц и даже просто из Unicode (например, сделать его Armenian), как будет написано ниже, отображение в Acrobat все равно ограничено ОДНОЙ кодовой страницей. Таким образом, Bookmark в виде, например, шведско-русского (CP1252+CP1251) текста невозможен. Но два соседних Bookmarks могут иметь разные кодовые страницы. Длина поля Bookmark ограничена и равна 64 символа, если более — строка будет обрезана и автоматически добавится составной знак [...] в ее конец. Таблица соответствий представлена ниже.
Обозначения: LC — locked codes. Эти знакоместа запрещены во всех версиях FrameMaker/Frame+SGML по историческим причинам наследия старого кода программы. Вы не сможете ввести и использовать какие-либо символы, расположенные на этих местах. Для Windows это делает невозможным или очень проблематичным работу с чешским, польским, словацким, сербским и македонским языками. Существует специальный патч, разрешающий работу с этими символами для данных языков, который используется в этих странах. На MacOS и UNIX знакоместа locked codes другие, хотя их количество и внутренний Frame MIF encoding тот же. Bookmrk — Acrobat build-in encoding values 1251 Uni — Unicode values for CP1251 Cyrillic. Frame MIF encoding — Inner FrameMaker MIF encoding
ANSI | Char | Bookmrk | 1251 Uni | Frame MIF encoding | 128 | Ђ | 232 | 0402 | \xf5 | 129 | Ѓ | LC | 0403 | - | 130 | ‚ | 221 | 201A | \xe2 | 131 | ѓ | 206 | 0453 | \xc4 | 132 | „ | 214 | 201E | \xe3 | 133 | … | 203 | 2026 | \xc9 | 134 | † | 201 | 2020 | <Char Dagger> | 135 | ‡ | 202 | 2021 | <Char DoubleDagger> | 136 | € | 032 | 20AC | \xf6 | 137 | ‰ | 213 | 2030 | \xe4 | 138 | Љ | 263 | 0409 | \xb3 | 139 | ‹ | 210 | 2039 | \xdc | 140 | Њ | 226 | 040A | \xce | 141 | Ќ | 030 | 040C | \xf9 | 142 | Ћ | 033 | 040B | \xfa | 143 | Џ | LC | 040F | - | 144 | ђ | LC | 0452 | - | 145 | ‘ | 217 | 2018 | \xd4 | 146 | ’ | 220 | 2019 | \xd5 | 147 | “ | 215 | 201C | \xd2 | 148 | ” | 216 | 201D | \xd3 | 149 | • | 200 | 2022 | <Char Bullet> | 150 | – | 205 | 2013 | <Char EnDash> | 151 | — | 204 | 2014 | <Char EmDash> | 152 | n/a | 037 | - | \xf7 | 153 | ™ | 222 | 2122 | \xaa | 154 | љ | 360 | 0459 | \xf0 | 155 | › | 211 | 203A | \xdd | 156 | њ | 234 | 045A | \xcf | 157 | ќ | 034 LC | 045C | \xfd | 158 | ћ | 035 | 045B | \xfe | 159 | џ | 230 | 045F | \xd9 | 160 | (nbspace) | 021 | 00A0 | (no) | 161 | Ў | 241 | 040E | \xc1 | 162 | ў | 242 | 045E | <Char Cent> | 163 | Ј | 243 | 0408 | <Char Pound> | 164 | ¤ | 244 | 00A4 | \xdb | 165 | Ґ | 245 | 0490 | <Char Yen> | 166 | ¦ | 255 | 00A6 | \xad | 167 | § | 247 | 00A7 | \xa4 | 168 | Ё | 250 | 0401 | \xac | 169 | © | 251 | 00A9 | \xa9 | 170 | Є | 252 | 0404 | \xbb | 171 | « | 253 | 00AB | \xc7 | 172 | ¬ | 254 | 00AC | (no) | 173 | (shyph) | 004 | 00AD | \x7f | 174 | ® | 256 | 00AE | \xa8 | 175 | Ї | 257 | 0407 | \xf8 | 176 | ° | 036 | 00B0 | \xfb | 177 | ± | 261 | 00B1 | \xb1 | 178 | І | 267 | 0406 | \xb7 | 179 | і | 270 | 0456 | \xb8 | 180 | ґ | 264 | 0491 | \xab | 181 | µ | 265 | 00B5 | \xb5 | 182 | ¶ | 266 | 00B6 | (no) | 183 | · | 267 | 00B7 | \xe1 | 184 | ё | 270 | 0451 | \xfc | 185 | № | 266 | 2116 | \xb6 | 186 | є | 272 | 0454 | \xbc | 187 | » | 273 | 00BB | \xc8 | 188 | ј | 271 | 0458 | \xb9 | 189 | Ѕ | 272 | 0405 | \xba | 190 | ѕ | 275 | 0455 | \xbd | 191 | ї | 277 | 0457 | \xc0 | 192 | А | 300 | 0410 | \xcb | 193 | Б | 301 | 0411 | \xe7 | 194 | В | 302 | 0412 | \xe5 | 195 | Г | 303 | 0413 | \xcc | 196 | Д | 304 | 0414 | \x80 | 197 | Е | 305 | 0415 | \x81 | 198 | Ж | 306 | 0416 | \xae | 199 | З | 307 | 0417 | \x82 | 200 | И | 310 | 0418 | \xe9 | 201 | Й | 311 | 0419 | \x83 | 202 | К | 312 | 041A | \xe6 | 203 | Л | 313 | 041B | \xe8 | 204 | М | 314 | 041C | \xed | 205 | Н | 315 | 041D | \xea | 206 | О | 316 | 041E | \xeb | 207 | П | 317 | 041F | \xec | 208 | Р | 303 | 0420 | \xc3 | 209 | С | 321 | 0421 | \x84 | 210 | Т | 322 | 0422 | \xf1 | 211 | У | 323 | 0423 | \xee | 212 | Ф | 324 | 0424 | \xef | 213 | Х | 325 | 0425 | \xcd | 214 | Ц | 326 | 0426 | \x85 | 215 | Ч | 260 | 0427 | \xb0 | 216 | Ш | 330 | 0428 | \xaf | 217 | Щ | 331 | 0429 | \xf4 | 218 | Ъ | 332 | 042A | \xf2 | 219 | Ы | 333 | 042B | \xf3 | 220 | Ь | 334 | 042C | \x86 | 221 | Э | 305 | 042D | \xc5 | 222 | Ю | 327 | 042E | \xd7 | 223 | Я | 337 | 042F | \xa7 | 225 | а | 340 | 0430 | \x87 | 226 | б | 341 | 0431 | \x89 | 227 | в | 342 | 0432 | \x8b | 228 | г | 343 | 0433 | \x8a | 229 | д | 344 | 0434 | \x8c | 184 | е | 345 | 0435 | \xfc | 230 | ё | 270 | 0436 | \xbe | 231 | ж | 346 | 0437 | \x8d | 232 | з | 347 | 0438 | \x8f | 233 | и | 350 | 0439 | \x8e | 234 | й | 351 | 043A | \x90 | 235 | к | 352 | 043B | \x91 | 236 | л | 353 | 043C | \x93 | 237 | м | 354 | 043D | \x92 | 238 | н | 355 | 043E | \x94 | 239 | о | 356 | 043F | \x95 | 240 | п | 357 | 0440 | \xb2 | 241 | р | 262 | 0441 | \x96 | 242 | с | 361 | 0442 | \x97 | 243 | т | 362 | 0443 | \x98 | 244 | у | 363 | 0444 | \x99 | 245 | ф | 364 | 0445 | \x9b | 246 | х | 365 | 0446 | \x9a | 247 | ч | 366 | 0447 | \xd6 | 248 | ш | 367 | 0448 | \xbf | 249 | щ | 370 | 0449 | \x9d | 250 | ъ | 371 | 044A | \x9c | 251 | ы | 372 | 044B | \x9e | 252 | ь | 373 | 044C | \x9f | 253 | э | 374 | 044D | \xc6 | 254 | ю | 306 | 044E | \xca | 255 | я | 330 | 044F | \xd8 |
Partial © 1996, 1998, 2001 - Dmitry Yunov, <yudmi@star.spb.ru>
(space) | 0020 | @ | 0040 | ` | 0060 | ! | 0021 | A | 0041 | a | 0061 | " | 0022 | B | 0042 | b | 0062 | # | 0023 | C | 0043 | c | 0063 | $ | 0024 | D | 0044 | d | 0064 | % | 0025 | E | 0045 | e | 0065 | & | 0026 | F | 0046 | f | 0066 | ' | 0027 | G | 0047 | g | 0067 | ( | 0028 | H | 0048 | h | 0068 | ) | 0029 | I | 0049 | i | 0069 | * | 002A | J | 004A | j | 006A | + | 002B | K | 004B | k | 006B | , | 002C | L | 004C | l | 006C | - | 002D | M | 004D | m | 006D | . | 002E | N | 004E | n | 006E | / | 002F | O | 004F | o | 006F | 0 | 0030 | P | 0050 | p | 0070 | 1 | 0031 | Q | 0051 | q | 0071 | 2 | 0032 | R | 0052 | r | 0072 | 3 | 0033 | S | 0053 | s | 0073 | 4 | 0034 | T | 0054 | t | 0074 | 5 | 0035 | U | 0055 | u | 0075 | 6 | 0036 | V | 0056 | v | 0076 | 7 | 0037 | W | 0057 | w | 0077 | 8 | 0038 | X | 0058 | x | 0078 | 9 | 0039 | Y | 0059 | y | 0079 | : | 003A | Z | 005A | z | 007A | ; | 003B | [ | 005B | { | 007B | < | 003C | \ | 005C | | | 007C | = | 003D | ] | 005D | } | 007D | > | 003E | ^ | 005E | ~ | 007E | ? | 003F | _ | 005F | (del) | 007F | Ограничения. 1. В случае с Bookmarks отображение на экране все равно ограничено основными языковыми скриптами (кодовыми страницами) Windows/Macintosh (см. рис.). Поэтому получение Bookmark на языке, не имеющем кодовой страницы, невозможно, по той причине, что выбор шрифта, которым отображается любой текст Bookmark Acrobat, не настраивается. К таким печальным случаям относятся многочисленные FrameMaker документы, использующие непризнанные MS, IBM и Apple, но широко распространенные локальные и корпоративные кодовые страницы — Armenian, Georgian, Asian Cyrillic PT, Azerbaijan Latin (1992,1999), Uzbek Latin (1998), Tatar Latin (2000), Turkmen Latin (1996), Polytonal Greek PT, Old Slavonic PT, Old Church PT и любые собственные encoding'и пользователя.
2. Как можно заметить из таблицы, три пары символов имеют ОДНО И ТОЖЕ Acrobat build-in encoding значение. Перекрылись русское/белорусское ё и украинское/белорусское і, знак параграфа ¶ и знак номера №, украинское є и македонская Ѕ. Из них наибольшая проблема очевидно, с белорусскими публикациями из-за активного использования в языке как ё так и і.
179 | і | 270 | 0456 | 184 | ё | 270 | 0451 | 182 | ¶ | 266 | 00B6 | 185 | № | 266 | 2116 | 186 | є | 272 | 0454 | 189 | Ѕ | 272 | 0405 | Уверен, что написание скрипта или утилиты благодарный читатель возьмет на себя. :-) Удачи. (с) 08.2001 — Dmitry Yunov <yudmi@star.spb.ru>
Дата размещения: 2001-08-28 17:18:45
|
|
|
|
|
|
|
|