2015-05-05 2 views
4

EDIT: DOMPDF не является обязательным. Любое другое решение для печати PDF-файла из DIV приветствуется.создать PDF-файл из одного DIV

У меня есть веб-приложение, основанное на одной странице DOM, которая загружается один раз при входе в систему.

Затем каждое действие на странице вызывает некоторый div для загрузки различных содержимого и страниц php для взаимодействия с mysql с использованием PDO и AJAX.

Мой вопрос заключается в следующем:

Каждая страница PHP отзовется только HTML, который должен вписываться в этой конкретной DIV.

Одним из требований пользователя является возможность распечатки PDF с учетом только конкретного DIV (основного с содержимым). Я выбрал DOMPDF для выполнения задания, но для его выполнения требуется действительная разметка html, а не только раздел.

Моей идеей было бы: добавив флажок, чтобы выбрать формат PDF. Я использую один и тот же вызов ajax, но перенаправляю его на новую страницу php, которая будет отражать полную разметку html.

Дело в том, что результат должен открываться на новой странице (или в iframe ??), которая должна быть правильно проанализирована DOM PDF.

Как это получить?

Мой фактический AJAX вызов:

$('#livesearch').on("click",'a', function(event){ 
    event.preventDefault(); 
    var tip = $(this).attr("href"); 
    var descr = $(this).text(); 
    $('#anag_search').val(descr); 
    $('#livesearch').hide(); 
    if ($('#pdfprint').prop('checked')) { 
     $('#upper').load('sofferenze/soff_pdf.php?soff='+tip);  
    }else{ 
     $('#upper').load('sofferenze/soff.php?soff='+tip);  
    } 

}); 

Это загружает страницу soff_pdf.php в том же DIV как нормального АЯКС вызова.

Как сказать «открыть в новом окне»? Или есть лучший способ получить то, что я ищу? soff_pdf.php (соответствующая часть):

<?php 
require '../../session_handler.inc.php'; 
require_once '../../global_functions.php'; 
require_once '../../dompdf/dompdf_config.inc.php'; 
session_start(); 
$actusr = $_SESSION['id']; 
$id_soff = $_GET['soff']; 
$soff_name = soff2name($id_soff,$pdo); 
//query to fetch data are here 
?> 
<?php ob_start(); ?> 
<!DOCTYPE html> 

<html> 
    <head> 
<meta content="charset=utf-8" /> 
<title>DEVELOPMENT SYSTEM</title> 
<link rel="stylesheet" type="text/css" href="../../css/style.css" media="screen" /> 
<link rel="stylesheet" type="text/css" href="../../css/style_print.css" media="print"/> 
<script type="text/javascript" src="../../js/jquery-1.9.1.min.js"></script> 
</head> 
<body> 
<br><br> 
<div id="accordion"> 
    <h3>Crediti inclusi nella sofferenza</h3> 
    <div> 
    <table class="report"> 
     <caption class="report">Crediti Chirografari</caption> 
     <thead> 
     <tr> 
      <!--<th class="report">Codice</th>--> 
      <th class="report">Sofferenza</th> 
      <th class="report">GBV</th> 
      <th class="report">Data GBV</th> 
      <th class="report">Titolare</th> 
      <th class="report">Serie</th> 
      <th class="report">Data Acq.</th> 
      <th class="report">Cedente</th> 
      <th class="report">Tipo</th> 
      <th class="report">Originator</th> 
       <th class="report">Stato</th> 
     </tr> 
     </thead> 
     <tbody> 
     <?php if(count($crediti_chiro) >0){ foreach($crediti_chiro as $credito_chiro){ ?> 
     <tr> 
      <!--<td class="report"><?php //echo $credito_chiro['id_cre']; ?></td>--> 
      <td class="report"><?php echo soff2name($credito_chiro['cod_soff'],$pdo); ?></td> 
      <td class="report"><?php echo num2cur($credito_chiro['gbv_tot']); ?></td> 
      <td class="report"><?php echo mysql2table($credito_chiro['gbv_data']); ?></td> 
      <td class="report"><?php echo get_name('veicoli',$credito_chiro['titolare'],'nome',$pdo); ?></td> 
      <td class="report"><?php echo get_name('serie',$credito_chiro['cod_serie'],'serie',$pdo); ?></td> 
      <td class="report"><?php echo mysql2table($credito_chiro['data_acq']); ?></td> 
      <td class="report"><?php echo prot2name($credito_chiro['cedente'],$pdo); ?></td> 
      <td class="report"><?php echo get_name('diz_cred',$credito_chiro['tipo'],'descrizione',$pdo); ?></td> 
      <td class="report"><?php echo prot2name($credito_chiro['originator'],$pdo); ?></td> 
      <td class="report"><?php echo $credito_chiro['stato']; ?></td> 
     </tr> 
     <?php }}else{ ?> 
      <td class="report" colspan="10">Nessun credito chirografario caricato</td> 
     <?php }?> 
     </tbody> 
    </table> 
<br><br> 

</div> 
<!-- more html here --> 
</body></html> 
<?php 

$html = ob_get_clean(); 
$dompdf = new DOMPDF(); 
$dompdf->load_html($html); 
$dompdf->render(); 
$dompdf->stream("sample.pdf"); 

?> 
+0

Вы действительно не делаете ajax. –

+0

Возможный дубликат [Открыть URL-адрес в новой вкладке с помощью JavaScript] (http://stackoverflow.com/questions/4907843/open-a-url-in-a-new-tab-using-javascript) –

+0

Хорошо, но это не главное. Я динамически загружаю фрагмент HTML вместо полной DOM на другую страницу. –

ответ

1

Предполагая, что вы открываете всплывающее окно или новую вкладку или все, что вы предпочитаете стороне клиента, и вы хотите повторно использовать один и тот же сценарий, который уже перекликается ваш HTML:

if ($create_pdf_flag) ob_start(); 

echo 'some html...'; 
echo 'some more html...'; 
echo 'some other html...'; 
echo 'yet some more html...'; 

if ($create_pdf_flag) { 
    $contents = ob_get_contents(); 
    ob_end_clean(); 

    $html = file_get_contents('/path/to/your/template.html'); 
    $html = str_replace('{contents}', $contents, $html); 

    $DOMPDF = new DOMPDF(); 
    $DOMPDF->load_html($html); 
    $DOMPDF->render(); 
    $DOMPDF->stream('Filename.pdf', array(
     'compress'  => 1, 
     'Attachment' => 0 
    )); 
} 

шаблон может быть как-то просто, как:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>PDF Output</title> 
     <style> 
      /* your style here */ 
     </style> 
    </head> 
    <body> 
     {contents} 
    </body> 
</html> 

EDIT: не Ok, я видел ваш код не w, то вы можете легко адаптировать мой пример к вашему делу. Вы можете передать $create_pdf_flag в качестве параметра $_GET или $_POST, и вы можете использовать тест

<?php if ($create_pdf_flag) { ?> 
    some html here 
<?php } ?> 

несколько раз, чтобы уменьшить HTML.

+0

Это может быть допустимым решением. Что вы посоветуете на стороне клиента? Iframe или новое окно или что-то, что мне нравится, причина не лучшее решение :)? –

+1

Вы ответили самим себе :) Лично я предпочитаю новую вкладку, потому что она оставляет пользователю (или пользовательскому браузеру) решение открыть или сохранить pdf. – Eggplant

Смежные вопросы