PDFを生成する別の方法

ghostscriptとInkscapeを使用したPDF生成のトピックに触発されました。



提案されたオプションを見て、私が共有したい非常に興味深いソリューションを思い出しました。



QTを使用したPDF生成





私はPDFが何であるかを繰り返さないでしょう、私はすべてが最新であると思います。 すぐにビジネスに取りかかります。



必要なもの:





-Linuxにアプリケーションをインストールできる専用サーバー。

-qt-webkitモジュールを備えたQT 4.4ライブラリ。 これがアプリケーションの頭脳です。

-ソースコードまたは既にコンパイルされたwkhtmltopdfプロジェクト。 これがアプリの中心です。

-Xvfb Xvfbは小さなXサーバーの代替です。 彼は資源を食べませんが、何も見せません。 ただし、必要な機能は実行します。



ちょっとした理論:





Webkit HTMLレンダリングエンジンを使用してHTMLページをレンダリングし、仮想PDFプリンターに印刷することにより、HTMLからPDFを生成します。



システムを準備します。





1.コンソールアプリケーションがX11への接続を必要としないようにXvfbを起動します

#/ usr / bin / Xvfb:0 -screen 0 1024x768x24 -ac



ここでは、スタートアップ時にこのビジネスを登録する必要がありますが、だれもが異なるLinuxシステムを持ち、これを行うための多くのオプションがあるので、私はアドバイスしません。



2. QTがすでにシステムにインストールされていることを願っています。 また、wkhtmltopdfは、自分の手でダウンロードまたはコンパイルされます。

/ usr / bin / wkhtmltopdfにインストールします



3.テスト。

#DISPLAY = ":0.0" wkhtmltopdf habrahabr.ru habr.pdf



獲得する必要があります:)



シェルを書いています。





Zend Frameworkは現在のプロジェクトを完全に記述するために使用されるため、コンポーネントはそれを拡張したものになります。

これについて詳しく記事全体を書くことができます。 まだそれを掘り下げていない人が、最終的に自分自身でこれを行う力を見つけることを願っています。



クラスは次のとおりです。
<?php



クラス Zfe_PDFGen {



const DISPLAY = ':1.0' ;

const CACHEDIR = '/ application / cache /' ; //ドキュメントルートから

const EXEC = '/ usr / bin / wkhtmltopdf' ;



private $ _source ;



プライベート $ _destination ;



関数 Zfe_PDFGen $ aSource $ aDestination ){



$ this- > setSource $ aSource );

$ this- > setDestination $ aDestination );



}



パブリック関数 setSource $ aSource ){

$ filename = new Zfe_Uuid ();

$ tmpfile = $ _SERVER [ 'DOCUMENT_ROOT' ]。 self :: CACHEDIR $ filename ".html" ;

file_put_contents $ tmpfile $ aSource );

$ this- > _source = $ tmpfile ;

}



パブリック関数 setDestination $ aDestination ){

$ this- > _destination = $ _SERVER [ 'DOCUMENT_ROOT' ]。 $ aDestination ;

}



public function generate (){

$ result = '' ;



$ exec = sprintf 'DISPLAY = "%s"%s%s%s' self :: DISPLAY self :: EXEC $ this- > _source $ this- > _destination );



exec $ exec $ result );



リンク解除 $ this- > _source );



}



}





Zfe_UUidはファイル名( RFC 4122に基づくランダムな一意の識別子)の生成に使用されることに注意してください。確かにそれはありませんが、独自のジェネレータを作成することは難しくないと思います。



使用例

<?php

$ fetchview = new Zend_View ();

$ fetchview- > addScriptPath $ this- > view- > getScriptPaths ());

$ result = $ fetchview- > render 'index / _mailpdfgen.phtml' );



$ data = $ result ;



$ PDF =新しい Zfe_PDFGen $ data '/html/files/test.pdf' );



$ PDF- > generate ();







それだけです



より良い/より便利なものは何ですか? まあ、少なくともPDFがレイアウトデザイナーの「ネイティブ」と「理解可能な」から生成されるという事実。

そして最も重要なことは、生成されたPDFが非常にきれいに見えることです。 速く動作します。



もちろん、短所でも十分です。

-全員が独自のサーバーを持っているわけではありません。

-exec()

-タグなどの画像へのPDFパスのテンプレートでは、完全に記述するか、テンプレートファイルに対して相対的に記述する必要があります。 これは完全に便利ではありません。




All Articles