将变量发送到 tcpdf jQuery

Send variable to tcpdf jQuery

我想通过 jQuery 将一些 html 内容发送到 tcpdf 并创建一个 pdf。 我的 index.php:

里有这个
$('#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 它工作完美。似乎出于某种原因,我的 post 没有被 pdf.php 使用...一些想法?

谢谢!

您正在使用

$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 将 link 附加到页面,这不是最佳解决方案,因为它将所有 pdf 文件留在服务器上并且用户只能看到 link 一次。

希望能给你一些想法。

我确实说过我太累了。正如@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 中,而无需任何额外的 [=31] =] 完全没有。