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パスのテンプレートでは、完全に記述するか、テンプレートファイルに対して相対的に記述する必要があります。 これは完全に便利ではありません。

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


All Articles