WebプロジェクトでのPDFの生成:wkhtmltopdfプログラム

Webプロジェクトで作業する場合、大きなテーブル、数千のポジションの価格表を含むPDFファイルを生成することが必要になる場合があります。 PHPスクリプトからPDFファイルを生成するためのさまざまなライブラリがありました。

•FPDF
•MPDF-任意のhtmlコードからpdfファイルを生成できるFPDFベースのライブラリ
•DOMPDF
•TCPDF

その他の多くのライブラリ。 MPDFライブラリーが最も強力で適切であることが判明しました。また、この場合の重大な欠点ではない場合、最初はキリル文字を正しく使用していました。大きなテーブルと一般に大きなファイルは非常にゆっくり生成されました。 さらに、多くの場合、生成はまったく行われず、スクリプトは504エラーで停止しました。

さらに検索すると、wkhtmltopdfプログラムが見つかりました。 プログラムのウェブサイト: http : //wkhtmltopdf.org

PHPライブラリとは異なり、これは、Linux、Windows、およびその他のオペレーティングシステム用のパッケージおよび実行可能ファイルの形式で配布されるサーバープログラムです。 プログラムはhtmlコード(Webアドレス、ファイルパス、またはコード行の形式)を受け入れ、それに基づいてサーバー上でpdfファイルを生成します。

予備的な経験から、WindowsのローカルXAMPPサーバーでは、300〜500ページの巨大なHTMLテーブルが1〜2秒でPDFファイルに変換されることがわかりました。

CentOs 6にwkhtmltopdfをインストールします
このプログラムを使用するには、webkitとqtが必要です。

そのため、必要な環境とプログラムをサーバーにインストールします。 サーバーにCentOs 6がインストールされているので、ルート権限でサーバーにアクセスして、次のコマンドを実行します。

開発者のサイトからのリンクを使用してwkhtmltopdfプログラムのrpmパッケージを受け取り、本番サーバーにインストールします。

wget download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos6-i386.rpm
yum --nogpgcheck localinstall wkhtmltox-0.12.2.1_linux-centos6-i386.rpm


すべてのパッケージの依存関係が自動的にチェックされ、満たされる必要があります。 何らかの理由で環境が確立されていない場合は、次のコマンドを使用します。

yum install urw-fonts libXext openssl-devel libXrender
yum install xorg-x11-fonts-cyrillic.noarch xorg-x11-fonts-misc.noarch xorg-x11-fonts-truetype.noarch xorg-x11-fonts-100dpi.noarch xorg-x11-fonts-75dpi.noarch fonts-ISO8859-2.noarch fonts-ISO8859-2-100dpi.noarch fonts-ISO8859-2-75dpi.noarch freefont.noarch


最近まで、プログラムはrpmパッケージとして提供されていなかったため、バイナリファイルをコピーして、必要なすべてのパッケージを手動でインストールする必要がありました。

CentOs 6でwkhtmltopdfを使用する
プログラムを起動するための一般的な形式は次のとおりです。

wkhtmltopdf <, .html> <, .pdf>


さらに、このプログラムでは、個別のhtmlファイルからドキュメントのヘッダーとフッターを自動的に埋め込むことができます。 このための構文は次のとおりです。

wkhtmltopdf --header-html <, .html> --footer-html <, .html> <, .html> <, .pdf>


また、プログラムを起動するためのオプションには、結果のPDFファイルのカスタムサイズフィールドがあります。 上下のフィールドで、プログラムはヘッダーとフッターを置き換えます。

wkhtmltopdf --margin-top 35mm --margin-bottom 27mm --margin-left 10mm --margin-right 10mm --header-html <, .html> --footer-html <, .html> <, .html> <, .pdf>


この例では:
•上マージン:35 mm
•下マージン:27 mm
•左右のマージン:各10mm

また、地下のコードの例を示します。 この例では、ページ番号が自動的に生成され、地下室に置き換えられます。 したがって、ドキュメントのページには自動的に番号が付けられます。

//





また、プログラムを起動するための便利なオプションの中には:

-encoding-ソースhtmlファイルのエンコーディングを指定します。例:
--encoding windows-1251


-ページサイズ-ページ形式を指定します。例:
--page-size A4


-向き-ページの向き。例:
--orientation Landscape


このWebプロジェクトでは、pdfファイルを形成するphpページで使用されるphpコードは次のとおりです。
$tmp=time();

$f=fopen(ABSPATH.'/tmp/'.$tmp.'.html','w');
fputs($f, $llg);
fclose($f);

$cd = "cd ".ABSPATH.'/tmp';
exec($cd);
$command = "wkhtmltopdf-i386 --margin-top 35mm --margin-bottom 27mm --margin-left 10mm --margin-right 10mm --footer-html ".ABSPATH."/tpl-sm/pl_pdf/pdf_footer.html --header-html ".ABSPATH."/tpl-sm/pl_pdf/pdf_header.html ".ABSPATH.'/tmp/'.$tmp.'.html'." ".ABSPATH.'/tmp/'."$tmp.pdf";

exec($command);
if (file_exists(ABSPATH.'/tmp/'.$tmp.'.pdf')) {
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="pricelist.pdf"');
readfile(ABSPATH.'/tmp/'.$tmp.'.pdf');
}
unlink(ABSPATH.'/tmp/'.$tmp.'.pdf');
unlink(ABSPATH.'/tmp/'.$tmp.'.html');


このコードでは:
•変数$ llg-価格表のHTMLコードを含む
•ABSPATH定数-サーバー上のWebプロジェクトフォルダーへの絶対パス。
コードは次のことを行います。
•価格表のHTMLコードを一時ファイルに書き込みます。
•一時ディレクトリに移動します。
•必要なオプションを指定してwkhtmltopdfを実行します。
•pdfファイルが正常に作成された場合、ブラウザでユーザーに返され、pricelist.pdfという名前でファイルをダウンロードするように提案します。
•一時ディレクトリから一時HTMLおよびPDFファイルを削除します。

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


All Articles