使用AJAX调用显示PDF

Kni*_*nka 13 pdf ajax jquery

我正在尝试通过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. 

    }
});
Run Code Online (Sandbox Code Playgroud)

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

Zim*_*m84 16

为什么要通过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);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 是.而不是iframe.attr('src','/ pdf/yourpdf.pdf?options = first&second = here'); 我可以将AJAX成功函数的返回值添加到iFrame中吗?(而不是指定src,因为响应不包含任何URL,只包含PDF流) (2认同)

and*_*ala 6

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

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

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

    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;
    });
    
    Run Code Online (Sandbox Code Playgroud)

    这种方法的缺点是,在地址栏中输入了base64字符串。