php 填写PDF服务器后端特殊字符

cu6pst1q  于 12个月前  发布在  PHP
关注(0)|答案(1)|浏览(75)

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

iswrvxsc

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中,实际上是区分它们的少数方法之一。这应该可以解决您的问题:

$encodedValue = iconv('UTF-8', 'cp1252', $value);

字符串
其中,原始数据显示为UTF-8,而生成的文档使用的是cp 1252。
字符串编码是需要与实际数据一起跟踪的元数据。它们无法被可靠地检测到,并且声称这样做的函数是猜测。有时候人类可以根据尝试/错误/直觉来弄清楚它,或者在这种情况下是一个明显的字符,但在某些情况下,很多编码看起来都是一样的。

相关问题