通过jquery / javascript通过帖子返回PDF文档

时间:2016-07-14 12:41:08

标签: javascript jquery ajax pdf

我在Spring 3,Java,JSP,javascript和jquery中工作,偶尔使用Ajax。我有生成PDF的服务器功能;我有一个新的要求来显示"预览" PDF文档。

我有生成PDF文档的代码,工作正常。我可以通过黑客来源显示它,在我们通常显示未加水印的已完成文档的地方显示它,所以我知道PDF的生成正在发挥作用。

我现在想要做的是在我们的网页上点击按钮(或链接),在自己的标签中显示PDF。有一些限制:

  1. 我有一堆数据要从网页传递给控制器​​,它是生成PDF所需的数据。我们有通过POST方法执行此操作的代码,并使用Ajax发布必要的数据。

  2. 将PDF显示在与单击按钮以显示PDF相同的窗口中是不方便的;询问用户是否想要下载或查看其他地方的弹出窗口很好。用户不够精通,无法依赖他们对“后退”的了解。按钮在这里。所以我们希望PDF显示在其他地方,最好是在窗口中的另一个选项卡上,但另一个整个窗口都可以。

  3. 目前我的控制器中有以下内容:

            response.setContentLength(pdfGenerated.length);
            response.setContentType("application/pdf");
            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            response.setHeader("Pragma", "public");
    
            response.setHeader("Content-Disposition", "attachment;filename=\"Preview.pdf\"");
    
            ServletOutputStream out = response.getOutputStream();
    
            out.write(pdfGenerated); // (encodedPdf);
            out.flush();
            out.close();
    

    ajax调用如下所示:

    $("#generatePDFPreview").live("click", function() {
        var gridData = getCorrectedGridData();
        var valid = validateContractContent(gridData);
        if (valid) {
            // the call below saves the contract data and then generates its PDF
            $.ajax({
                url: getModelObject("generatePDFPreviewURL")
                ,type:'POST'
                ,data: {'editedContents':JSON.stringify(gridData)}
                ,datatype: "application/pdf"
                ,async: false
                ,success: function(data) {                
                    if(data != null && data.length>0 && data != "Error") {    
                        //data must be contract id...use it to build the complete URL.
                        //window.location.href = getModelObject("deliveryScreenURL") + data;
                        window.open("data:application/pdf;base64, " + data);
                    } else {
                        alert("PDF preview not generated...Data returned is not ok. Please try again or contact Sales Support.");
                    }                
                }
            });   
        }
    });
    

    我在这里尝试了不同的东西;我已经取消了成功'功能完全;我已经尝试编码数据(base64)并返回它,并使用数据:application / pdf等,但失败了 - 我有一些证据表明PDF数据太长了,但我不确定(它是85k-90k,URL字符串停止在32784)。

    我并不担心我的用户是否安装了PDF阅读器。他们必须安装它才能使用它和应用程序的其他部分。

    如此亲密是令人沮丧的;所有证据都表明我们已经完成了大部分工作,只需要告诉浏览器我们希望它使用PDF阅读器来处理这些字节。

    有人能指出我们的方法,或指出我们现在所拥有的错误是什么?

0 个答案:

没有答案