Php 在ajax调用后将pdf发送到浏览器

Php 在ajax调用后将pdf发送到浏览器,php,javascript,ajax,Php,Javascript,Ajax,我有一个通过ajax调用的php脚本。将值发送到此脚本以生成pdf。我想将pdf发送到浏览器,但由于生成pdf的脚本返回到带有javascript的页面,我看不出如何执行此操作。有什么想法吗?您可以使用iframe而不是ajax请求,并强制下载pdf文件。ajax请求对用户不直接可见,因此重定向没有任何意义 在ajax返回后,您需要将此PDF加载到现有或新的浏览器窗口中。我建议使用一些不同的方法。代替AJAX调用,重定向到URL,如下所示: ./path_to_pdf_script/script

我有一个通过ajax调用的php脚本。将值发送到此脚本以生成pdf。我想将pdf发送到浏览器,但由于生成pdf的脚本返回到带有javascript的页面,我看不出如何执行此操作。有什么想法吗?

您可以使用iframe而不是ajax请求,并强制下载pdf文件。

ajax请求对用户不直接可见,因此重定向没有任何意义


在ajax返回后,您需要将此PDF加载到现有或新的浏览器窗口中。

我建议使用一些不同的方法。代替AJAX调用,重定向到URL,如下所示:

./path_to_pdf_script/script.php?param1=val1&param2=val2
这个脚本就是生成pdf的脚本。将此标题放置在脚本顶部的某个位置:

header('Content-type: application/pdf');
只需
echo
pdf内容所在的字符串。如果希望用户下载此pdf而不是查看,则可以使用以下示例执行AJAX调用:

来自php.net

如果希望提示用户保存正在发送的数据, 如生成的PDF文件,您可以使用»内容处置 标头以提供建议的文件名并强制浏览器 显示“保存”对话框

<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');

// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf
readfile('original.pdf');
?>

正如您所注意到的,AJAX调用无法直接将PDF输出到浏览器。一种解决方法是删除AJAX并将用户直接发送到生成PDF的页面。这种方法非常常见,并且有很好的文档记录。但是有一种方法可以使用AJAX生成PDF,这样用户就可以一直呆在网页上,直到文件准备好

您的AJAX调用可以使用带有2个独占字段的JSON对象进行响应:

  • “pdfurl”如果pdf文件已成功创建并写入磁盘
  • 如果有错误,请输入“errormsg”
类似于(在PHP中):


您是否尝试过在AJAX调用中发送重定向头?如果我没记错的话,它会重定向浏览器,即使只是AJAXNo,因为我觉得这很奇怪。根据ajax重定向需要进行编程,考虑到您正在运行两个ajax调用。两者都执行重定向。谁应该赢?所有这些都是发送pdf文件的常用方式,我认为这可能是处理问题的首选方式,但它不能回答问题。如果PDF是在网页的后台通过AJAX生成的,那么如何在文件准备好后才发送文件?是的,你是对的,因为可能一些临时文件会起作用,AJAX调用PDF生成器,生成PDF并将其保存到临时文件,将PDF文件保存到会话,将ok发送回客户端,然后从那里重定向到一个pdf服务器脚本,该脚本从会话中获取文件名,读取文件名,提供文件名并将其删除
<?php
//...
if (writepdf($filename, ...)) {
    $result = array('pdfurl' => '/files/' . $filename);
} else {
    $result = array('errormsg' => 'Error!');
}
echo json_encode($result);
$.ajax({
    type: "GET",
    url: "ajaxcreatepdf.php",
    data: {userid: 1},
    dataType: "json",
    success: function(data, textStatus) {
        if (data.pdfurl) {
            window.location.href = data.pdfurl;
        }
        else {
            $("#messagebox").html(data.errormsg);
        }
    }
});