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

send pdf to browser after ajax call

本文关键字:浏览器 pdf 调用 ajax      更新时间:2023-09-26

我有一个php脚本,它通过ajax调用进行调用。将值发送到此脚本以构建pdf。我想把pdf发送到浏览器,但由于构建pdf的脚本返回到带有javascript的页面,我不知道如何做到这一点。有什么想法吗?

我推荐一些不同的东西。代替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');
?>

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

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

AJAX调用可以用一个带有两个独占字段的JSON对象来回答:

  • "pdfurl"如果pdf文件已成功创建并写入磁盘
  • "errormsg"(如果有错误)

类似(在PHP中):

<?php
//...
if (writepdf($filename, ...)) {
    $result = array('pdfurl' => '/files/' . $filename);
} else {
    $result = array('errormsg' => 'Error!');
}
echo json_encode($result);

然后页面的javascript可以包含(jQuery示例):

$.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);
        }
    }
});

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

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