2016-05-17 2 views
0

Я пытаюсь использовать dompdf в моем компоненте Joomla 3, но PDf, который он создает для загрузки, всегда поврежден. Я открыл PDF-файл в текстовом редакторе и обнаружил, что причиной коррупции является то, что он включает в себя все заголовки, ссылки, таблицы стилей и javascript из joomla, хотя я ихорохо передаю html, который мне нужен.dompdf-> поток не работает в joomla

код, я использую в моей точки зрения 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(); 
?> 

Хотя я проходил только HTML Я хотел dompdf-> loadHtml когда вы запускали DOMPDF -> stream, в конечном итоге, используя все joomla html, включая все таблицы стилей, javascript anf more.

Когда я использую dompdf-> output(), чтобы выгрузить вывод в файл, файл на самом деле хорошо, так что это только использование dompdf-> потока, у которого есть проблема.

Код я использовал, чтобы сбросить PDF был вставлен перед командой потока и выглядел следующим образом:

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

Что я могу сделать, чтобы остановить команду $ dompdf-> поток с помощью includding все Joomla html?

Приветствия

+0

Поток $ dompdf->() команда, вероятно, не является источником вашей проблемы. dompdf не завершает обработку скриптов после потока PDF. Как правило, вы увидите такие проблемы, если включена буферизация вывода. Я предполагаю, что либо 1) некоторый контент, не содержащий PDF, фиксируется в выходном буфере до того, как dompdf передает PDF; или 2) Joomla делает что-то после выполнения dompdf. Один из способов проверить это - очистить выходной буфер до рендеринга и выхода() после вызова метода потока. – BrianS

ответ

1

Я установил свой вопрос, используя дополнительный файл в моем Compnent, но не загрузки страницы в Joomla (чтобы избежать дополнительных заголовков и т.д.).

Так что мое решение (в случае, если кто-то хочет сделать то же самое) является:

  1. Использование ob_start, ob_flush и ob_end_clean в первоначальном виде, чтобы захватить HTML я хочу использовать в формате PDF.
  2. Создайте форму внизу страницы, в которой urlencodes данные, которые я хочу, и размещаю эти данные на новую страницу (COPMPONENT/libraries/downloadfile.php в моем случае).
  3. Форма отправляет данные на новую страницу, и новая страница просто генерирует 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(), а затем в ob_get_contents, где я храню свой HTML код файл PDF. Затем я использую ob_flush и ob_end_clean, чтобы остановить буферизацию вывода. Вы также можете увидеть, что я urlencode HTML, полученный от ob_get_contents, и передаю его в мою форму внизу страницы. Я также передаю ориентацию и имя через форму (так как все они используются в файле downloadfile.php).

Следующий бит кода - это скачать файл.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

Try очистка выходного буфера перед сбросом выхода, как в примере ниже

<?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(); 
?> 
Смежные вопросы