Подтвердить что ты не робот

Сформировать формы FDF/XFDF в PDF в PHP с помощью символов utf-8

Мой сценарий:

  • Шаблон PDF с формами: template.pdf
  • Файл XFDF, содержащий данные, которые необходимо заполнить: fieldData.xfdf

Теперь мне нужно, чтобы эти файлы были объединены и сплющены. pdftk легко выполняет задание в php:

exec("pdftk template.pdf fill_form fieldData.xfdf output flatFile.pdf flatten");

К сожалению, это не работает с полной поддержкой utf-8. Например: кириллические и греческие буквы получают скремблирование. Я использовал Arial для этого, с набором символов в Юникоде.

  • Как я могу выполнить выравнивание файлов в Юникоде?
  • Есть ли другой инструмент pdf, который предлагает поддержку unicode?
  • Есть ли у pdftk переключатель unicode, который мне не хватает?

EDIT 1: Поскольку этот вопрос не был решен более чем 9 месяцев, я решил начать за это щедрость. Если есть варианты спонсирования функции или исправления в pdftk, я был бы рад пожертвовать.

EDIT 2: я больше не работаю над этим проектом, поэтому я не могу проверить новые ответы. Если у кого-то есть аналогичная проблема, я рад, если они могут ответить в мою пользу.

4b9b3361

Ответ 1

К сожалению, кодировка символов UTF-8 не работает ни с десятичными, ни с шестнадцатеричными ссылками не-ASCII-символов в исходном файле .xfdf. PDFTK v. 1.44.

Ответ 2

Я нашел с помощью шаблона Jon, но с помощью DomDocument числовая кодировка была обработана для меня и хорошо работала. Мое небольшое изменение ниже:

$xml = new DOMDocument( '1.0', 'UTF-8' );

$rootNode = $xml->createElement( 'xfdf' );
$rootNode->setAttribute( 'xmlns', 'http://ns.adobe.com/xfdf/' );
$rootNode->setAttribute( 'xml:space', 'preserve' );
$xml->appendChild( $rootNode );

$fieldsNode = $xml->createElement( 'fields' );
$rootNode->appendChild( $fieldsNode );

foreach ( $fields as $field => $value )
{
    $fieldNode = $xml->createElement( 'field' );
    $fieldNode->setAttribute( 'name', $field );
    $fieldsNode->appendChild( $fieldNode );

    $valueNode = $xml->createElement( 'value' );
    $valueNode->appendChild( $xml->createTextNode( $value ) );
    $fieldNode->appendChild( $valueNode );
}

$xml->save( $file );

Ответ 3

Вы можете попробовать пробную версию http://www.adobe.com/products/livecycle/designer/ и посмотреть, какие файлы PDF она генерирует.

Другое коммерческое программное обеспечение, которое вы можете попробовать, это http://www.appligent.com/fdfmerge. См. Стр. 16 в http://146.145.110.1/docs/userguide/FDFMergeUserGuide.pdf для того, как он обрабатывает xFDF с помощью UTF-8.

Я также посмотрел спецификацию FDF http://partners.adobe.com/public/developer/en/xml/xfdf_2.0.pdf На стр. 12 указано:

Although XFDF is encoded in UTF-8, double byte characters are encoded as character references when 
exported from Acrobat. 
For example, the Japanese double byte characters ,  , and  are exported to XFDF using 
three character references. Here is an example of double byte characters in a form field: 
  ...
<fields>  
  <field name="Text1"> 
     <value>Here are 3 UTF-8 double byte  
        characters: &#x3042;&#x3044;&#x3046;
</value>  
  </field>  
</fields> ... 

Я просмотрел pdftk-1.44-dist/java/com/lowagie/text/pdf/XfdfReader.java. Кажется, он ничего особенного не использует для ввода.

Возможно, pdftk будет делать то, что вы хотите, когда вы кодируете странные символы в качестве символьных ссылок на входе xFDF.

Ответ 4

Используя pdftk 1.44 на машине Win7, я сталкиваюсь с теми же проблемами с xfdf файлами, тогда как fdf работает нормально. Я сделал xfdf файл без каких-либо специальных символов (только ANSI), но pdftk снова разбился. Я отправил письмо разработчику. К сожалению, пока нет ответа.

Ответ 5

Я сделал некоторый прогресс в этом. Начиная с кода http://koivi.com/fill-pdf-form-fields/, я модифицировал кодировку значений для вывода числовых кодов для любых символов вне диапазона ascii.

Теперь с питульскими специальными строками:

Poznań Śródmieście Ćwiartka Ósma выводит Pozna ródmiecie wiartka Ósma с наложенными формами ящиков

ęóąśłżźćńĘÓĄŚŁŻŹĆŃ выводит óÓ с более короткими формами. Я думаю, может быть, что формы ящиков являются символами, которые мой сервер не распознает.

Я попробовал это с некоторыми французскими символами: ùûüÿ€’""«»àâæçéèêëïôœÙÛÜŸÀÂÆÇÉÈÊËÏÎÔ, и все они вышли ОК, но некоторые из них были перекрывающимися.

- edit-- Я просто попытался ввести их вручную в форму и получил тот же результат за вычетом форм окна (используя Evince). Затем я попробовал другую форму (создан кем-то другим) - после ввода ęóąśłżźćńĘÓĄŚŁŻŹĆŃ отобразился ółÓŁ. Похоже, что это зависит от того, какие символы включены в встроенные шрифты.

/*
KOIVI HTML Form to FDF Parser for PHP (C) 2004 Justin Koivisto
Version 1.2.?
Last Modified: 2013/01/17 - Jon Hulka(jon dot hulka at gmail dot com)
  - changed character encoding, all non-ascii characters get encoded as numeric character references

    This library is free software; you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 2.1 of the License, or (at
    your option) any later version.

    This library is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
    License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this library; if not, write to the Free Software Foundation,
    Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 

    Full license agreement notice can be found in the LICENSE file contained
    within this distribution package.

    Justin Koivisto
    justin dot koivisto at gmail dot com
    http://koivi.com
*/

/**
 * createXFDF
 * 
 * Tales values passed via associative array and generates XFDF file format
 * with that data for the pdf address sullpiled.
 * 
 * @param string $file The pdf file - url or file path accepted
 * @param array $info data to use in key/value pairs no more than 2 dimensions
 * @param string $enc default UTF-8, match server output: default_charset in php.ini
 * @return string The XFDF data for acrobat reader to use in the pdf form file
 */
function createXFDF($file,$info,$enc='UTF-8'){
    $data=
'<?xml version="1.0" encoding="'.$enc.'"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
    <fields>';
    foreach($info as $field => $val){
        $data.='
        <field name="'.$field.'">';
        if(is_array($val)){
            foreach($val as $opt)
//2013.01.17 - Jon Hulka - all non-ascii characters get character references
            $data.='
            <value>'.mb_encode_numericentity(htmlspecialchars($opt),array(0x0080, 0xffff, 0, 0xffff), 'UTF-8').'</value>';
//                $data.='<value>'.htmlentities($opt,ENT_COMPAT,$enc).'</value>'."\n";
        }else{
            $data.='
            <value>'.mb_encode_numericentity(htmlspecialchars($val),array(0x0080, 0xffff, 0, 0xffff), 'UTF-8').'</value>';
//            $data.='<value>'.htmlentities($val,ENT_COMPAT,$enc).'</value>'."\n";
        }
        $data.='
        </field>';
    }
    $data.='
    </fields>
    <ids original="'.md5($file).'" modified="'.time().'" />
    <f href="'.$file.'" />
</xfdf>';
    return $data;
}

Ответ 6

Что такое версия PDFTK? Я пробовал то же самое с польскими символами (utf-8).

Не работает для меня.

pdftk.exe, libiconv2.dll from: http://www.pdflabs.com/docs/install-pdftk/

Windows 7, cmd, file.pdf + file.fdf → new.pdf

pdftk file.pdf fill_form file.xfdf output new.pdf flatten

Unhandled Java Exception:
java.lang.NoClassDefFoundError: gnu.gcj.convert.Input_UTF8 not found in [file:.\, core:/]
   at 0x005a3abe (Unknown Source)
   at 0x005a3fb2 (Unknown Source)
   at 0x006119f4 (Unknown Source)
   at 0x00649ee4 (Unknown Source)
   at 0x005b4c44 (Unknown Source)
   at 0x005470a9 (Unknown Source)
   at 0x00549c52 (Unknown Source)
   at 0x0059d348 (Unknown Source)
   at 0x007323c9 (Unknown Source)
   at 0x0054715a (Unknown Source)
   at 0x00562349 (Unknown Source)

Но, с файлом FDF, с тем же контентом, он работал правильно. Но символы в new.PDF плохие.

pdftk file.pdf fill_form file.fdf output new.pdf flatten

--- FDF ---

%FDF-1.2
%âãÏÓ
1 0 obj<</FDF<</F(file.pdf)
/Fields[
<</T(Miejsce)/V(666 Poznań Śródmieście Ćwiartka Ósma)>>
<</T(Nr)/V(ęóąśłżźćńĘÓĄŚŁŻŹĆŃ)>>
]>>>>
endobj
trailer
<</Root 1 0 R>>
%%EOF

--- XFDF ---

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<f href="file.pdf"/>
<fields>
<field name="Miejsce">
<value>666 Poznań Śródmieście Ćwiartka Ósma</value>
</field>
<field name="Nr">
<value>ęóąśłżźćńĘÓĄŚŁŻŹĆŃ</value>
</field>
</fields>
</xfdf>

--- PDF ---

Miejsce: 666 PoznaÅ— ÅıródmieÅłcie ăwiartka Ãfisma
Nr: ÄŽÃ³Ä–ÅłÅ‡Å¼ÅºÄ⁄Å—ÄŸÃfiÄ—ÅıņŻŹăÅ

Ответ 7

Вы можете ввести символы utf-8, указав код юникода в восьмеричном формате с помощью\ddd

Ответ 9

Есть замена для инструмента pdftk

Mcpdf: https://github.com/m-click/mcpdf

который решает проблемы unicode при заполнении форм. Работает для меня с персонажами CP1250 (Центральная Европа).

На странице проекта:

следующая команда заполняет данные формы из DATA.xfdf в формат FORM.pdf и записывает результат в RESULT.pdf. Он также сглаживает документ до предотвратить дальнейшее редактирование:

java -jar mcpdf.jar FORM.pdf fill_form - output - flatten < DATA.xfdf > RESULT.pdf

Это точно соответствует обычной команде PDFtk:

pdftk FORM.pdf fill_form - output - flatten < DATA.xfdf > RESULT.pdf

Обратите внимание, что вам нужно установить JRE.