ODTテンプレートに基づくドキュメントの形成。 ODTからPDF

こんにちは、カブロビテス!

少し前まで、PHPを使用してODTテンプレートに基づいてユーザーデータを使用してドキュメントを生成するという典型的なタスクに直面していました。 非常に些細なことのように聞こえますが、多くの痛みがありました。 事実、利用可能なツールはいずれにせよ、どの方法にも適合しませんでした。 一部のライブラリは曲がってドキュメントを作成し、他のライブラリはロシア語フォントをサポートしていませんでした。他のライブラリはハーレムシェイクスタイルで画像を移動しました。 だから私は「サイクル」しなければなりませんでした。

そのため、タスクの概要:

  1. ODTテンプレートを処理します。 プレースホルダーをカスタム値に置き換えます
  2. PDFに変換します。 ユーザーに表示



ステップ1. ODTテンプレートを処理します。 プレースホルダーを置き換える

ODTがxmlを搭載した通常のアーカイブであることは秘密ではありません。 すべての画像はフォルダに隠されており、その名前は何でもかまいませんが、説明ファイルで参照するだけです。 詳細については説明しません。content.xmlがドキュメントのメインコンテンツを担当し、manifest.xmlが「説明的な」部分を担当していると言えば十分です。 テキストスタイル(少なくともこのタスクのコンテキスト)には興味がないという事実に注目します。 これらのxml'kiをもう少し詳しく調べると、アルゴリズムが出力されます。

  1. アーカイブを解凍します
  2. テキストを置き換えるには、content.xmlを解析し、プレースホルダーを目的の値に置き換えます
  3. 画像の場合:画像をフォルダーにアップロードし(解凍した.odtドキュメント内に作成します)、content.xmlを解析し、フォームのフレーム上のプレースホルダーを置き換えます

    <draw:frame draw:style-name="a0" draw:name="'.$file_name.'" text:anchor-type="as-char" svg:x="0in" svg:y="0in" svg:width="'.$width.'in" svg:height="'.$height.'in" style:rel-width="scale" style:rel-height="scale"> <draw:image xlink:href="'.self::_ImgDir.DIRECTORY_SEPARATOR.$file_name.'" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/> <svg:title/> <svg:desc/> </draw:frame> 


    次に、manifest.xmlの最後にビューブロックを追加します

     <manifest:file-entry manifest:full-path="'.self::_ImgDir.DIRECTORY_SEPARATOR.$file_name.'" manifest:media-type="image/'.$ext.'"/> 

  4. 結果をODTにアーカイブします。


アルゴリズムは明らかに単純化されていますが、効率的で簡単です。 それに基づいて、(ひざまずく)odtFormatクラスが作成されました。 使い方のちょっとした助け:

初期化
 $odtformat = new odtFormat(“$doc_path”, "$temp_dir"); 

$ doc_path-.odtテンプレートへのパス
$ temp_dir-一時ファイルが保存されるフォルダー。

テキスト挿入
 $odtformat->SetText(“$name”, “$value”); 

$ name-プレースホルダーの名前
$値-カスタム値

画像を挿入
 $odtformat->SetImage(“$name”, “$img_path” ,$width, $height); 

$ name-プレースホルダー名
$ img_path-画像へのパス
$ width-ドキュメント内の画像の目的の幅(設定されていない場合は、元の幅)
$ height-ドキュメント内の画像の望ましい長さ(設定されていない場合は、元の長さ)

ドキュメントを保存する
 $odtformat->SaveToDisk(“$path_to_save”); 

$ path_to_save-保存先(パス+ファイル名)

私は他の方法を与えません、すべてがソースで見ることができます。 さらに、補助的な方法のほとんどは公的な情報源から取られています。 また、コード自体は2ペニーのように単純です。 いくつかの設定のみを示します。

 const _SeporatorLeft = '{{'; 

左側のテキストからプレースホルダーを区切ります。

 const _SeporatorRight = '}}'; 

プレースホルダーを右側のテキストから区切ります

 const _ImgDir = 'media'; 

カスタム画像フォルダ名
必要なデータで満たされた.odtファイルは既に生成されていると言えます。 第二段階の時間。

注意! プレースホルダーを正しく置き換えるには、プレースホルダーをドキュメントに追加するときに「フォーマットをクリア」を使用します。 MS World 2013に使用されるクラス。ただし、odtの内容は他のバージョンでも同じであることがわかります。

ステップ2. PDFに変換します。 ユーザーに表示

私は理想的な解決策を見つけられなかったとすぐに言わなければなりません。 実際には解決策はありません。 「インターネット」を破って、一握りのヘビー級、ゼンドローション、そしてただのゴミに出くわした。 それで、私はあなたにすべてをそれがそうであったように伝えます。
まず、オンラインサービスを使用しようとしました。 最初はGoogleドキュメントでした。 ここではすべてが明確です。 iframeを介してページにドキュメントを表示するだけで、変換自体は回避されます。
例:
 <iframe src="http://docs.google.com/viewer?url=http%3A%2F%2F127.0.0.1%2Fa.odt&embedded=true" width="600" height="780" style="border: none;"></iframe> 

短所:

長所:


明らかに、この決定は長くは続かなかった。 Office AppsでMicrosoftを見る価値があります。 興味深いヒントは、pdfを印刷バージョン(オンラインサービスの組み込み機能)として変換することでした。 したがって、Microsoftツールを使用してファイルを変換し、すぐに表示できます。
例:
 <iframe src="http://co1-word-view.officeapps.live.com/wv/WordViewer/request.pdf?WOPIsrc=http%3A%2F%2Fco1%2D15%2Dview%2Dwopi%2Ewopi%2Elive%2Enet%3A808%2Foh%2Fwopi%2Ffiles%2F%40%2FwFileId%3FwFileId%3Dhttp://127.0.0.1/a.odt&type=printpdf" width="600" height="780" style="border: none;"></iframe> 

短所

長所


これ以上価値のあるオンラインオプションが見つからなかったため、サーバーツールを使用することにしました。 Libreofficeはこれをうまく処理します。 コマンドラインから機能する組み込みのドキュメントコンバーターがあります。 アイデアは、生成されたodtをフォルダーにドロップし、それをexecのキーで転送し、同じフォルダーにある既製のpdfを表示することでした。 すでにapt-get install libreofficeを実行したとします。 コードを1行追加するだけです。

 exec(“libreoffice --headless --invisible --convert-to pdf $full_path_to_file --outdir $full_path_to_dir”); 

$ full_path_to_file-ファイルへのフルパス(/var/www/*.odt)
$ full_path_to_dir-保存フォルダーへのフルパス(/ var / www / result /)

iframeでpdfを表示する方法は、あなた自身が知っていると思います。

短所

長所


おわりに
ソリューションのすべての欠点により、目標は達成されました。 この記事がそのようなタスクを実行する際のいくつかの困難を回避するのに役立つことを願っています。 皆さんに幸運を!

参照資料
OdtFormatライブラリ
LibreOfficeについて

PS嫌なフォーマットをおaびします。

Source: https://habr.com/ru/post/J195160/


All Articles