2012-03-25 52 views
4

我有一个PHP脚本,通过ajax调用被调用。值被发送到这个脚本来建立一个pdf。我想将pdf发送到浏览器,但是由于构建pdf的脚本返回到带有JavaScript的页面,所以我无法看到如何执行此操作。有任何想法吗?ajax调用后发送PDF到浏览器

回答

2

我会推荐一些有点不同。而不是AJAX呼叫重定向到这样一个URL:

./path_to_pdf_script/script.php?param1=val1&param2=val2 

这个脚本将生成的PDF。某处放置在脚本的顶部这个头:

header('Content-type: application/pdf'); 

,只需echo字符串PDF内容是如果你希望用户下载该PDF,而不是看你可以做AJAX调用与发现的例子HERE

从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'); 
?> 
+0

所有这些都是发送PDF文件的常用方式,我认为它可以成为处理问题的首选方式,但它并不回答这个问题。如果PDF是通过AJAX生成的,在网页的后台,那么只有在准备好后才能发送文件? – 2012-03-25 15:59:01

+0

是的,你的权利,因为这可能是一些临时文件会做的伎俩,ajax调用去PDF生成器,它生成PDF并将其保存到临时文件,保存PDF文件名会话,发送回客户端,和从那里重定向到一个从会话中获取文件名的pdf服务器脚本,读取它,提供并删除它 – SinistraD 2012-03-25 19:08:54

2

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

0

Ajax请求不是直接可见的用户,所以一个重定向是毫无意义的

您需要的Ajax返回后,这个PDF加载到现有或新的浏览器窗口。

+1

您是否尝试过在发送一个AJAX重定向头打电话?如果我记得它会重定向浏览器,即使这只是AJAX – SinistraD 2012-03-25 11:28:00

+0

不,因为我认为这很奇怪。根据http://stackoverflow.com/questions/2927044/redirect-on-ajax-jquery-call ajax重定向需要编程 – 2012-03-25 11:38:23

+0

考虑你有两个Ajax调用运行。两者都做重定向。谁应该赢? – 2012-03-25 11:39:50

1

当你发现,你的AJAX调用不能直接输出PDF的浏览器。一种解决方法是删除AJAX并将用户直接发送到生成PDF的页面。这种方法非常常见并且有据可查。但是有一种方法可以使用AJAX生成PDF,以便用户可以保持在网页上,直到文件准备就绪。

你的AJAX调用可以回答一个JSON对象有2个专属领域:

  • “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); 
     } 
    } 
});