2010-10-19 86 views
11

我的情景:拼合FDF/XFDF形式PDF在PHP中使用UTF-8字符

  • PDF模板与formfields:template.pdf
  • 包含数据
  • 的XFDF文件中填写: fieldData.xfdf

现在我需要将这些文件合并到&展平。 PDFTK容易做这项工作PHP中:

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

不幸的是,这并不具有完全的UTF-8支持工作。例如:西里尔字母和希腊字母被混淆。我为此使用了Arial,并使用unicode字符集。

  • 我该如何完成扁化我的unicode文件?
  • 是否有任何其他提供unicode支持的pdf工具?
  • pdftk是否有一个我错过的unicode开关?

编辑1:由于这个问题还没有解决超过9个月,我决定为它开始赏金。如果有选项赞助pdftk中的功能或错误修正,我很乐意捐赠。

编辑2:我不再在这个项目上工作,所以我无法验证新的答案。如果任何人有类似的问题,我很高兴,如果他们能对我有利的回应。

+0

您是否尝试过直接使用iText库来执行此功能? – Merlin 2011-08-03 10:46:31

+0

看看http://stackoverflow.com/questions/6047970/weird-characters-when-filling-pdf-with-pdftk它解决了我的问题 – 2014-03-05 00:36:47

回答

1

不幸的是,在源.xfdf文件中,UTF-8字符编码不能与非ASCII字符的十进制或十六进制引用无效。 PDFTK诉1.44。

+0

看看http://stackoverflow.com/questions/6047970/weird-characters-when-filling-pdf-with-pdftk – 2014-03-05 00:36:17

0

什么是PDFTK的版本? 我用波兰字符(utf-8)尝试了同样的事情。

不适用于我。

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

视窗7,CMD,file.pdf + file.fdf - > new.pdf

PDFTK file.pdf fill_form file.xfdf输出新.PDF压扁

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输出new.pdf弄平

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

这是更多或不太相同的情况。我尝试了版本1.41-3和1.43。正如我所看到的,自2010年10月28日以来,1.44版本已经发布。我会试一试。 – Mateng 2010-11-21 23:04:38

+0

我也收到了与fdf同样的异常。 – atlantis 2011-04-21 08:22:00

1

您可以试用http://www.adobe.com/products/livecycle/designer/的试用版并查看它生成的PDF文件。

您可以尝试的另一个商业软件是http://www.appligent.com/fdfmerge。有关如何使用UTF-8处理xFDF,请参见http://146.145.110.1/docs/userguide/FDFMergeUserGuide.pdf的第16页。

我也有看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 /文本/ PDF/XfdfReader.java看着。它似乎没有做任何特殊的输入。

也许pdftk会做你想做的,当你在你的xFDF输入中将奇怪的字符编码为字符引用时。

+0

谢谢,我会稍后尝试一下这个角色参考。 – Mateng 2011-08-03 17:00:32

+0

不幸的是,我安装的代码库已经被损坏了。这只是意味着更多的延迟。 – Mateng 2011-09-01 13:30:42

+0

@Mateng字符参考是否适合你? – wizonesolutions 2012-05-07 19:35:14

1

在Win7机器上使用pdftk 1.44我遇到了与xfdf文件相同的问题,而fdf工作正常。我创建了一个没有任何特殊字符的xfdf文件(只有ANSI),但pdftk再次崩溃。我邮寄了开发者。很遗憾,直到现在还没有答案

1

我在这方面取得了一些进展。从http://koivi.com/fill-pdf-form-fields/的代码开始,我修改了值编码,以输出ascii范围之外的任何字符的数字代码。

与pitulski的特殊字符串

现在:

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; 
} 
2

我发现通过使用乔恩的模板,但使用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); 
0

您可以通过给他们的Unicode编码的八进制数\ DDD

0

为了解决这个问题,我写了PdfFormFillerUTF-8采用UTF-8字符:http://sourceforge.net/projects/pdfformfiller2/

+0

链接不是答案。 SO上的答案预计是独立的。请[查看这个元问题](http://meta.stackexchange.com/q/8231/135887),并为您的问题添加足够的细节,使其不完全依赖于外部链接。也许你应该添加一个代码示例来展示这个库如何解决这个问题? – Charles 2014-01-22 23:16:16

0

有一个直接替代了PDFTK工具

Mcpdfhttps://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。

+0

gitrepo不提供示例pdf文件。对于我的pdf文件,甚至在他们使用“Łódź”这个词的情况下也是行不通的(有些字符不见了,不同的字符以不同的pdf格式显示,我试过了,是的,我也试图从LibreOffice生成表格)。而且在我的测试中以及[其他](https://github.com/m-click/mcpdf/issues/22)中都不适用于俄文字符。 mcpdf可能适用于作者的流水线,除此之外它似乎被打破。虽然围绕iText的想法很有道理。 – Adobe 2016-11-06 10:00:20