最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

php - send pdf to browser after ajax call - Stack Overflow

programmeradmin1浏览0评论

I have a php script that gets called via an ajax call. Values are sent to this script to build a pdf. I want to send the pdf to the browser, but since the script that builds the pdf returns to the page with the javascript I can't see how to do this. Any ideas?

I have a php script that gets called via an ajax call. Values are sent to this script to build a pdf. I want to send the pdf to the browser, but since the script that builds the pdf returns to the page with the javascript I can't see how to do this. Any ideas?

Share Improve this question asked Mar 25, 2012 at 11:21 Errol FitzgeraldErrol Fitzgerald 3,0082 gold badges28 silver badges35 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 2

I would remend something a bit different. Instead of AJAX call make a redirect to an URL like this:

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

This script would be the one which generated the pdf. Place somewhere on top of the script this header:

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

And simply echo the string the pdf content is in. If you want the user to download this pdf instead of viewing you could do the AJAX call with the example found HERE:

from php

If you want the user to be prompted to save the data you are sending, such as a generated PDF file, you can use the » Content-Disposition header to supply a remended filename and force the browser to display the save dialog.

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

You could use an iframe instead of an ajax request and force-download the pdf file.

As you noticed, your AJAX call can't directly output the PDF to the browser. One workaround is to remove AJAX and send the user directly to the page that generates the PDF. This approach is very mon and well documented. But there is a way to use AJAX to generate the PDF, so that the user will stay on the web page until the file is ready.

Your AJAX call could answer with a JSON object with 2 exclusive fields:

  • "pdfurl" if the pdf file was successfully created and written to the disk,
  • "errormsg" if there was an error.

Something like (in PHP):

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

Then the page's javascript could contain (jQuery example):

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

The Ajax request is not direct visible to the user, so a redirect make no sense

You need to load this PDF into an existing or new browser window after the ajax has returned.

发布评论

评论列表(0)

  1. 暂无评论
ok 不同模板 switch ($forum['model']) { /*case '0': include _include(APP_PATH . 'view/htm/read.htm'); break;*/ default: include _include(theme_load('read', $fid)); break; } } break; case '10': // 主题外链 / thread external link http_location(htmlspecialchars_decode(trim($thread['description']))); break; case '11': // 单页 / single page $attachlist = array(); $imagelist = array(); $thread['filelist'] = array(); $threadlist = NULL; $thread['files'] > 0 and list($attachlist, $imagelist, $thread['filelist']) = well_attach_find_by_tid($tid); $data = data_read_cache($tid); empty($data) and message(-1, lang('data_malformation')); $tidlist = $forum['threads'] ? page_find_by_fid($fid, $page, $pagesize) : NULL; if ($tidlist) { $tidarr = arrlist_values($tidlist, 'tid'); $threadlist = well_thread_find($tidarr, $pagesize); // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); } $allowpost = forum_access_user($fid, $gid, 'allowpost'); $allowupdate = forum_access_mod($fid, $gid, 'allowupdate'); $allowdelete = forum_access_mod($fid, $gid, 'allowdelete'); $access = array('allowpost' => $allowpost, 'allowupdate' => $allowupdate, 'allowdelete' => $allowdelete); $header['title'] = $thread['subject']; $header['mobile_link'] = $thread['url']; $header['keywords'] = $thread['keyword'] ? $thread['keyword'] : $thread['subject']; $header['description'] = $thread['description'] ? $thread['description'] : $thread['brief']; $_SESSION['fid'] = $fid; if ($ajax) { empty($conf['api_on']) and message(0, lang('closed')); $apilist['header'] = $header; $apilist['extra'] = $extra; $apilist['access'] = $access; $apilist['thread'] = well_thread_safe_info($thread); $apilist['thread_data'] = $data; $apilist['forum'] = $forum; $apilist['imagelist'] = $imagelist; $apilist['filelist'] = $thread['filelist']; $apilist['threadlist'] = $threadlist; message(0, $apilist); } else { include _include(theme_load('single_page', $fid)); } break; default: message(-1, lang('data_malformation')); break; } ?>