Pregunta

Mi escenario:

  • Una plantilla PDF con FormFields: template.pdf
  • Un archivo XFDF que contiene los datos que se completa: fieldData.xfdf

Ahora tengo que tener estos para archivos combinados y aplanados. pdftk hace el trabajo fácilmente dentro de php:

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

Por desgracia esto no funciona con soporte completo de UTF-8. Por ejemplo: cirílico y letras griegas consiguen revueltos. Solía ??Arial para esto, con un conjunto de caracteres Unicode.

  • ¿Cómo puedo lograr para aplanar mis archivos Unicode?
  • ¿Hay alguna otra herramienta de PDF que ofrece soporte Unicode?
  • pdftk
  • sí tiene un interruptor de Unicode que me falta?

EDIT 1: Como esta cuestión no ha sido resuelto por más de 9 meses, decidí comenzar una recompensa por ello. En caso de que haya opciones para patrocinar una característica o una corrección de errores en pdftk, estaría contento de donar.

EDIT 2: No estoy trabajando en este proyecto más, así que no puedo verificar nuevas respuestas. Si alguien tiene un problema similar, me alegro si pueden responder a mi favor.

¿Fue útil?

Solución

Lamentablemente, UTF-8 codificación de caracteres no funciona ni con decimales ni hexadecimales referencias de caracteres no ASCII en .xfdf fuente de archivo. . PDFTK v 1.44.

Otros consejos

He encontrado mediante el uso de la plantilla de Jon, pero utilizando el DomDocument la codificación numérica fue manejado por mí y funcionó bien. Mi pequeña variación es a continuación:

$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 );

Se puede probar la versión de prueba de http://www.adobe.com/products/ LiveCycle / diseñador / y ver lo que los archivos PDF que genera.

Otro software comercial que podría intentar es http://www.appligent.com/fdfmerge . Consulte la página 16 en http://146.145.110.1/docs/userguide/FDFMergeUserGuide.pdf de cómo se maneja XFDF con UTF-8.

También tenía un vistazo a la especificación FDF http: / /partners.adobe.com/public/developer/en/xml/xfdf_2.0.pdf En la página 12 se afirma:

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> ... 

Me miró a través de pdftk-1,44-dist / java / com / Lowagie / texto / pdf / XfdfReader.java. No parece que hacer nada especial con la entrada.

Tal vez pdftk va a hacer lo que quiere, al codificar los caracteres extraños como las referencias de caracteres en su entrada XFDF.

Uso de la pdftk 1.44 en una máquina Win7 me encuentro con los mismos problemas con XFDF-archivos FDF mientras que trabaja muy bien. Hice un xfdf-archivo sin ningún carácter especial (sólo ANSI), pero pdftk caído de nuevo. Envié el revelador. Desafortunadamente no hay respuesta hasta ahora.

he hecho algunos progresos en este sentido. A partir de código de http://koivi.com/fill-pdf-form-fields/, he modificado el valor de codificación a los códigos numéricos de salida para todos los caracteres fuera del rango ASCII.

Ahora, con cadenas especiales de pitulski:

Poznań Śródmieście Ćwiartka Ósma salidas Pozna ródmiecie wiartka Ósma con alguna caja formas superpuesta

ęóąśłżźćńĘÓĄŚŁŻŹĆŃ óÓ salidas con más formas de caja. Creo que puede ser que las formas de caja son personajes de mi servidor no reconoce.

Lo he probado con algunos personajes franceses: ùûüÿ€’“”«»àâæçéèêëïôœÙÛÜŸÀÂÆÇÉÈÊËÏÎÔ y todos ellos salió bien, pero algunas de ellas se superponían

.

- edit-- que acaba de intentar entrar de forma manual en la forma y consiguió el mismo resultado menos las formas box (utilizando Evince). Luego trató con una forma diferente (creado por otra persona) - después de entrar en ęóąśłżźćńĘÓĄŚŁŻŹĆŃ, se visualiza ółÓŁ. Parece que depende que los personajes están incluidos en las fuentes incrustadas del documento.

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

¿Qué versión de PDFTK? He intentado lo mismo con caracteres polacos (UTF-8).

no funciona para mí.

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

Windows 7, cmd + file.pdf file.fdf -> NUEVO.pdf

pdftk file.pdf fill_form file.xfdf NUEVO.pdf salida Aplanar

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)

Sin embargo, con el archivo FDF, con el mismo contenido, funcionó correctamente. Pero los personajes de NUEVO.pdf son malos.

pdftk file.pdf fill_form file.fdf NUEVO.pdf salida Aplanar

--- --- 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Ä—ÅıņŻŹăÅ

Puede introducir caracteres UTF-8 dando su código Unicode en octal con \ ddd

Para resolver esto, escribí PdfFormFillerUTF-8: http://sourceforge.net/projects/pdfformfiller2/

Hay una gota en el reemplazo para la herramienta de pdftk

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

que resuelve los problemas Unicode al rellenar formularios. Obras para mí con CP1250 caracteres (Europa central).

A partir de la página del proyecto:

los siguientes rellenos de comando en los datos del formulario de DATA.xfdf en Form.pdf y escribe el resultado a RESULT.pdf. También se aplana el documento de Prevenir la posterior edición:

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

Esto corresponde exactamente a la orden habitual PDFtk:

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

Tenga en cuenta que es necesario tener instalado JRE.

he logrado hacer que funcione con pdftk mediante la creación de un archivo xfdf con codificación UTF-8.

Se necesitaron varios intentado, pero lo que hacer que funcione como exepcted fue añadir 'need_appearances'

A continuación se muestra un ejemplo:

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

PDFTK admite la codificación en UTF-16BE. No es tan difícil convertir de UTF-8 a UTF-16BE.

Ver: caracteres extraños al llenar PDF con PDFTK

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top