问题描述
我正在使用PHP中的setasign\FPDI
库来生成PDF文档,而我所有的文档都在希伯来语中。
我正在接收UTF-8中的希伯来语字符,并将其转换为cp1255,然后将希伯来语字体添加到FPDF中,一切呈现得很好,只有希伯来语单词被反转/镜像了。
我测试一下字符串是否包含希伯来字母,如果是,我使用strrev()
对其进行反转,但是如果该字符串还包含电话号码或其他非希伯来语单词,那么它也会被反转。
这些是我为FPDF格式化希伯来语的方法:
/**
* Utility to check if the string is in Hebrew
* @param string $string
* @return int|false
*/
protected function isHebrew(string $string)
{
if (!$string) return false;
// return strlen($string) != strlen(utf8_decode($string));
return preg_match("/\p{Hebrew}/u",$string);
}
/**
* Utility to format a string to be used with FPDF.
* @param string $string
* @return string
*/
protected function formatString(string $string): string
{
$formattedValue = iconv('UTF-8','cp1255',$string);
return $this->isHebrew($string) ? strrev($formattedValue) : $formattedValue;
}
这是设置FPDI / FPDF实例的方式:
$pdf = new Fpdi();
$pdf->AddFont('OpenSansHebrew','','OpenSansHebrew.PHP');
$pdf->SetFont('OpenSansHebrew',10);
是否可以使用不使用strrev()
方法来解决此问题?对我来说这是一个非常糟糕的解决方案。
还有,有什么方法可以使文档成为RTL?而是将其生成为LTR。
谢谢!
解决方法
FPDI可以与TCPDF(最终从FPDF继承)一起使用,并且对RTL具有本机支持,并且还内置了对支持cp1255编码的“免费”字体的支持。
使用FPDI时,只需用TCPDF替换FPDF,它就可以解决您的问题。