Ответ 1
К сожалению, кодировка символов UTF-8 не работает ни с десятичными, ни с шестнадцатеричными ссылками не-ASCII-символов в исходном файле .xfdf. PDFTK v. 1.44.
Мой сценарий:
Теперь мне нужно, чтобы эти файлы были объединены и сплющены. pdftk легко выполняет задание в php:
exec("pdftk template.pdf fill_form fieldData.xfdf output flatFile.pdf flatten");
К сожалению, это не работает с полной поддержкой utf-8. Например: кириллические и греческие буквы получают скремблирование. Я использовал Arial для этого, с набором символов в Юникоде.
EDIT 1: Поскольку этот вопрос не был решен более чем 9 месяцев, я решил начать за это щедрость. Если есть варианты спонсирования функции или исправления в pdftk, я был бы рад пожертвовать.
EDIT 2: я больше не работаю над этим проектом, поэтому я не могу проверить новые ответы. Если у кого-то есть аналогичная проблема, я рад, если они могут ответить в мою пользу.
К сожалению, кодировка символов UTF-8 не работает ни с десятичными, ни с шестнадцатеричными ссылками не-ASCII-символов в исходном файле .xfdf. PDFTK v. 1.44.
Я нашел с помощью шаблона 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 );
Вы можете попробовать пробную версию 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: あいう
</value>
</field>
</fields> ...
Я просмотрел pdftk-1.44-dist/java/com/lowagie/text/pdf/XfdfReader.java. Кажется, он ничего особенного не использует для ввода.
Возможно, pdftk будет делать то, что вы хотите, когда вы кодируете странные символы в качестве символьных ссылок на входе xFDF.
Используя pdftk 1.44 на машине Win7, я сталкиваюсь с теми же проблемами с xfdf файлами, тогда как fdf работает нормально. Я сделал xfdf файл без каких-либо специальных символов (только ANSI), но pdftk снова разбился. Я отправил письмо разработчику. К сожалению, пока нет ответа.
Я сделал некоторый прогресс в этом. Начиная с кода 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;
}
Что такое версия 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Ä—ÅıņŻŹăÅ
Вы можете ввести символы utf-8, указав код юникода в восьмеричном формате с помощью\ddd
Чтобы решить эту проблему, я написал PdfFormFillerUTF-8: http://sourceforge.net/projects/pdfformfiller2/
Есть замена для инструмента 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.
pdftk поддерживает кодирование в UTF-16BE. Это не так сложно конвертировать из UTF-8 в UTF-16BE.
Смотрите: Странные символы при заполнении PDF с помощью PDFTk