Aplanar FDF / XFDF formas a PDF en PHP con caracteres UTF-8
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.
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: あいう
</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 ??p>
ęóąśłżźćńĘÓĄŚŁŻŹĆŃ
óÓ
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>
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.