pdftk + xfdf + php无法处理umlauts

3

我正在使用XFDF文件和PHP以及pdftk服务器端填写PDF表单,但我的问题是没有任何非英语字符(如ä,ö,å等)被打印到表单字段中。

下面是我用来解析XFDF文件的函数:

function createFDF($file,$info,$enc='UTF-8'){ 
$data='<?xml version="1.0" encoding="'.$enc.'"?>'."\n". 
    '<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">'."\n". 
    '<fields>'."\n"; 
foreach($info as $field => $val){ 
    $data.='<field name="'.$field.'">'."\n"; 
    if(is_array($val)){ 
        foreach($val as $opt) 
            $data.='<value>'.htmlentities($opt,ENT_COMPAT,$enc).'</value>'."\n"; 
    }else{ 
        $data.='<value>'.htmlentities($val,ENT_COMPAT,$enc).'</value>'."\n"; 
    } 
    $data.='</field>'."\n"; 
} 
$data.='</fields>'."\n". 
    '<ids original="'.md5($file).'" modified="'.time().'" />'."\n". 
    '<f href="'.$file.'" />'."\n". 
    '</xfdf>'."\n"; 
return $data; 

生成的XFDF文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<fields>
<field name="loadman-pudotuspainolaitteen-mittaustulosten-tallenne">
<value>1201</value>
</field>
<field name="tutkittavarakenne-rivi1">
<value>a</value>
</field>
<field name="tutkittavarakenne-rivi2">
<value></value>
</field>
<field name="tutk-pvm">
<value>11.12.2012</value>
</field>
<field name="mittauksen_suorittaja">
<value>o</value>
</field>
<field name="vast-tyonjohtaja">
<value>&ouml;</value>
</field>
<field name="rakennemateriaali">
<value>&auml;</value>
</field>
<field name="laatuvaatimukset">
<value>&aring;</value>
</field>
<field name="mittauspaikan_tiivistysmenetelma">
<value>&aacute;</value>
</field>
<field name="pohjalevy">
<value>&eacute;</value>
</field>
<field name="pohjamaa-alusrakenne">
<value>&iacute;</value>
</field>
<field name="mittauspaikan-tiivistysmenetelma">
<value>&egrave;</value>
</field>
<field name="emoduli">
<value>&ouml;</value>
</field>
<field name="tiiveys">
<value>&ouml;&auml;</value>
</field>
<field name="huomautukset_ja_loppupaatelmat1">
<value>&ouml;&auml;</value>
</field>
<field name="huomautukset_ja_loppupaatelmat2">
<value>&ouml;&auml;</value>
</field>
<field name="huomautukset_ja_loppupaatelmat3">
<value>&ouml;&auml;</value>
</field>
<field name="empa1">
<value>&ouml;</value>
</field>
<field name="empa1-e">
<value>&ouml;</value>
</field>
<field name="empa2">
<value>&ouml;</value>
</field>
<field name="empa2-e">
<value>&ouml;</value>
</field>
<field name="allekirjoitus">
<value>Einomies Porkkakoski</value>
</field>
</fields>
<ids original="84b0ff7a04b017303be186faa0d1254a" modified="1343290963" />
<f href="assets/loadman.pdf" />
</xfdf>

使用英文字母的字段在打印时完美显示,但带有重音符号、抑扬符号或斯堪的纳维亚字母的字母无法传输到 PDF 文件中。 但是由于某种原因,有例外情况。

<field name="huomautukset_ja_loppupaatelmat1">
<value>&ouml;&auml;</value>
</field>

它完美地工作并打印出了öä!

我运行的命令是

pdftk <pdf-file> fill_form <xfdf-file> output <output file> flatten

这不会导致任何错误。

我使用的是Debian 6.0,PHP 5.3.3-7+squeeze13和pdftk版本为1.44-5。

更新 我注意到如果我不压平生成的文件并打开它,当字段被激活时字符会正确打印,但在取消焦点时再次隐藏。如果我手动向文件键入任何内容,则特殊字符也将显示出来。但是保存和重新打开文件则不会显示文本,除非再次添加一些文本。

更新2 已经解决了该问题。最初使用Adobe Acrobat Pro在OSX Snow Leopard上制作了表单。现在使用LibreOffice + Oracle PDF Import插件重新制作表单,一切似乎都正常了!


在使用PDFTK填充由LibreOffice Writer创建的PDF时遇到了相同的问题。在导出的PDF中,我无法写入非拉丁字符,我是使用内置的PDF导出器导出的。 - Andrewboy
3个回答

2

我认为如果您使用以下列表,您会更有好运:

  • &#196; 代替 &Auml; 表示 Ä
  • &#197; 代替 &Aring; 表示 Å
  • &#214; 代替 &Ouml; 表示 Ö
  • &#220; 代替 &Uuml; 表示 Ü
  • &#223; 代替 &szlig; 表示 ß
  • &#228; 代替 &auml; 表示 ä
  • &#229; 代替 &aring; 表示 å
  • &#246; 代替 &ouml; 表示 ö
  • &#252; 代替 &uuml; 表示 ü

我相信您可以自己找出如何扩展该列表以达到完整性的方法 :-)


2
有趣的是,最近在Unicode邮件列表上进行了一次讨论,得出结论:字符引用在现今大部分情况下已不再必要;-)。但确实,在XML格式中使用HTML实体是完全错误的。 - Joey

2
因为您在PHP脚本中使用了“htmlentities”。这将把重音符号转换为“&xxxx;”。
将您的XML编码设置为“iso-8859-1”或“WINDOWS-1252”,并在PHP脚本中省略“htmlentities”。
另一个尝试的方法是使用“utf8_encode”代替“htmlentities”(不修改XML编码)。

我将编码更改为ISO-8859-1并删除了htmlentities。现在,在XFDF文件中,ä结果为<value>ä</value>,并且该值仅以简单的方式打印为¤。我没有理解错吗? - dmni
我使用了utf8_decode()函数将<value>ä</value>转换为<value>ä</value>,但现在该字符再次无法打印到字段中。 - dmni

0

嗨,Nikolay,感谢您的回答并欢迎来到Stack Overflow。写答案时的一个小提示:通常最好包含对您的答案的解释,而不仅仅是一个链接。这样,如果链接移动或中断,答案仍将有用。 - StackExchange What The Heck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接