2013-09-16 3 views
1

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

('#button').click(function() { 
    var quizid = <?php echo json_encode($quizid); ?>; 
    var chart = Highcharts.charts[0]; 

    canvg(document.getElementById('canvas'), chart.getSVG()) 

    var canvas = document.getElementById("canvas"); 
    var img = canvas.toDataURL("image/png"); 

    //document.write('<img src="'+img+'"/>'); 

    // AJAX CALL TO ACTION 
    $.ajax({ 
     url: '/results/savepdf', 
     type:"POST", 
     data: {quizid: quizid, image: img}, 
     success: function(data) { 
      console.log("ajax call succces"); 
     }, 
     error: function (xhr, ajaxOptions, thrownError) { 
      alert(xhr.status); 
      alert(thrownError); 
     } 
    }); 

}); 

В моем действии у меня есть:

public function savepdfAction(){ 
    $this->_helper->layout->disableLayout(); 
    $this->_helper->viewRenderer->setNoRender(); 

    if(isset($_POST['quizid'])) 
     $quizid = $_POST['quizid']; 
    if(isset($_POST['image'])) 
     $image = $_POST['image']; 

    // SAVE THE PDF OR WORD 

    // INCLUDE TCPDF LIBRARY 
    require_once 'tcpdf/tcpdf.php'; 

    try { 
     // create new PDF document 
     $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 

     $pdf->SetCreator(PDF_CREATOR); 
     $pdf->SetAuthor('Nicola Asuni'); 
     $pdf->SetTitle('TCPDF Example 009'); 
     $pdf->SetSubject('TCPDF Tutorial'); 
     $pdf->SetKeywords('TCPDF, PDF, example, test, guide'); 

     $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 009', PDF_HEADER_STRING); 

     $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); 
     $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); 

     $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); 

     $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); 
     $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); 
     $pdf->SetFooterMargin(PDF_MARGIN_FOOTER); 

     $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); 

     $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 

     $pdf->AddPage(); 

     $pdf->setJPEGQuality(75); 

     $imgdata = base64_decode('iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABlBMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDrEX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg=='); 

     $pdf->Image('@'.$imgdata); 

     $pdf->Image('/images/logo.png', 25, 40, 154, 25, 'PNG', 'http://www.surveyanyplace.com', '', true, 150, '', false, false, 1, false, false, false); 

     $horizontal_alignments = array('L', 'C', 'R'); 
     $vertical_alignments = array('T', 'M', 'B'); 

     $pdf->Output('example_009.pdf', 'I'); 

    } 
    catch (Exception $e) { 
     die ('Application error: ' . $e->getMessage()); 
    } 
} 

Как вы можете видеть, что я просто хочу, чтобы показать PDF-файл без параметров, которые были (просто для проверки).

Это не работает ....

Когда я пытаюсь это без Ajax называют это работает отлично ...

Я получил этот ответ:

TCPDF ERROR: Some data has already been output, can't send PDF file

Я искал ошибка и прочитайте, что вы можете исправить это, поставив ob_end_clean(); перед вашим $pdf->Output('example_009.pdf', 'I');. И когда я сделал это, я получил еще один ответ, что вы можете посмотреть here.

ответ

1

Поскольку файл .pdf представляет собой двоичные данные, вы не должны использовать запрос Ajax. После быстрого поиска я нашел этот JQuery плагин:

Это очень малая функция и создает временную форму со скрытыми полями, оно утверждает. Возможно, это не самое красивое решение, но оно должно работать. Не проверял его, хотя ...

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