Сгладить формы FDF / XFDF в PDF на PHP с символами utf-8

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

  • шаблон PDF с полями формы: шаблон.формат PDF
  • файл XFDF, содержащий данные для заполнения: fieldData.xfdf

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

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

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

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

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

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

11 ответов


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


Я нашел, используя шаблон Джона, но с помощью 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 );

вы можете попробовать пробную версию 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.Ява. Кажется, он не делает ничего особенного с вводом.

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


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


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

теперь с специальные строки pitulski это:

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;
}

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

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

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

ОС Windows 7, cmd-файл,.файл PDF.ФДФ -> новый.формат PDF

файл pdftk.файл pdf fill_form.xfdf выхода новых.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, с тем же содержимым, он работал правильно. Но персонажи в новой.PDF-это плохо.

файл pdftk.файл pdf fill_form.выход fdf новый.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Ä—ÅıņŻŹăÅ

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


чтобы решить эту проблему, я написал PdfFormFillerUTF-8:http://sourceforge.net/projects/pdfformfiller2/


есть выпадающая замена для pdftk tool

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

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

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

следующая команда заполняет данные формы из данных.xfdf в форму.документ pdf и записывает результат в результат.документ 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.


мне удалось заставить его работать с pdftk, создав файл xfdf с кодировкой utf-8.

потребовалось несколько попыток, но что заставило его работать как exepcted, так это добавить "need_appearances"

вот пример:

pdftk source.pdf fill_form data.xfdf output output.pdf need_appearances

pdftk поддерживает кодировку в UTF-16BE. Это не так сложно преобразовать из UTF-8 в UTF-16BE.

посмотреть: странные символы при заполнении PDF с PDFTk