填写PDF服务器后台特殊字符

问题描述 投票:0回答:1

我认为我的问题很简单:我想从模板创建 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);
现在它可以与
ü
配合使用。但
显示为
?
所以这还不够令人满意。

php pdf utf-8 pdftk
1个回答
0
投票

我变了

$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。

字符串编码是元数据,需要与实际数据一起跟踪。它们无法被可靠地检测到,并且声称这样做的函数是“猜测”。有时,人类可以根据尝试/错误/直觉来找出它,或者在这种情况下是单个显着的字符,但在某些条件下,许多编码乍一看看起来是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.