【问题标题】:View pdf report from ajax request从 ajax 请求查看 pdf 报告
【发布时间】:2018-02-01 13:34:19
【问题描述】:

我在使用 TCPDF 库生成 pdf 时遇到问题,并尝试按照此处的一些示例进行操作,但我没有设法解决我的问题,即:当我单击按钮时,我正在制作 AJAX request 发送一个参数,url指向一个带有CODEIGNITER的php控制器,该参数用于执行我的查询并基于它生成报告。我已经用静态参数调试了报告,看看它是否工作并且没有使用 AJAX,一切都很顺利。问题是我需要以这种方式发送数据,但我不知道如何加载在我的请求响应中创建的 pdf 文件,有什么想法吗?

$("#BtnDownload").click(function (){
    var jsonString = 2; //Example parameters;
        $.ajax({
          type: 'POST',
          url: baseurl+"reports/selectReport",
          data: {'data': jsonString},
          success: function(response){
           //What my driver should return
          }
        });
 });

这是我的控制器中我指向我的ajax请求的功能,我没有把我的报告布局的所有代码都放上,因为它正在工作,而且代码很长,重要的是要知道如何返回我生成的报告并可以从浏览器中查看。

public function selectReport(){
      $this->load->library('Pdf');
        $pdf = new Pdf('L', 'mm', 'A4', true, 'UTF-8', false);
        $pdf->SetCreator(PDF_CREATOR);
        $pdf->SetTitle('report');
        $pdf->SetSubject('Report PDF');
        $pdf->SetKeywords('TCPDF, PDF, example, test, guide');
        $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
        $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
        $pdf->setPrintHeader(false);
        $pdf->setFooterData($tc = array(0, 64, 0), $lc = array(0, 64, 128));
        $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
        $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
        $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
        $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
        $pdf->SetFont('dejavusans', '', 12, '', true);
        
        $base_url = base_url();
        $data = $this->input->post("data");

        // report body

      
        $name_pdf = utf8_decode("report.pdf");
        $pdf->Output($name_pdf, 'I');
    }

【问题讨论】:

  • 不要发回 PDF。发回 PDF 的 URL。然后重定向到 URL,或者任何你的船。
  • 能否举例说明您的评论
  • 我举了一个例子来说明我的意思。我希望你觉得它有用。

标签: javascript php jquery ajax codeigniter


【解决方案1】:

在 TCPDF 中(根据 TCPDF Save file to folder? )可以保存 PDF:

$dir = 'pdfs/';
$filename = 'report' . microtime(TRUE) . '.pdf';

if( ! is_dir( FCPATH . $dir ) )
    mkdir( FCPATH . $dir, 0777, TRUE );

$pdf->Output( FCPATH . $dir . $filename, 'F'); // F saves to filesystem

既然您知道 PDF 位于 pdf 目录中:

$this->load->helper('url');
echo json_encode(array(
    'path' => FCPATH . $dir . $filename,
    'url'  => base_url( $dir . $filename )
));

那么在你的 ajax 成功函数中 data.url 就是文件的 URL:

success: function(response){
    if( response.url ){
        window.location = response.url;
    }
}

确保您的 $.ajax 具有 dataType: 'json' 的配置。

$.ajax({
    // ...
    dataType: 'json'
    // ...
});

【讨论】:

  • 看不懂FCPATH的操作,加上我的base_url
  • 是的,你是对的。对不起,那不属于。我确定了我的答案。 FCPATH 仅适用于保存它的文件位置。 URL 不应该在那里。
  • 现在什么都没有发生......我在我的ajax成功中创建了一个console.log,但什么也没做,
  • 仅供参考,如果 pdfs 目录不存在,则会出现错误。创建 pdfs 目录,然后重试。
  • 如果文件夹存在 .. 并检查所有内容,因为我删除了 FCPATH,当我仍然重定向到错误的错误 url 时,什么也没有发生 .. 但现在它什么也不做
猜你喜欢
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多