私は Symfony 1.4 プロジェクトに取り組んでいます。(まだ) 生成されたバウチャーの PDF ダウンロード リンクを作成する必要がありますが、少し混乱しています。バウチャーの HTML/CSS は既にあります。右側のビューにダウンロード ボタンを作成しましたが、そこからどこに移動すればよいかわかりません。
4 に答える
Use Mpdf to create the pdf file
http://www.mpdf1.com/
しばらく wkhtmltopdf を使用していましたが、1) いくつかの重大なバグがあり、2) 進行中の開発が遅くなったため、使用をやめました。私は、機能性と有効性の点ではるかに優れていることが証明されているPhantomJSに移行しました。
マシンに wkhtmltopdf や PhantomJS のようなものがあれば、HTML ページを生成して渡す必要があります。PhantomJS を使用していると仮定した例を示します。
最初に、テンプレートに必要なすべてのリクエスト パラメータを設定します。
$this->getRequest->setParamater([some parameter],[some value]);
次に、関数を呼び出してgetPresentation()
、テンプレートから HTML を生成します。これにより、特定のモジュールとアクションの結果の HTML が返されます。
$html = sfContext::getInstance()->getController()->getPresentation([module],[action]);
HTML ファイル内の相対 CSS パスを絶対 CSS パスに置き換える必要があります。たとえば、実行しpreg_replace
ます。
$html_replaced = preg_replace('/"\/css/','"'.sfConfig('sf_web_dir').'/css',$html);
HTML ページをファイルに書き込み、PDF に変換します。
$fp = fopen('export.html','w+');
fwrite($fp,$html_replaced);
fclose($fp)
exec('/path/to/phantomjs/bin/phantomjs /path/to/phantomjs/examples/rasterize.js /path/to/export.html /path/to/export.pdf "A3");
次に、PDF をユーザーに送信します。
$this->getResponse()->clearHttpHeaders();
$this->getResponse()->setHttpHeader('Content-Description','File Transfer');
$this->getResponse()->setHttpHeader('Cache-Control','public, must-revalidate, max-age=0');
$this->getResponse()->setHttpHeader('Pragma: public',true);
$this->getResponse()->setHttpHeader('Content-Transfer-Encoding','binary');
$this->getResponse()->setHttpHeader('Content-length',filesize('/path/to/export.pdf'));
$this->getResponse()->setContentType('application/pdf');
$this->getResponse()->setHttpHeader('Content-Disposition','attachment; filename=export.pdf');
$this->getResponse()->setContent(readfile('/path/to/export.pdf'));
$this->getResponse()->sendContent();
ヘッダーを設定する必要があります。そうしないと、ブラウザーが奇妙なことを行います。2 人のユーザーが同時に PDF バウチャーを生成する状況を回避するために、生成された HTML ファイルとエクスポートのファイル名は一意である必要があります。sha1(time())
ランダム化されたハッシュを標準名に追加するようなものを使用できます。'export_'.sha1(time());
可能であれば、 wkhtmltopdfを使用してください。これは、php コーダーが使用できる最高の html2pdf コンバーターです。
次に、次のようなことを行います (テストされていませんが、かなり近いはずです)。
public function executeGeneratePdf(sfWebRequest $request)
{
$this->getContext()->getResponse()->clearHttpHeaders();
$html = '*your html content*';
$pdf = new WKPDF();
$pdf->set_html($html);
$pdf->render();
$pdf->output(WKPDF::$PDF_EMBEDDED, 'whatever_name.pdf');
throw new sfStopException();
}