【问题标题】:Can't download a PDF generated with TCPDF using AJAX无法使用 AJAX 下载使用 TCPDF 生成的 PDF
【发布时间】:2016-09-29 06:55:57
【问题描述】:

我想获取 HTML 文件的 PDF,我正在使用 TCPDF 生成 PDF 和 AJAX 来发送信息。现在,我只是想在页面上获取一个 SVG 的 PDF,完成后我会做剩下的。

问题是 TCPDF 生成 PDF 但不是下载它,而是将它传递给 javascript cosole。当我不使用 AJAX 时,它可以完美运行。

这里是 AJAX 代码:

// Get the d3js SVG element
var tmp  = document.getElementById("elemPD5graf");
var svg = tmp.getElementsByTagName("svg")[0];

// Extract the data as SVG text string
var svg_xml = (new XMLSerializer).serializeToString(svg);  

var j = jQuery.noConflict();
var parameters = { datos : svg_xml };
j.ajax({
    type: 'POST',
    url: 'generarPDF.php',
    data : parameters,
    success: function(result) {
        console.log(result);
    }
});

这里是 PHP 代码:

<?php
// Include the main TCPDF library (search for installation path).
require_once('..\tcpdf\tcpdf.php');
// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// set default header data
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 058', PDF_HEADER_STRING);

// set header and footer fonts
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

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

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

// ---------------------------------------------------------

// set font
$pdf->SetFont('helvetica', '', 10);

// add a page
$pdf->AddPage();

// NOTE: Uncomment the following line to rasterize SVG image using the ImageMagick library.
//$pdf->setRasterizeVectorImages(true);
$svg2 = $_POST['datos'];

$pdf->ImageSVG($file='@'.$svg2, $x=15, $y=30, $w='', $h='', $link='http://www.tcpdf.org', $align='', $palign='', $border=1, $fitonpage=false);

// ---------------------------------------------------------

//Close and output PDF document
$pdf->Output('nuevo.pdf', 'D');
//============================================================+
// END OF FILE
//============================================================+
?>

提前感谢您的帮助。

【问题讨论】:

  • 您是否尝试过保存 pdf 并返回保存文件的 URL,而不是返回 pdf 的内容?
  • @Timothy 使用 PHP 代码上的“输出”方法可以保存 PDF。当我不使用 AJAX 时它可以工作。
  • 您正在使用输出方法'D',这会将文档发送到您的浏览器并开始下载。当您通过 AJAX 调用接收它时,这将不起作用。
  • @Timothy 我应该使用哪个?它应该与“F”一起使用,对吧?
  • 如果你真的想使用 AJAX ,唯一的办法就是将文档保存在你的服务器上并返回 pdf url echo $pdf-&gt;Output('/path/to/pdf/nuevo.pdf', 'F');

标签: javascript php jquery ajax tcpdf


【解决方案1】:
$returnValue = $pdf->Output($name, $destination);

$destination 可以采用以下值之一:

I:将文件内联发送到浏览器(默认)。给出的名字 当一个人在链接上选择“另存为”选项时使用名称 生成 PDF。

D:发送到浏览器并强制下载指定名称的文件 按名称。

F: 以 name 指定的名称保存到本地服务器文件。

S:将文档作为字符串返回(名称被忽略)。

FI:相当于F+I选项

FD:相当于F+D选项

E:将文档返回为 base64 mime 多部分电子邮件附件(RFC 2045)

错误Unable to create output file 表示TCPDF 无法将您的文档写入您的文件夹。在$name 中提供有效路径。

【讨论】:

  • @timothy 您提供的文档链接不再起作用。你能提供一个替代方案吗
  • @Annapurna tcpdf.org/docs/srcdoc/tcpdf/class-TCPDF/#_Output。除了我在此答案中已有的信息之外,我似乎找不到可以提供其他信息的更新 URL。我将从我的答案中删除 URL
【解决方案2】:

由于您的线路,pdf 被打印到 Javascript 控制台

console.log(result);

可能的解决方案:

  • 将 pdf 保存在服务器上的临时文件中,并返回此文件的 URL,然后您将其分配给 location.href
  • 不要使用 Ajax,而是使用 &lt;form&gt;
  • 你可以试试document.write(result)

【讨论】:

  • 如果我尝试使用表单,我会收到一个错误,提示 URL 太长。
  • 也许可以尝试在您的表单中使用method="POST" 而不是GET
  • 这是至关重要的,因为您在 php 脚本中使用了$_POST
【解决方案3】:

我在 POST 调用中尝试下载 PDF 时遇到了同样的问题, 尝试直接调用您的generarPDF.php 页面(使用GET)并且会正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-27
    • 2012-11-13
    • 2014-04-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多