我认为我的问题很简单:我想从模板创建 PDF 文档。我想要填写 12 个值。我希望以后能够更改模板(设计),所以我认为 PDF 表单是个好主意。我使用现有的Word模板,并使用Adobe Acrobat Pro将其更改为PDF形式。 我的后端应用程序完全依赖于 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-16LE。然后,显示字符 ö、ä 和 ü,但不显示 €。此外,所有字符之间都有奇怪的空格。
我想一定有一个简单的解决方案。我也愿意使用另一种技术,因为我知道 pdftk 不是专业人士会使用的东西:)
编辑:
我已将
$encodedValue = iconv('UTF-8', 'UTF-8', $value);
更改为 $encodedValue = utf8_decode($value);
现在它可以与 ü
配合使用。但€
显示为?
所以这还不够令人满意。
我变了
$encodedValue = iconv('UTF-8', 'UTF-8', $value);
从一个字符集转换为相同的字符集是一项无操作。它什么也没做。
到
现在可以与$encodedValue = utf8_decode($value);
配合使用。但是ü
显示为€
所以这还不够令人满意?
这指向正确的答案,因为
utf8_decode()
仅在 ISO-8859-1 和 UTF-8 之间转换,并且 €
不存在于 8859-1 中。 utf8_decode()
和utf8_encode()
实际上已被弃用,因为它们的目的被普遍误解,而且事实上它们几乎从未被正确使用。
除此之外,
€
存在于MS的8859-1相似/超集编码cp1252中,并且实际上是区分它们的少数方法之一。这应该可以解决您的问题:
$encodedValue = iconv('UTF-8', 'cp1252', $value);
您的原始数据似乎是 UTF-8,而您生成的文档使用 cp1252。
字符串编码是元数据,需要与实际数据一起跟踪。它们无法被可靠地检测到,并且声称这样做的函数是“猜测”。有时,人类可以根据尝试/错误/直觉来找出它,或者在这种情况下是单个显着的字符,但在某些条件下,许多编码乍一看看起来是相同的。