2016-05-17 6 views
0

私はJoomla 3コンポーネントでdompdfを使用しようとしていますが、ダウンロードするために生成するPDfは常に破損しています。私はテキストエディタでPDFファイルを開いて、それが壊れている理由は、私が必要としているHTMLをイオン的に渡しているにもかかわらず、すべてのヘッダー、リンク、スタイルシート、およびjavomriptがjoomlaからであることがわかりました。joomlaでdompdf-> streamが動作しない

私は私のJoomlaのコンポーネントビュー(default.phpテンプレート)で使用しているコードは次のとおりです。

<?php 
defined('_JEXEC') or die('Restricted access'); 
ob_start(); 
?> 
    <div class="qp-div1"> 
    <table class="table table-bordered"> 
     <thead> 
      <tr> 
      <th colspan="2">Account Status</th> 
      </tr> 
     </thead> 
     <tbody> 
     <tr> 
      <th>Reference</th> 
      <td><?php echo $this->userdetails['cardcode']; ?></td> 
     ... more html 
<?php 

require_once('dompdf/autoload.inc.php'); 
use Dompdf\Dompdf; 
$html = ob_get_contents(); 
$dompdf = new Dompdf(); 
$dompdf->setPaper('A4', 'portrait'); 
$dompdf->setBasePath(''); 
$dompdf->loadHtml($html); 
$dompdf->render(); 
$dompdf->stream('order'); 
ob_flush(); 
ob_end_clean(); 
?> 

私はあなたがDOMPDFを実行したときに、私は> loadHtmlをdompdf-したかっただけでHTMLを渡したにもかかわらずそれはすべてのtehスタイルシートを含むすべてのjoomla html、javascriptおよびmoreを使用して終了しました。

出力をファイルにダンプするためにdompdf-> output()を使用すると、ファイルは実際には問題ありません。したがって、問題が発生しているのはdompdf-> streamだけです。

私はPDFファイルをダンプするために使用されるコードは、ストリームコマンドの前に挿入し、このように見えた:

$file_to_save = '/temp/pdf/file.pdf'; 
file_put_contents($file_to_save, $dompdf->output()); 
$dompdf->stream('order'); 

は、私が使用してから$ dompdf->ストリームコマンドを停止するために何かできることはありますincluddingすべてJoomlaのhtml?私は(などの余分なヘッダを避けるために)私のcompnent内の追加ファイルを使用しますが、joomlaのにページをロードしないことで、私の問題を修正しました

乾杯

+0

下記の例のように$ dompdf->ストリームを出力をフラッシュする前に()コマンドは、おそらくあなたの問題の原因ではありません。 PDFをストリーミングした後、dompdfはスクリプトの処理を終了しません。通常、出力バッファリングが有効になっている場合、このような問題が発生します。私の推測では、1)PDF以外のコンテンツがdompdfがPDFをストリームする前に出力バッファに取り込まれているか、または2)Joomlaはdompdfが完了した後に何かをやっている。これをテストする1つの方法は、レンダリングする前に出力バッファをクリーニングし、ストリームメソッドを呼び出した後にexit()することです。 – BrianS

答えて

1

だから私のソリューションは、(場合には他の誰が同じことをやりたい)である:私はPDFファイルで使用するHTMLをキャプチャする元のビューでob_flushとob_end_clean

  1. 使用のob_start、。
  2. 私が望むデータをurlencodeするページの一番下にフォームを作成し、このデータを新しいページ(私の場合はCOPMPONENT/libraries/downloadfile.php)に投稿します。
  3. フォームはデータを新しいページにポストし、新しいページはsimoplyでPDFを生成し、ブラウザに戻してダウンロードします。

これはサーバーに追加のファイルが生成されないため、セキュリティとアクセス許可に問題がありません。 これはまた、ページの下部にあるダウンロードPDFボタン(新しいフォーム内)を最終使用がクリックした場合にのみPDFが生成されることを意味します。次のように

新しいコードは次のとおりです。私の見解で 1.(ファイルTMPL/default.php)

<?php 
defined('_JEXEC') or die('Restricted access'); 
ob_start(); 
?> 
<div class="qp-div1"> 
<table class="table table-bordered"> 
<thead> 
<tr> 
<th colspan="2">Account Status</th> 
</tr> 
</thead> 
<tbody> 
.... more html 
</tbody> 
</table> 
</div> 
<?php 
$html .= ob_get_contents(); 
$html = urlencode($html); 
ob_flush(); 
ob_end_clean(); 
?> 
<form method="POST" action="/components/com_questportal/libraries/downloadfile.php" > 
<input type="hidden" name="dlname" value="<?php echo $this->userdetails['cardcode'] . '_status'; ?>" > 
<input type="hidden" name="dlhtml" value="<?php echo $html; ?>" > 
<input type="hidden" name="dlo" value="landscape" > 
<input type="image" src="/media/com_questportal/images/downloadaspdf.png" alt="Submit"> 
</form> 

だから、これは(のob_startを示して)、私は私のhtmlコードを格納し、その後ob_get_contents PDFファイル。 次に、ob_flushとob_end_cleanを使用して出力のバッファリングを停止します。 また、ob_get_contentsから受け取ったHTMLをurlencodeし、これをページの一番下のフォームに渡すこともできます。 また、私はオリエンテーションと名前をフォーム経由で渡します(これらはすべてdownloadfile.phpファイルで使用されています)。

コードの次のビットは私のフォームから投稿されたdownloadfile.phpです。このページには、非常にシンプルで、ただで構成されています

<?php 
$html = urldecode($_POST['dlhtml']); 
$name = $_POST['dlname']; 
$orientation = $_POST['dlo']; 

require_once('dompdf/autoload.inc.php'); 
use Dompdf\Dompdf; 

$dompdf = new Dompdf(); 
$dompdf->setPaper('A4', $orientation); 
$dompdf->setBasePath(''); 
$dompdf->loadHtml($html); 
$dompdf->render(); 
$dompdf->stream($name); 
?> 

、ユーザーが自分のページの下部にダウンロードPDF画像をクリックしたときだから、downloadfile.phpページをロードし、ブラウザへの出力ストリーム、その後に閉じ(実際にはdownloadfile.phpページは表示されません)。

乾杯

0

てみクリア出力バッファ

<?php 
defined('_JEXEC') or die('Restricted access'); 
    $html = '<div class="qp-div1"> 
    <table class="table table-bordered"> 
     <thead> 
      <tr> 
      <th colspan="2">Account Status</th> 
      </tr> 
     </thead> 
     <tbody> 
     <tr> 
      <th>Reference</th> 
      <td>'.$this->userdetails['cardcode'].'</td> 
     </tr> 
     </tbody> 
     </table>'; 
require_once('dompdf/autoload.inc.php'); 
ob_clean(); 
use Dompdf\Dompdf; 
$dompdf = new Dompdf(); 
$dompdf->setPaper('A4', 'portrait'); 
$dompdf->setBasePath(''); 
$dompdf->loadHtml($html); 
$dompdf->render(); 
$dompdf->stream('order'); 
ob_end_flush(); 
?> 
関連する問題