PHPWord: Criando um documento árabe de direita para esquerda

Estou tentando usar PHPWord para criar um documento de texto que inclua dados dynamics retirados de um database MySQL. O database tem MySQL charset: UTF-8 Unicode (utf8) MySQL conexão collation: utf8_unicode_ci e os campos da tabela também.

Os dados são armazenados e pré-visualizados bem em HTML, no entanto, ao criar o documento com as variables ​​árabes, a saída em Word se parece com Ø£ØÙد Ùبار٠اÙÙر٠.

 $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'); 

Existe alguma maneira de corrigir isso?

Bem, sim. Mas, infelizmente, você deve modificar a biblioteca. O autor da biblioteca usa utf8_encode/utf8_decode obviamente, sem entender o que eles fazem.

Na linha 150, de Shared/String.php :

Substituir

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

Com

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

Então, se você fizer isso

 $ grep -rn "utf8_encode" . 

Na raiz do projeto, você encontrará todas as linhas onde utf8_encode é usado. Você verá linhas como

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

Você pode simplesmente remover o utf8_encode como mostrado nos comentários.

Por que utf8_encode/utf8_decode errado? Antes de tudo, porque não é o que eles fazem. Eles fazem from_iso88591_to_utf8 e from_utf8_to_iso88591 . Em segundo lugar, o ISO-8859-1 quase nunca é usado, e geralmente quando alguém afirma que o usa, eles estão realmente usando o Windows-1252. ISO-8859-1 é um conjunto de caracteres muito pequeno, nem mesmo capaz de codificar , e muito menos letras árabes.

Você pode fazer revisões rápidas de uma biblioteca fazendo:

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

Se você conseguir partidas, você deve seguir em frente e procurar outra biblioteca. Essas funções simplesmente fazem a coisa errada a cada momento, e mesmo se alguém precisasse de algum caso de vantagem para usar essas funções, é muito melhor ser explícito sobre isso quando você realmente precisa do ISO-8859-1, porque você normalmente nunca faz.

  • Encontre os seguintes pontos para escrever todos os tipos de inserção de dados utf-8 da direita para a esquerda no modelo phpword.

    1. Na function setValue (linha # 95) no Template.php, comente a seguinte parte do código

       //if(!is_array($replace)) { // $replace = utf8_encode($replace); //} 
    2. Se você tiver um problema com a direita para a esquerda, que em algum idioma o texto se mistura com o texto da esquerda para a direita, adicione o seguinte código na mesma function setValue .

       $replace = "".$replace; 

// ==== aqui é um exemplo de trabalho de como os dados da palavra podem ser escritos dentro do modelo de palavras // — load phpword libraries —-

  $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',''); $document->setValue('NO',''); //$document->setValue('BOX2',''); $document->setValue('YES',''); $document->setValue('CLASS1',''); $document->setValue('CLASS2',''); $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); 

// precisa como o design pode mudar a aparência. colr # E4EDF9 insira a descrição da imagem aqui

Encontrar

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

Em Writer / Word2007 / Base.php

replace com

 $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(); 

Além disso, certifique-se de que não use nenhum estilo para fazê-lo funcionar, ou então você terá que repetir esta etapa em todas as funções que você usa.

Eu tinha que corrigi-lo em dois lugares diferentes do caminho de Nasers:

1- na function Section.php addText:

Eu fiz isso:

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

2- na function addText da célula.php

Eu fiz isso:

 // $text = utf8_encode($text); 

agora seu arquivo de palavras exibirá caracteres unicode da maneira correta. E então eu tive um problema nas instruções de textos. Eu encontrei a solução usando este código

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

você pode ver as duas constantes no arquivo cell.php

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

note que você não pode aplicar outros estilos combinados de matrizes como parágrafo antes do que ‘textDirection’, porque cujos estilos desabilitam ‘textDirection’.

Abra PHPWord \ Template.php
Mudança na function setValue (linha no 89.) conforme abaixo.
Altere $ replace = utf8_encode ($ replace); para $ replace = $ replace;

Intereting Posts