2016-04-26 103 views
0

我想通過jQuery發送一些html內容到tcpdf並創建pdf。 我有這個在我的index.php:發送變量到tcpdf jQuery

$('#test').click(function() { 
    var result='hello'; 
    $.ajax({ 
    type: 'POST', 
    url: 'pdf.php', 
    data: {result: result},   
    }); 
}) 

和pdf.php:

<?php 
$result = ''; 
if(isset($_POST['result'])) { 
    $result = $_POST['result']; 
} 

require_once('tcpdf/tcpdf.php'); 
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 
$pdf->SetCreator(PDF_CREATOR); 
$pdf->SetTitle('Production sheet'); 
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH); 
$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->SetFont('helvetica', '', 9); 

$pdf->AddPage(); 

$html = ' 
     <h1>TEST</h1> 
     <table> 
     <tr><td>'.$result.'</td></tr>   
     </table>  
     '; 
$pdf->writeHTML($html, true, 0, true, 0); 
$pdf->lastPage(); 
$pdf->Output('test.pdf', 'I'); 
?> 

如果我定義變量結果($result = "Hello";)和我直接運行pdf.php它的工作完美。似乎由於某種原因,我的文章沒有被pdf.php採納......有一些想法?

謝謝!

+0

代碼確實看起來正確。您是否試圖在訪問tcpdf之前回顯$ result以檢查它是否正確傳遞?我可能太累了,但在代碼中看不到任何錯誤。 –

+0

'alert(result);'正確顯示。如果我添加'成功:函數(數據){$('#testDiv')。html(數據);}'顯示我的變量'hello'...這裏有一些奇怪的... –

+0

謝謝大家的幫助。埃米爾的回答做到了。 –

回答

1

我說過我太累了。正如@andrew指出的,你使用內聯輸出而不是下載,並且在Ajax調用中不會真正起作用。通過評論閱讀,如果你想下載的PDF和POST值,這裏是我的建議:

1)在你的HTML

<form action='pdf.php' method=post target=_blank id=myform> 
</form> 

2)創建一個表單,如果你需要使用Javascript添加數據然後更改您的jQuery代碼如下:

$('#test').click(function() { 
    var result='hello'; 
    $("#my_form").append("<input type=hidden name=result value='"+result+'>"); 
    $("#my_form").submit(); 
}); 

3)調整pdf。PHP使用$_POST而不是$_GET

你應該考慮你是否真的需要一個jQuery。如果javascript中的result變量從用戶輸入的表單值中填充,那麼您可能只需重新設計頁面並將所有內容包含在form中,而不需要任何額外的jQuery。

0

您使用

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

I意思目的地:在線。見manual

你要麼必須使用選項F並在服務器上指定一個文件名,然後將用戶重定向到文件名或使用選項D強制進行下載。

喜歡的東西:

$('#test').click(function() { 
    var result='hello'; 
    window.open('/pdf.php?result='+result, '_blank'); 
}); 

而且

<?php 
$result = ''; 
if(isset($_GET['result'])) { 
    $result = $_GET['result']; 
} 

..... 

$pdf->Output('test.pdf', 'D'); 

編輯

對於大量你會更好地使用你正在試驗的AJAX方法的數據,但處理ajax響應中返回的pdf文檔將會非常棘手,它可能適用於javascript file reader

正如簡單的選擇會是這個樣子:

$('#test').click(function() { 
    var result='hello'; 
    $.ajax({ 
    type: 'POST', 
    url: 'pdf.php', 
    data: {result: result},   
    }).done(function(filename){ 
     $('#testDiv').html('<a target="_blank" href="/'+filename+'">download your pdf</a>'); 
    }); 
}) 

而且

<?php 
$result = ''; 
if(isset($_POST['result'])) { 
    $result = $_POST['result']; 
} 

.... 

$filename = time().'.pdf'; 
$pdf->Output($filename, 'F'); 
echo $filename; 

有啥使用發生的是你在服務器上創建PDF文件,並附加一個鏈接頁面ajax,它不是最好的解決方案,因爲它會將所有pdf文件保留在服務器上,用戶只能看到鏈接一次。

儘管應該有希望給你一些想法。

+0

謝謝。它正在工作。但$ _GET可以處理大量數據? –

+0

你好事是爲了測試目的。真正的數據更大,我認爲它是POST的唯一有效解決方案。我已經嘗試過選項D,但它不下載更... –

+0

我編輯的答案,應該希望給你一些什麼可以做的想法 – andrew