pdftk + xfdf + php无法处理变音符号 [英] pdftk + xfdf + php can't handle umlauts
问题描述
我正在使用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>ö</value>
</field>
<field name="rakennemateriaali">
<value>ä</value>
</field>
<field name="laatuvaatimukset">
<value>å</value>
</field>
<field name="mittauspaikan_tiivistysmenetelma">
<value>á</value>
</field>
<field name="pohjalevy">
<value>é</value>
</field>
<field name="pohjamaa-alusrakenne">
<value>í</value>
</field>
<field name="mittauspaikan-tiivistysmenetelma">
<value>è</value>
</field>
<field name="emoduli">
<value>ö</value>
</field>
<field name="tiiveys">
<value>öä</value>
</field>
<field name="huomautukset_ja_loppupaatelmat1">
<value>öä</value>
</field>
<field name="huomautukset_ja_loppupaatelmat2">
<value>öä</value>
</field>
<field name="huomautukset_ja_loppupaatelmat3">
<value>öä</value>
</field>
<field name="empa1">
<value>ö</value>
</field>
<field name="empa1-e">
<value>ö</value>
</field>
<field name="empa2">
<value>ö</value>
</field>
<field name="empa2-e">
<value>ö</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>öä</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 修复了该死的问题.最初,这些表格是使用OSX Snow Leopard上的Adobe Acrobat Pro制作的.现在,我使用LibreOffice + Oracle PDF Import插件重新制作了表格,一切似乎都正常了!
这是因为您在PHP脚本中使用了htmlentities
.将重音符号转换为&xxxx;
将XML编码设置为iso-8859-1
或WINDOWS-1252
,并在PHP脚本中省略htmlentities
另一种尝试的方法是使用 utf8_encode
代替 htmlentities
(而不修改XML编码) >
I'm using XFDF files to fill out PDF-forms serverside with PHP and pdftk but my problem is that no non-english characters (ä, ö, å etc.) are printed to the form fields.
Here is the function I use to parse the XFDF file:
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;
And the resulting XFDF file looks like this:
<?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>ö</value>
</field>
<field name="rakennemateriaali">
<value>ä</value>
</field>
<field name="laatuvaatimukset">
<value>å</value>
</field>
<field name="mittauspaikan_tiivistysmenetelma">
<value>á</value>
</field>
<field name="pohjalevy">
<value>é</value>
</field>
<field name="pohjamaa-alusrakenne">
<value>í</value>
</field>
<field name="mittauspaikan-tiivistysmenetelma">
<value>è</value>
</field>
<field name="emoduli">
<value>ö</value>
</field>
<field name="tiiveys">
<value>öä</value>
</field>
<field name="huomautukset_ja_loppupaatelmat1">
<value>öä</value>
</field>
<field name="huomautukset_ja_loppupaatelmat2">
<value>öä</value>
</field>
<field name="huomautukset_ja_loppupaatelmat3">
<value>öä</value>
</field>
<field name="empa1">
<value>ö</value>
</field>
<field name="empa1-e">
<value>ö</value>
</field>
<field name="empa2">
<value>ö</value>
</field>
<field name="empa2-e">
<value>ö</value>
</field>
<field name="allekirjoitus">
<value>Einomies Porkkakoski</value>
</field>
</fields>
<ids original="84b0ff7a04b017303be186faa0d1254a" modified="1343290963" />
<f href="assets/loadman.pdf" />
</xfdf>
The fields with english letters print perfectly but letters with acutes, graves or scandinavian additions wont transfer to the PDF file. EXCEPT for some reason
<field name="huomautukset_ja_loppupaatelmat1">
<value>öä</value>
</field>
works perfectly and prints öä!
The command I run is
pdftk <pdf-file> fill_form <xfdf-file> output <output file> flatten
This does not result any errors.
I'm using Debian 6.0, PHP 5.3.3-7+squeeze13 and the pdftk version is 1.44-5
UPDATE I noticed that if I don't flatten the generated file and open it, the characters are printed correctly when the field is activated but hidden again when the field is unfocused. If I manually type anything to the file, the special characters will show up also. Saved and reopened file however doesn't show the text unless again some text is added.
UPDATE 2 Got the damn thing fixed. Originally the forms were made with Adobe Acrobat Pro on OSX Snow Leopard. Now I remade the forms with LibreOffice + Oracle PDF Import plugin and everything seems to be working!
It's because you use htmlentities
in your PHP script. That converts the accented symbols to &xxxx;
Set your XML encoding to iso-8859-1
or WINDOWS-1252
and leave out the htmlentities
in your PHP script
Another thing to try is to use utf8_encode
instead of htmlentities
(and not modify the XML-encoding)
这篇关于pdftk + xfdf + php无法处理变音符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!