2016-04-26 95 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