【问题标题】:Display PDF using an AJAX call使用 AJAX 调用显示 PDF
【发布时间】:2013-01-11 14:46:54
【问题描述】:

我正在尝试通过 AJAX 调用显示 PDF(在服务器端创建并作为 Web 流传递到客户端)。我的代码如下:

jQuery.ajax({
    type: "POST",
    processData: false,
    url: "aaaa.p?name=pdf",
    data: inputxml,
    contentType: "application/xml; charset=utf-8",
    success: function(data)
    {
      // here the data is the PDF stream i'm getting from the server side. 

    }
});

“inputxml”包含服务器创建 PDF 的输入参数。以及包含 PDF 流的成功函数中的“数据”。有没有什么方法可以在 AJAX 调用的成功函数中在浏览器上打开 PDF 文件而不进行任何页面提交?在服务器端,PDF 也不是物理生成的。非常感谢您的帮助....

【问题讨论】:

    标签: jquery ajax pdf


    【解决方案1】:

    对于任何偶然发现这一点的人。下面是一个使用 axios 的例子

    1. responseType 必须是 'arrayBuffer'
    2. 根据响应创建 Blob 对象
    3. 从可以加载到 iframe 中的 blob 创建一个“对象 url”

          axios({
              url: `path/to/pdf`,
              method: "GET",
              responseType: 'arraybuffer'
          }).then((response) => {
              let blob = new Blob([response.data], { type: response.headers['content-type'] } );
              let url = window.URL.createObjectURL(blob);
      
              $('#frame').attr('src',url);
          });
      

    【讨论】:

    • 你拯救了我的一天!谢谢!
    【解决方案2】:

    为什么要通过 AJAX 加载它?为什么不将它加载到您在需要时生成的 IFRAME 中。标准浏览器插件将在该 Iframe 中显示它。

    $('#link').click(function(e) {
        e.preventDefault(); // if you have a URL in the link
        jQuery.ajax({
            type: "POST",
            processData: false,
            url: "aaaa.p?name=pdf",
            data: inputxml,
            contentType: "application/xml; charset=utf-8",
            success: function(data)
            {
                var iframe = $('<iframe>');
                iframe.attr('src','/pdf/yourpdf.pdf?options=first&second=here');
                $('#targetDiv').append(iframe);
            }
        });
    });
    

    【讨论】:

    • 感谢您的快速回复。你能给我一些工作的例子吗?
    • 我添加了一些东西。 inputxml 必须转换为 URL 请求的参数,但这应该不是问题。
    • 感谢您的回复,但问题是 inputxml 有点大并且包含大量数据。我认为不可能将其作为查询字符串放到 URL 中。
    • 然后您可以通过 AJAX 发送 inputxml,当服务器告诉您一切正常时,您可以插入 iframe。在另一篇文章的评论中,您说 xmldata 和 pdf 不相关,所以这应该有效。
    • 是的。而不是 iframe.attr('src','/pdf/yourpdf.pdf?options=first&second=here');我可以将 AJAX 成功函数的返回值添加到 iFrame 中吗? (而不是指定 src,因为响应不包含任何 URL,而只包含 PDF 流)
    【解决方案3】:

    这是我处理这个问题的方法。它基于此 pdfmake 文件 (https://github.com/bpampuch/pdfmake/blob/master/src/browser-extensions/pdfMake.js) 的第 50 行。

    1. 假设您有一个 pdf 流,我将其转换为 base64 并将其回显到我的 AJAX:

      $pdfString = $mpdf->Output('', 'S');
      $pdfBase64 = base64_encode($pdfString);
      echo 'data:application/pdf;base64,' . $pdfBase64;
      
    2. 这是我的 AJAX 代码。接收数据时,它会打开一个新窗口并将 url 替换为 base64 ended 数据:

      var ajaxRequest = $.ajax({
          url: "php/generate-pdf/print-control.php",
          data: '',
          cache: false,
          contentType: 'application/json',
          processData: false,
          type: 'POST'
      
      });
      $.when(ajaxRequest).done(function (ajaxValue) {
          var win = window.open('', '_blank');
          win.location.href = ajaxValue;
      });
      

      这种方法的缺点是你会在地址栏中得到一个base64字符串。

    【讨论】:

    • 非常感谢!!!经过一天的搜索,这是唯一不显示空白pdf的答案:)
    • 这个答案应该是被接受的。它解决了我的问题,因为我总是使用 GET 来渲染带有 html2canvas 图像的 PDF。由于 GET 不能容纳 base64 编码图像的长度,我做了一个粗略的解决方法来让它工作,直到我看到这个。 :)
    • 非常感谢。与 download.js 结合使用时效果很好$.ajax({... success: function(data) {download(data, "test.pdf", "application/pdf");}); 请参阅download.js 的二进制部分
    【解决方案4】:

    您可以生成一个临时 URL 来访问存储在服务器上的 PDF 文件,而不是将其发送回 AJAX 调用。只需将生成的 URL 传递回客户端即可。然后,当您收到 URL 时,您可以执行 window.location = 以将浏览器重定向到下载。

    确保为生成的文件(Content-Disposition: attachment 等)设置了正确的标题,一切都应该没问题。

    编辑:虽然您可能只使用常规(非 JavaScript)链接来生成和下载文件。但是通过 AJAX 进行操作可以让您在生成文件时向用户显示一些特定的动画等。

    【讨论】:

    • 感谢您的快速回复。在我的情况下,PDF 文件不是在服务器上物理生成的。而且我需要 AJAX 调用将输入参数发送到服务器端。
    • 好吧,我看不出如何使用 AJAX“下载”PDF 文件。数据由浏览器处理,这可能导致下载 - 或由 JavaScript 处理,这通常会触发 DOM 插入等。您需要一种将 PDF 转换为 HTML 以显示它的方法 - 理论上是可能的,但 JavaScript 是并不是真的打算这样做,这可能不是你想要的。
    • 使用 GET 参数代替 POST 不是一种选择?
    • 是否有任何 jquery 插件可以帮助我做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2017-01-21
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多