Свести FDF / XFDF формы в PDF в PHP с UTF-8 символов - PullRequest
12 голосов
/ 20 октября 2010

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

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

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

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

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

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

РЕДАКТИРОВАТЬ 1: Поскольку этот вопрос не решался в течение более 9 месяцев, я решил назначить награду за него,В случае, если есть варианты спонсирования функции или исправления в pdftk, я был бы рад пожертвовать.

РЕДАКТИРОВАТЬ 2: Я больше не работаю над этим проектом, поэтому я не могу проверить новые ответы.Если у кого-то есть подобные проблемы, я рад, что они могут ответить в мою пользу.

Ответы [ 11 ]

2 голосов
/ 23 января 2013

Я нашел с помощью шаблона Джона, но с помощью 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 );
2 голосов
/ 17 февраля 2012

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

1 голос
/ 17 января 2013

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

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

Poznań Śródmieście Ćwiartka Ósma output 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;
}
1 голос
/ 12 августа 2011

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

1 голос
/ 03 августа 2011

Вы можете попробовать пробную версию 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.

0 голосов
/ 26 августа 2018

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

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

вот пример:

pdftk source.pdf fill_form data.xfdf output output.pdf need_appearances
0 голосов
/ 15 апреля 2015

Существует встроенная замена для инструмента pdftk

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

, которая решает проблемы с юникодом при заполнении форм.У меня работает с символами 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.

0 голосов
/ 23 января 2014

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

0 голосов
/ 27 ноября 2013

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

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

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

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

...