PHPでのDOCXの正直な生成。 パート1

画像 こんにちは、愛するhabrasociety! かつてHabréには、PHPによるdocファイルの生成に関する興味深い資料がありました。 残念ながら、Habrには他に何も見つかりませんでした。 当時、私は独自のソリューションを開発しました。

.docxファイルを生成することでした。 引数は次のとおりです。





カットの下の詳細。



ファイル構造



画像画像 任意の.docxファイルを取得し、名前を.zipに変更してから開きます。 そして、docxファイルの構造が表示されます。 はい、はい! これは通常のzipアーカイブです。 簡単に言えば、私たちにとって最も興味深いのは、単語フォルダーにあります。 ここで、ルートには、ドキュメントの一般的な設定があります。

wordフォルダで私たちにとって最も興味深いのは、document.xmlファイルです。このファイルは、Office Open XMLの内容を含むファイルです。 文書の内容を直接含むのは彼です。 この形式の詳細については、 英語版ウィキペディアをご覧ください。 _relsフォルダーには、document.xml.relsファイルが含まれています。 将来、ドキュメント内の添付ファイルの関係を説明するのに役立ちます。 文書に画像がある場合、メディアフォルダーはまだ存在している可能性があります。 残りのファイルの名前は、それ自体を物語っているようです。



.docxの生成の学習



そのため、既に決定したように、.docxは単なる通常のzipアーカイブであるため、ソリューションはそれを示唆しています。ドキュメントジェネレータークラスは、「すぐに」アクセスできるZipArchiveクラスの子孫でなければなりません。 そして残りは技術の問題です。 以下は、空の.docxファイルを作成するためのクラスです(zlibを有効にしてUTF-8エンコードを使用することを忘れないでください)。

class Word extends ZipArchive{ //      private $files; //    public $path; public function __construct($filename, $template_path = '/template/' ){ //    $this->path = dirname(__FILE__) . $template_path; //     ,   . if ($this->open($filename, ZIPARCHIVE::CREATE) !== TRUE) { die("Unable to open <$filename>\n"); } //   $this->files = array( "word/_rels/document.xml.rels", "word/theme/theme1.xml", "word/fontTable.xml", "word/settings.xml", "word/styles.xml", "word/document.xml", "word/stylesWithEffects.xml", "word/webSettings.xml", "_rels/.rels", "docProps/app.xml", "docProps/core.xml", "[Content_Types].xml" ); //      foreach( $this->files as $f ) $this->addFile($this->path . $f , $f ); } //   public function create(){ $this->close(); } } $w = new Word( "Example.docx" ); $w->create();
      
      





スクリプトの近くにExample.docxファイルが表示されますが、ファイル構造自体を作成することを忘れないでください。 入手するには、悪名高いMS OfficeとWinrarを使用します。 アセンブリ後、MS Officeを介して開きます。 XMLの軽微なエラーの場合、Wordはドキュメントにエラーが含まれていることを警告しますが、エラーを修正することも提案します。 文書が完全に誤って組み立てられている場合、Wordは呪いをかけ、開くことを拒否します。



テキストを挿入



必要なXMLテキストを取得するために、同じラマーアプローチを使用しました。Wordでテキストを入力し、内部を抽出して学習しました。 通常の段落で取得したXMLは次のとおりです。

 <w:pw:rsidR="00BB20FC" w:rsidRPr="00357A74" w:rsidRDefault="00357A74" w:rsidP="00BB20FC"> <w:pPr> <w:jc w:val="left"/> <w:rPr> <w:sz w:val="28"/> <w:lang w:val="en-US"/> </w:rPr> </w:pPr> <w:rw:rsidRPr="00357A74"> <w:rPr> <w:sz w:val="28"/> <w:lang w:val="en-US"/> </w:rPr> <w:t>{TEXT}</w:t> </w:r> </w:p>
      
      





必要な配置とテキストサイズを取得するためにを変更する必要があるを理解するのは簡単です。 テキストをw:tタグに挿入しますが、改行はしません!

クラスにassignメソッドを導入すると、ジェネレーターは次のようになります。

 class Word extends ZipArchive{ //      private $files; //    public $path; //   protected $content; public function __construct($filename, $template_path = '/template/' ){ //    $this->path = dirname(__FILE__) . $template_path; //     ,   . if ($this->open($filename, ZIPARCHIVE::CREATE) !== TRUE) { die("Unable to open <$filename>\n"); } //   $this->files = array( "word/_rels/document.xml.rels", "word/theme/theme1.xml", "word/fontTable.xml", "word/settings.xml", "word/styles.xml", "word/stylesWithEffects.xml", "word/webSettings.xml", "_rels/.rels", "docProps/app.xml", "docProps/core.xml", "[Content_Types].xml" ); //      foreach( $this->files as $f ) $this->addFile($this->path . $f , $f ); } //   public function assign( $text = '' ){ //    $p = file_get_contents( $this->path . 'p.xml' ); //       $text_array = explode( "\n", $text ); foreach( $text_array as $str ) $this->content .= str_replace( '{TEXT}', $str, $p ); } //   public function create(){ //   $this->addFromString("word/document.xml", str_replace( '{CONTENT}', $this->content, file_get_contents( $this->path . "word/document.xml" ) ) ); $this->close(); } } $w = new Word( ".docx" ); $w->assign(' .   .'); $w->create();
      
      





それは基本的にそれです。 次回は画像を埋め込む方法を学びます。

シンプルでしょ? 例付きのすべてのコード

UPD。 コードを強調表示しました。

UPD 2.続きを読む。



All Articles