Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用RESTful/ajax/js和来自UI的表单输入在UI上显示PDF?_Java_Javascript_Jquery_Ajax_Pdf - Fatal编程技术网

Java 如何使用RESTful/ajax/js和来自UI的表单输入在UI上显示PDF?

Java 如何使用RESTful/ajax/js和来自UI的表单输入在UI上显示PDF?,java,javascript,jquery,ajax,pdf,Java,Javascript,Jquery,Ajax,Pdf,我试图在使用javascript和ajax的RESTful服务的UI上显示一个PDF报告。它可以很好地用于单个输入,但是对于使用UI中的表单的多个输入(稍后我将其更改为JSON对象),它没有以正确的格式显示PDF。我已经用邮递员检查了服务,效果很好(下载PDF) 下面是用JAVA编写的服务代码 @POST @Path("/CustomizedReport") @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XM

我试图在使用javascript和ajax的RESTful服务的UI上显示一个PDF报告。它可以很好地用于单个输入,但是对于使用UI中的表单的多个输入(稍后我将其更改为JSON对象),它没有以正确的格式显示PDF。我已经用邮递员检查了服务,效果很好(下载PDF)

下面是用JAVA编写的服务代码

 @POST
  @Path("/CustomizedReport")
  @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
  @Produces("application/pdf")
  public Response getCustomizedReport(SubscriberCriteriaTool sct) throws ParseException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    new CustomizedReport().aaGeneratePdf(outputStream, sct);
    byte[] bytes = outputStream.toByteArray();
    DataSource dataSource = new ByteArrayDataSource(bytes, "application/pdf");
    ResponseBuilder response = Response.ok(dataSource);
    response.header("Content-Disposition", "inline; filename=CustomizedReport.pdf");
    return response.build();
  }
下面是javascript中的函数

function generateCustomizedReport() {
    console.log('generateCustomizedReport');
    $.ajax({
        type : 'POST',
        contentType : 'application/json',
        url : 'http://localhost:8080/Morpheus/api/reports/CustomizedReport',
        data : formToJSONReport(),
        success : function(response) { 
                    document.write(response);

        },
        error : function(error, status) {
            window.alert("Problem retrieving PDF.\nThe error status is: " + error);
        }
    });
}
下面是将表单更改为JSON的函数。现在它是硬编码的,但计划在工作后从UI获取输入。这和我在《邮递员》上查看的字符串一模一样,它给出了正确的结果(下载PDF)

这是我在UI上获得的PDF文本(由于我是stackoverflow新手,无法发布快照)

%PDF-1.4%���� 10 obj流����埃希菲伊*��鸭子7��� ��!阿多贝� B�M@D]��� ##########


提前感谢:-)

您的响应是文件流字节,我们无法通过将字节直接写入文档来显示文件,但我们可以使用iframe或new window下载具有指定内容类型(此处为application/pdf)的流(或通过指向iframe或_blank来附加表单的另一种技术,即响应将在新窗口中打开新窗口)

尝试更改您的成功函数,如下所示

    success : function(response) {
            //This double pass request Technic is to download the file stream via iframe.
            $("<iframe>").attr("src", 'http://localhost:8080/Morpheus/api/reports/CustomizedReport')
            //.hide()//hide it while download
            .appendTo("body");

            //OR you can try with popup window
            //window.open('http://localhost:8080/Morpheus/api/reports/CustomizedReport')
    }
成功:功能(响应){
//这种双传递请求技术是通过iframe下载文件流。
$(“”).attr(“src”,'http://localhost:8080/Morpheus/api/reports/CustomizedReport')
//.hide()//下载时将其隐藏
.附于(“主体”);
//或者您可以尝试使用弹出窗口
//打开窗户http://localhost:8080/Morpheus/api/reports/CustomizedReport')
}
通常我们在控制器中写入两个动作。

  • 用于验证请求并返回带有有效令牌的响应(某个密钥和时间戳的加密值)
  • 要通过iframe(或新窗口)获取文件,请使用在第一个请求成功(或完成)回调的响应中收到的上述有效令牌
  •     success : function(response) {
                //This double pass request Technic is to download the file stream via iframe.
                $("<iframe>").attr("src", 'http://localhost:8080/Morpheus/api/reports/CustomizedReport')
                //.hide()//hide it while download
                .appendTo("body");
    
                //OR you can try with popup window
                //window.open('http://localhost:8080/Morpheus/api/reports/CustomizedReport')
        }