【发布时间】:2012-03-25 11:21:34
【问题描述】:
我有一个通过 ajax 调用调用的 php 脚本。将值发送到此脚本以构建 pdf。我想将 pdf 发送到浏览器,但是由于构建 pdf 的脚本返回到带有 javascript 的页面,所以我看不到如何执行此操作。有什么想法吗?
【问题讨论】:
标签: php javascript ajax
我有一个通过 ajax 调用调用的 php 脚本。将值发送到此脚本以构建 pdf。我想将 pdf 发送到浏览器,但是由于构建 pdf 的脚本返回到带有 javascript 的页面,所以我看不到如何执行此操作。有什么想法吗?
【问题讨论】:
标签: php javascript ajax
我会推荐一些不同的东西。而不是 AJAX 调用重定向到这样的 URL:
./path_to_pdf_script/script.php?param1=val1¶m2=val2
这个脚本将是生成 pdf 的脚本。将此标题放在脚本顶部的某个位置:
header('Content-type: application/pdf');
只需echo pdf 内容所在的字符串。如果您希望用户下载此 pdf 而不是查看,您可以使用找到的示例进行 AJAX 调用 HERE:
来自 php.net
如果您希望提示用户保存您发送的数据, 例如生成的 PDF 文件,可以使用 » Content-Disposition 标头提供推荐的文件名并强制浏览器 显示保存对话框。
<?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 调用可以使用具有 2 个专有字段的 JSON 对象进行应答:
类似(在 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 加载到现有或新的浏览器窗口中。
【讨论】: