Странные символы при заполнении PDF PDFTk - PullRequest
3 голосов
/ 18 мая 2011

Я использую php с PDFTK в Ubuntu. При заполнении PDF данными я получаю странные символы для этих букв с акцентами: á í í . Я использую кодировку UTF-8 : я проверил с помощью echo mb_check_encoding ($ var, 'UTF-8'), который выдает 1 - TRUE. Есть идеи, что я могу сделать?

Я также пытался конвертировать в ISO с utf8_decode, но все же, не повезло.

Спасибо

Ответы [ 2 ]

9 голосов
/ 04 октября 2013

Вы правы, utf8_decode () будет работать для символов, которые могут быть закодированы как Windows-1252 (т.е. U + 0000 – U + 00FF).

Однако это не будет работать для символов, которые могутне может быть закодирован в Windows-1252.

Однако вы всегда можете кодировать символы, используя UTF-16BE.Вы можете сделать это только для одного поля, например, для кодирования слова «özil»:

<<
/V (þÿ^@ö^@z^@i^@l)
/T (name)
>>

(здесь «^ @» обозначает символ NUL (U + 0000). Вот как это выглядитв моем редакторе (vim), если файл закодирован в Windows-1252 (latin1).)

Обратите внимание, что вам нужно использовать знак порядка байтов (который будет отображаться как "þÿ", если ваш файл закодированв Windows-1252), и вам нужно закодировать всю строку (между двумя скобками) в UTF-16.

Если вы генерируете FDF в сценарии PHP, вы можете сделать что-то вроде этого:

<<
/V (<?php echo chr(0xfe) . chr(0xff) . str_replace(array('\\', '(', ')'), array('\\\\', '\(', '\)'), mb_convert_encoding("özil", 'UTF-16BE')); ?>)
/T (name)
>>

Вы также можете записать шестнадцатеричные коды, например, такие (заключенные в угловые скобки, а не в скобки):

<<
/V <FEFF00F6007A0069006C>
/T (name)
>>

Это дает точно такой же результат (строка "özil«).Это менее эффективно с точки зрения символов, но на самом деле кажется более надежным в pdftk, в котором есть некоторые ошибки, которые я обнаружил (в версии 2.02).

Наконец, вы также можете записать кодовую точку Unicodeдля любого символа в восьмеричной записи (\ ddd).Например, у ö есть кодовая точка U + 00F6, которая в восьмеричном является 366, поэтому вы можете написать:

<<
/V (\366zil)
/T (name)
>>

Однако это работает только до U + 00FF (восьмеричное 377).Кроме того, вам придется использовать UTF-16.

Стандарт PDF позволяет вам установить кодировку UTF-8 для всего документа FDF.Я попробовал это, и он не работал с pdftk, однако теоретически это было бы сделано так:

%FDF-1.2
1 0 obj
<<
/Version /1.3
/Encoding /utf_8
/FDF

(Возможно, вам придется установить версию FDF на 1.3 (или более) в заголовкетоже, в соответствии со стандартом.)

Вы также можете сделать это на уровне поля:

<<
/V (özil)
/T (name)
/Encoding /utf_8
>>

Но, как я уже сказал, мне не удалось заставить все это работать,Кажется, pdftk просто игнорирует это.

2 голосов
/ 27 мая 2011

Решено с помощью utf8_decode. Я предполагаю, что были некоторые проблемы с кэшированием, и персонажи все еще показывали

...