PHPWord:创建阿拉伯语从右到左的单词文档

时间:2012-12-20 07:30:48

标签: php encoding utf-8 arabic phpword

我正在尝试使用PHPWord来创建一个word文档,其中包含从MySQL数据库中提取的动态数据。数据库有MySQL charset:UTF-8 Unicode(utf8) MySQL连接排序规则:utf8_unicode_ci表格字段也是如此。

数据在HTML中存储和预览得很好,但是在使用阿拉伯语变量创建文档时,Word中的输出看起来像أحÙد Ùبار٠اÙÙرÙ

$PHPWord = new PHPWord();
$document = $PHPWord->loadTemplate('templates/.../wtvr.docx');
$document->setValue('name', $name);
$document->setValue('overall_percent_100', $overall_percent_100);
$document->save('Individual Report - ' . $name . '.docx');

无论如何要解决这个问题吗?

5 个答案:

答案 0 :(得分:6)

嗯,是的。但不幸的是,您必须修改库。图书馆的作者使用utf8_encode/utf8_decode显然没有理解他们做了什么。

Shared/String.php的第150行:

替换

public static function IsUTF8($value = '') {
    return utf8_encode(utf8_decode($value)) === $value;
}

使用

public static function IsUTF8($value = '') {
    return mb_check_encoding($value, "UTF-8");
}

然后,如果你这样做

$ grep -rn "utf8_encode" .

在项目根目录中,您将找到使用utf8_encode的所有行。你会看到像

这样的行
$linkSrc = utf8_encode($linkSrc); //$linkSrc = $linkSrc;

$givenText = utf8_encode($text); //$givenText = $text;

您只需删除评论中显示的utf8_encode即可。

为什么utf8_encode/utf8_decode错了?首先,因为那不是他们所做的。他们会from_iso88591_to_utf8from_utf8_to_iso88591。其次,ISO-8859-1几乎从未使用过,通常当有人声称他们使用它时,他们实际上使用的是Windows-1252。 ISO-8859-1是一个非常小的字符集,甚至不能编码,更不用说阿拉伯字母了。

您可以通过执行以下操作快速查看库:

$ grep -rn "utf8_\(en\|de\)code" .

如果你得到匹配,你应该继续前进并寻找其他的库。这些函数每次都只是做错了,即使有人需要一些边缘情况来使用这些函数,当你真正需要ISO-8859-1时,最好明确它,因为你通常不会这样做。

答案 1 :(得分:1)

  • 请在phpword模板中找到以下几点来编写所有类型的utf-8从右到左数据插入。

    1. 在Template.php的setValue函数(第95行)中,请注释以下代码部分

      //if(!is_array($replace)) {
      //    $replace = utf8_encode($replace);
      //}
      
    2. 如果你有从右到左的问题,在某种语言中,文字与从左到右的文字混合,在同一个setValue函数中添加以下代码。

      $replace = "<w:rPr><w:rtl/></w:rPr>".$replace; 
      

// ====这里是单词数据如何在单词模板中写入的工作示例             // ---加载phpword库----

    $this->load->library("phpword/PHPWord");
    $PHPWord  = new PHPWord();
    $document = $PHPWord->loadTemplate('./forms/data.docx');

    $document->setValue('NAME', 'شراف الدين');
    $document->setValue('SURNAME', 'مشرف');
    $document->setValue('FNAME', 'ظهرالدين');
    $document->setValue('MYVALUE', '15 / سنبله / 1363');
    $document->setValue('PROVINCE', 'سمنگان');
    $document->setValue('DNAME', 'عبدالله');
    $document->setValue('DMOBILE', '0775060701');   
    $document->setValue('BOX','<w:sym w:font="Wingdings" w:char="F06F"/>');
    $document->setValue('NO','<w:sym w:font="Wingdings" w:char="F06F"/>');
    //$document->setValue('BOX2','<w:sectPr w:rsidR="00000000"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:linePitch="360"/>');
    $document->setValue('YES','<w:sym w:font="Wingdings" w:char="F0FE"/>');

    $document->setValue('CLASS1','<w:sym w:font="Wingdings" w:char="F06F"/>');
    $document->setValue('CLASS2','<w:sym w:font="Wingdings" w:char="F0FE"/>');
    $document->setValue('DNAME','يما شاه رخي');
    $document->setValue('TEL','0799852369');
    $document->setValue('ENTITY','مشاور حقوقي و نهادي');
    $document->setValue('ENTITY','مشاور حقوقي و نهادي');
    $document->setValue('REMARKS','در مسابقات سال 2012 میلادی در میدان Judo   بر علاوه به تعداد  39 نفر در تاریخ 4/میزان/ سال 1391 قرار ذیل اند.');

    $file = "./forms/data2.docx";
    $document->save($file);
    header("Cache-Control: public");     
    header("Content-Description: File Transfer");     
    header("Content-Disposition: attachment; filename=data2.docx");     
    header("Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document");     
    header("Content-Transfer-Encoding: binary");         
    ob_clean();
    flush();
    readfile($file);

//需要设计如何改变外观。 colr#E4EDF9 enter image description here

答案 2 :(得分:0)

查找

$objWriter->startElement('w:t');
$objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text
$objWriter->writeRaw($strText);
$objWriter->endElement();

在Writer / Word2007 / Base.php中

替换为

$objWriter->startElement('w:textDirection');
$objWriter->writeAttribute('w:val', 'rlTb');
$objWriter->startElement('w:t');
$objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text
$objWriter->writeRaw($strText);
$objWriter->endElement();
$objWriter->endElement();

此外,请确保您不使用任何样式使其正常工作,否则您将不得不在您使用的每个功能中重复此步骤。

答案 3 :(得分:0)

我必须在两个不同于Nasers方式的地方修复它:

1- in Section.php addText function:

我这样做了:

//$givenText = utf8_encode($text);
$givenText = $text;

2 in cell.php addText function

我这样做了:

// $text = utf8_encode($text);

现在你的word文件会以正确的方式显示unicode字符。 然后我在文本方向上遇到了问题。 我使用此代码找到了解决方案

$section->addText($val['notetitle'],array('textDirection'=>PHPWord_Style_Cell::TEXT_DIR_TBRL));

你可以看到cell.php文件中的两个常量

const TEXT_DIR_TBRL = 'tbRl';
const TEXT_DIR_BTLR = 'btLr';

请注意,您之前不能应用其他数组组合样式,例如Paragraph,而不是#textdirection&#39; ,因为他的风格使'textDirection&#39;禁用。

答案 4 :(得分:0)

打开PHPWord \ Template.php
更改setValue函数(第89行),如下所示 更改 $ replace = utf8_encode($ replace); $ replace = $ replace;