PHPWord での中国語の文字化けの解決、中国語フォントの設定、および一般的な使用上の問題
最近のプロジェクト開発では、Word ドキュメントをエクスポートするために PHP テクノロジを使用する必要がありました。最初は、ActiveX/ を使用することでした。 Word.Application などの COM コンポーネントには、高い形式互換性という利点があり、純粋な doc Word2003 形式のドキュメントを生成できるという利点があります。欠点は、より多くのリソースを消費することです (呼び出しにより WINWORD.EXE プロセスが開始されます)。また、マルチユーザーの Web ユーザーには適していません。第 2 に、PHP などのほとんどの Web 開発テクノロジは Linux サーバー上で実行できず、プラットフォームの移植性と互換性も良好ではありません。 Word を生成する 2 番目の方法は、Word と互換性のある Web ページ形式を生成して、それを Word で開くことです。この方法は、結局のところ、ファイル形式が HTML であるため、形式の互換性が良くありません。利点は、サーバー リソースを節約し、迅速に生成できることです。最後の解決策は、PHPWord を使用して Word2007 (docx) 形式でドキュメントを生成することです。現在、基本的に Microsoft Office Word 2003 以降のバージョンはこの形式と互換性があります。バージョンに関しては、互換性のある形式のパッケージ (ダウンロード アドレス) をダウンロードしてインストールするだけで済みます。もちろん、最新バージョンの Office (Office 2007 を含むがこれに限定されません) を使用している場合は、そのようなファイルを通常どおり開くことができます。 2010) の場合、この形式のパッケージをインストールする必要はありません。
それでは、PHPWord を紹介します。PHPword を通じてプロジェクトに関する詳細情報をダウンロードして入手できます。
私は主に使用中に中国語の文字化けの問題に遭遇しました。オンライン専門家の指導に基づいて、この種の問題を次の方法で解決しました。
1. 東アジアのフォントのサポートを追加します。
パス /Writer/Word2007/Base.php ファイルの内容 (おそらく行 349) を開いて編集します。行数はバージョンによって異なります。変更される可能性があります) おそらく、_writeTextStyle 関数に追加します:
$objWriter->writeAttribute('w:eastAsia', $font)
たとえば、私の変更されたフラグメントは基本的に次のとおりです:
// Font if($font != 'Arial') { $objWriter->startElement('w:rFonts'); $objWriter->writeAttribute('w:eastAsia', $font); // 添加这行 $objWriter->writeAttribute('w:ascii', $font); $objWriter->writeAttribute('w:hAnsi', $font); $objWriter->writeAttribute('w:cs', $font); $objWriter->endElement(); }
2. 中国語の文字化けの問題を解決するPHPWord/Template.php を編集し、コード $replace = utf8_encode($replace); を見つけて、このコード行を削除またはコメント アウトし、$replace = iconv('gbk ','utf-8', $replace);, たとえば、コードは次のように変更されます:
/** * Set a Template value * * @param mixed $search * @param mixed $replace */ public function setValue($search, $replace) { if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') { $search = '${'.$search.'}'; } if(!is_array($replace)) { //$replace = utf8_encode($replace); $replace =iconv('gbk', 'utf-8', $replace); // 注释掉上面行后添加这行 } $this->_documentXML = str_replace($search, $replace, $this->_documentXML); }
呼び出しメソッドは次のとおりです:
/** * Add a Text Element * * @param string $text * @param mixed $styleFont * @param mixed $styleParagraph * @return PHPWord_Section_Text */ public function addText($text, $styleFont = null, $styleParagraph = null) { //$givenText = utf8_encode($text); $givenText = iconv('gbk', 'utf-8', $text); // 注释掉上面行后添加这行 $text = new PHPWord_Section_Text($givenText, $styleFont, $styleParagraph); $this->_elementCollection[] = $text; return $text; }
上記のコードは主にテンプレートの問題を解決します。以下の同じ理由で、コード $givenText = utf8_encode($text); を検索し、このコード行を削除またはコメント アウトして、$givenText = iconv(' を追加します。 gbk', 'utf-8', $text); たとえば、コードは次のとおりです:
呼び出しメソッドは上記のテンプレート呼び出しと似ているため、ここにはリストされません。
苦労した結果、インターネット上に 別のバージョンの PhpWord があることを発見しました。プロジェクトのクラス名は、PHPOffice/PHPWord のものです。 GitHub プロジェクトのアドレス (ドキュメント) 。このバージョンの PHPWord には、より豊富なコンテンツがあり、より多くの機能 (行間、インデント、最初の行のインデントなど) がサポートされています。また、このバージョンの PHPWord は API インターフェイスであることも注目に値します。基本的には同じであり、普遍的に使用できます。ただし、一部の API は PHPOffice/PHPWord では推奨されません。たとえば、createSection を addSection に変更する必要があります。また、このバージョンの PHPWord を適用するには、上記のような中国語サポートの変更 は必要ありません。トラブルフリー。
これら 2 つの PHPWord プロジェクトの関係者は、より詳細な使用例とドキュメントを提供していますが、ここでは紹介しません。
最後のヒント: テンプレート モードでは、loadTemplate は setValue などのテンプレート操作メソッドのみを使用でき、段落の追加や変更はできません。これは少し不便です。
PHPOffice/PHPWord については、参考のために簡単な例を示します (もちろん、もっと公式の例があります):
require_once 'PhpOffice/PhpWord/PhpWord.php'; // 包含头文件 use PhpOffice\PhpWord\Autoloader; use PhpOffice\PhpWord\Settings; use PhpOffice\PhpWord\IOFactory; require_once __DIR__ . '/PhpOffice/PhpWord/Autoloader.php'; Autoloader::register(); Settings::loadConfig(); // Create a new PHPWord Object $PHPWord = new \PhpOffice\PhpWord\PhpWord(); $PHPWordHelper= new \PhpOffice\PhpWord\Shared\Font(); $PHPWord->setDefaultFontName('仿宋'); // 全局字体 $PHPWord->setDefaultFontSize(16); // 全局字号为3号 // 设置文档的属性,这些在对文档右击属性可以看到,也可以省去这些步骤 $properties = $PHPWord->getDocumentProperties(); $properties->setCreator('张三'); // 创建者 $properties->setCompany('某公司'); // 公司 $properties->setTitle('某某文档'); // 标题 $properties->setDescription('http://wangye.org'); // 描述 $properties->setLastModifiedBy('李四'); // 最后修改 $properties->setCreated( time() ); // 创建时间 $properties->setModified( time() ); // 修改时间 // 添加3号仿宋字体到'FangSong16pt'留着下面使用 $PHPWord->addFontStyle('FangSong16pt', array('name'=>'仿宋', 'size'=>16)); // 添加段落样式到'Normal'以备下面使用 $PHPWord->addParagraphStyle( 'Normal',array( 'align'=>'both', 'spaceBefore' => 0, 'spaceAfter' => 0, 'spacing'=>$PHPWordHelper->pointSizeToTwips(2.8), 'lineHeight' => 1.19, // 行间距 'indentation' => array( // 首行缩进 'firstLine' => $PHPWordHelper->pointSizeToTwips(32) ) ) ); // Section样式:上3.5厘米、下3.8厘米、左3厘米、右3厘米,页脚3厘米 // 注意这里厘米(centimeter)要转换为twips单位 $sectionStyle = array( 'orientation' => null, 'marginLeft' => $PHPWordHelper->centimeterSizeToTwips(3), 'marginRight' => $PHPWordHelper->centimeterSizeToTwips(3), 'marginTop' => $PHPWordHelper->centimeterSizeToTwips(3.5), 'marginBottom' => $PHPWordHelper->centimeterSizeToTwips(3.8), 'pageNumberingStart' => 1, // 页码从1开始 'footerHeight' => $PHPWordHelper->centimeterSizeToTwips(3), ); $section = $PHPWord->addSection($sectionStyle); // 添加一节 // 下面这句是输入文档内容,注意这里用到了刚才我们添加的 // 字体样式FangSong16pt和段落样式Normal $section->addText('文档内容', 'FangSong16pt', 'Normal'); $section->addTextBreak(1); // 新起一个空白段落 $objWriter = IOFactory::createWriter($PHPWord, 'Word2007'); $objWriter->save('/path/to/file'); // 保存到/path/to/file路径下