我以为我的问题很简单:我想从模板创建一个PDF文档。有12个值,我想填写。我希望能够更改模板后(设计),所以我认为PDF表单将是一个好主意。我继续使用已经存在的Word模板,并将其更改为PDF表单与Adobe Acrobat Pro。目前,我的后端应用程序完全依赖于PHP,但我愿意接受建议
我试过FPDI、FPDM和PDFTK。
PDFTK一切正常,但我无法让它填写特殊字符,如:
private function createCertificate($certificate,$template): array
{
$pathOutput = $this->basePathOutput . 'certificate.pdf'; //DEBUGGING
$pathFdf = $this->basePathFdf . 'certificate.fdf'; //DEBUGGING
$fdf = $this->createFDF($certificate);
file_put_contents($pathFdf, $fdf);
$result = [
"exitstatus" => 0,
"pathOutput" => $pathOutput,
];
$command = "pdftk $template fill_form $pathFdf output $pathOutput need_appearances flatten";
//echo $command;
exec($command,$pathOutput,$exitStatus);
$result["exitstatus"] = $exitStatus;
return $result;
}
private function createFDF($certificate): string
{
$fdf = "%FDF-1.2\r\n";
$fdf .= "1 0 obj << /FDF << /Fields[\r\n";
foreach($certificate as $key => $value) { //$certificate is an array that has the field name for keys and field values for values.
if($value == "") {
continue;
}
$encodedValue = iconv('UTF-8', 'UTF-8', $value);
$fdf .= "<< /V (" . $encodedValue . ") /T (" . $key . ") >>\r\n";
}
$fdf .= "] >> >>\r\n";
$fdf .= "endobj\r\n";
$fdf .= "trailer\r\n";
$fdf .= "<</Root 1 0 R >>\r\n";
$fdf .= "%%EOF\r\n";
return $fdf
}
字符串
我试着把它编码成UTF-16 LE。然后字符<$,<$,<$被显示出来,但是字符€没有。而且所有字符之间都有奇怪的空格。
我想一定有一个简单的解决方案。我也愿意使用另一种技术,因为我知道pdftk不是专业人士会用途:)
编辑:
我已经将$encodedValue = iconv('UTF-8', 'UTF-8', $value);
更改为$encodedValue = utf8_decode($value);
现在它可以正常使用ü
。但是€
显示为?
,所以这还不令人满意
1条答案
按热度按时间iswrvxsc1#
我改了
$encodedValue = iconv('UTF-8', 'UTF-8', $value);
从一个字符集转换到 * 相同的字符集 * 是一个空操作。它什么也不做。
到
$encodedValue = utf8_decode($value);
现在它可以很好地处理ü
。但是€
显示为?
,所以这还不令人满意这指向正确的答案,因为
utf8_decode()
只在ISO-8859-1和UTF-8之间转换,而€
在8859-1中不存在。除此之外,
€
**存在于MS的8859-1外观相似/超集编码cp 1252中,实际上是区分它们的少数方法之一。这应该可以解决您的问题:字符串
其中,原始数据显示为UTF-8,而生成的文档使用的是cp 1252。
字符串编码是需要与实际数据一起跟踪的元数据。它们无法被可靠地检测到,并且声称这样做的函数是猜测。有时候人类可以根据尝试/错误/直觉来弄清楚它,或者在这种情况下是一个明显的字符,但在某些情况下,很多编码看起来都是一样的。