Appiattire DFF / XFDF forme in PDF in PHP con caratteri UTF-8
Domanda
Il mio scenario:
- Un modello di PDF con formfields: TEMPLATE.PDF
- Un file XFDF che contiene i dati da compilare: fieldData.xfdf
Ora ho bisogno di avere questi per file combinati e appiattite. pdftk fa il lavoro facilmente all'interno di php:
exec("pdftk template.pdf fill_form fieldData.xfdf output flatFile.pdf flatten");
Purtroppo questo non funziona con il pieno supporto UTF-8. Per esempio: cirillico e lettere greche vengono strapazzate. Ho usato Arial per questo, con un set di caratteri Unicode.
- Come posso compiere per appiattire i miei file Unicode?
- C'è qualche altro strumento PDF che offre supporto Unicode? pdftk
- ha un interruttore unicode che mi manca?
EDIT 1: Poiché a questa domanda non è stato risolto per più di 9 mesi, ho deciso di iniziare una taglia per questo. Nel caso in cui ci sono opzioni per sponsorizzare una caratteristica o un bugfix in pdftk, sarei felice di donare.
EDIT 2: non sto lavorando su questo progetto più, quindi non posso verificare nuove risposte. Se qualcuno ha un problema simile, io sono contento se si può rispondere a mio favore.
Soluzione
Purtroppo, UTF-8 codifica dei caratteri non funziona né con decimali, né esadecimali riferimenti di caratteri non-ASCII nei fonte .xfdf file. . PDFTK v 1,44.
Altri suggerimenti
Ho trovato usando modello di Jon ma usando il DomDocument la codifica numerica è stata gestita per me e ha funzionato bene. La mia piccola variazione è inferiore a:
$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 );
Si potrebbe provare la versione di prova di http://www.adobe.com/products/ LiveCycle / designer / e vedere che cosa i file PDF che genera.
Un altro software commerciale che si può provare è http://www.appligent.com/fdfmerge . Vedere a pagina 16 in http://146.145.110.1/docs/userguide/FDFMergeUserGuide.pdf per come gestisce XFDF con UTF-8.
Ho anche avuto uno sguardo al DFF specifica http: / /partners.adobe.com/public/developer/en/xml/xfdf_2.0.pdf A pagina 12 si legge:
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> ...
Ho guardato attraverso pdftk-1.44-dist / java / com / Lowagie / testo / pdf / XfdfReader.java. Non sembra di fare nulla di speciale con l'ingresso.
Forse pdftk farà ciò che si vuole, quando si codifica dei caratteri strani come riferimenti di carattere nel vostro ingresso XFDF.
Uso della pdftk 1.44 su una macchina Win7 che incontro gli stessi problemi con XFDF-files mentre DFF funziona bene. Ho fatto un XFDF-file senza caratteri speciali (solo ANSI), ma pdftk caduto di nuovo. Ho inviato il developper. Purtroppo nessuna risposta fino ad ora.
ho fatto qualche progresso su questo. A partire con il codice da http://koivi.com/fill-pdf-form-fields/, ho modificato il valore di uscita codificante codici numerici per qualsiasi carattere non aSCII.
Ora con stringhe speciali di pitulski:
Poznań Śródmieście Ćwiartka Ósma
uscite Pozna ródmiecie wiartka Ósma
con qualche scatola forme sovrapposto
ęóąśłżźćńĘÓĄŚŁŻŹĆŃ
uscite óÓ
con più forme scatola. Penso che potrebbe essere che le forme di scatola sono personaggi il mio server non riconosce.
ho provato con alcuni personaggi francesi: ùûüÿ€’“”«»àâæçéèêëïôœÙÛÜŸÀÂÆÇÉÈÊËÏÎÔ
e tutti uscito OK, ma alcuni di loro sono stati sovrapposizione
- edit-- ho solo cercato di entrare questi manualmente nella forma ed ha ottenuto lo stesso risultato meno le forme di dialogo (utilizzando Evince). Allora ho provato con una forma diversa (creato da qualcun altro) - dopo aver inserito ęóąśłżźćńĘÓĄŚŁŻŹĆŃ
, è stato visualizzato ółÓŁ
. Sembra che dipende quali caratteri sono incluse nel font incorporati 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;
}
La versione di Cosa PDFTK? Ho provato la stessa cosa con i caratteri polacchi (UTF-8).
non funziona per me.
pdftk.exe, libiconv2.dll da: http://www.pdflabs.com/ docs / install-pdftk /
Windows 7, cmd, file.pdf + file.fdf -> new.pdf
pdftk file.pdf fill_form file.xfdf uscita new.pdf appiattire
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)
Ma, con file FDF, con lo stesso contenuto, ha funzionato correttamente. Ma i personaggi di new.PDF sono cattivi.
pdftk file.pdf fill_form file.fdf uscita new.pdf appiattire
--- --- DFF
%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Ä—ÅıņŻŹăÅ
Si può introdurre caratteri UTF-8, dando loro codice unicode in ottale con \ ddd
Per risolvere questo problema, ho scritto PdfFormFillerUTF-8: http://sourceforge.net/projects/pdfformfiller2/
C'è un rimpiazzo per lo strumento pdftk
Mcpdf : https://github.com/m-click/mcpdf
che risolve Unicode problemi quando compilare i moduli. Opere per me con CP1250 caratteri (Europa centrale).
Dalla pagina del progetto:
i seguenti riempimenti comando in dati di modulo da DATA.xfdf in form.pdf e scrive il risultato di RESULT.pdf. Si appiattisce anche il documento di Impedire ulteriori modifiche:
java -jar mcpdf.jar FORM.pdf fill_form - output - flatten < DATA.xfdf > RESULT.pdf
consegnare esattamente il solito comando pdftk:
pdftk FORM.pdf fill_form - output - flatten < DATA.xfdf > RESULT.pdf
Si noti che è necessario avere installato JRE.
Sono riuscito a farlo funzionare con pdftk creando un file XFDF con codifica UTF-8.
Ci sono voluti diversi provato ma che farlo funzionare come exepcted era di aggiungere 'need_appearances'
Ecco un esempio:
pdftk source.pdf fill_form data.xfdf output output.pdf need_appearances
??PDFTK codificano in UTF-16 BE. Non è poi così difficile convertire da UTF-8 a UTF-16BE.