使用PDFTk填充PDF时出现奇怪的字符

时间:2011-05-18 16:30:23

标签: php pdf encoding ubuntu pdftk

我在Ubuntu上使用PHP和PDFTK。当用数据填充PDF时,我会在这些带有重音的字母上得到奇怪的字符:áóí。我正在使用 UTF-8 编码:我检查了echo mb_check_encoding ($ var,'UTF-8')输出 1 - TRUE 。知道我能做什么吗?

我也试过用utf8_decode转换为ISO,但仍然没有运气。

由于

2 个答案:

答案 0 :(得分:9)

你是对的,utf8_decode()适用于可以编码为Windows-1252的字符(即U + 0000-U + 00FF)。

但是,对于无法在Windows-1252中编码的字符,它不起作用。

但是,您始终可以使用UTF-16BE对字符进行编码。您只能对单个字段执行此操作,例如编码“özil”一词:

<<
/V (þÿ^@ö^@z^@i^@l)
/T (name)
>>

(这里“^ @”表示NUL字符(U + 0000)。如果文件在Windows-1252(latin1)中编码,这就是它在我的编辑器(vim)中的样子。)

请注意,您需要使用字节顺序标记(如果您的文件在Windows-1252中编码,则显示为“þÿ”)并且您需要以UTF格式编码整个字符串(在两个括号之间) 16。

如果您在PHP脚本中生成FDF,可以执行以下操作:

<<
/V (<?php echo chr(0xfe) . chr(0xff) . str_replace(array('\\', '(', ')'), array('\\\\', '\(', '\)'), mb_convert_encoding("özil", 'UTF-16BE')); ?>)
/T (name)
>>

你也可以写出这样的十六进制代码(即用括号括起来而不是用圆括号括起来):

<<
/V <FEFF00F6007A0069006C>
/T (name)
>>

这具有完全相同的结果(字符串“özil”)。它在字符方面的效率较低,但它实际上似乎在pdftk中更可靠,它有一些我发现的错误(在版本2.02中)。

最后,您还可以为八进制表示法(\ ddd)中的任何字符写出Unicode代码点。例如,ö有代码点U + 00F6,八进制为366,所以你可以写:

<<
/V (\366zil)
/T (name)
>>

然而,这仅适用于U + 00FF(八进制377)。除此之外,你必须使用UTF-16。

PDF standard允许您将整个FDF文档的编码设置为UTF-8。我试过这个并没有使用pdftk,但理论上它会这样做:

%FDF-1.2
1 0 obj
<<
/Version /1.3
/Encoding /utf_8
/FDF

(根据标准,你可能不得不在标题中将FDF版本设置为1.3(或更高)。)

您也可以在字段级别执行此操作:

<<
/V (özil)
/T (name)
/Encoding /utf_8
>>

但正如我所说,我没有设法让这一切发挥作用。 pdftk似乎忽略了它。

答案 1 :(得分:2)

用utf8_decode解决。我猜有一些缓存问题,角色仍在显示