使用spring mvc和apache pdf框从UI下载的空和破碎的pdf文件

Empty and broken pdf file downloaded from UI using spring mvc and apache pdf box

本文关键字:pdf 文件 破碎 下载 框从 spring mvc apache 使用 UI      更新时间:2023-09-26

下面的代码工作正常,没有错误,我能够下载代码中指定的名称的文件,但问题是没有打印到它的内容,当我打开文件时,我得到错误说文件损坏。而我只是保存文件的地方,我得到适当的文件与内容。

从UI

:

var jsonStrToSend = JSON.stringify( jsonObjToSend );
jsonStrToSend = jsonStrToSend.replace(/"/g, """);
var url = '/'+appPath+'/reportgeneration' ;
var $form = $('<form enctype=''application/json'' action="' + url + '" method="post">').append($('<input type="hidden" name="data" id="data" value="' + jsonStrToSend + '" />'));
$form.appendTo("body").submit();
在控制器:

@RequestMapping(value = "/reportgeneration", method = RequestMethod.POST)
           public @ResponseBody void reportgeneration(HttpServletRequest request,
                 HttpServletResponse response){ 
           Map returnMapMessage = new HashMap();
           int resultData =0;
           HttpSession httpsessionObj = request.getSession(false);
           try{
               PDDocument doc = new PDDocument();
               PDPage intro_page = new PDPage();
               doc.addPage( intro_page );
               PDPageContentStream contentStream_itro =
                        new PDPageContentStream(doc, intro_page);
               //Some stuff.......
               String fileName = reportName+"_"+tempDate.getDate()+"-"+tempDate.getMonth()+"-"+tempDate.getYear()+" "+tempDate.getHours()+tempDate.getMinutes()+".pdf";
               //doc.save("/test/webapp/reports/"+fileName);
               response.setContentType("application/pdf");
               PDStream ps=new PDStream(doc);
               InputStream is=ps.createInputStream();
               String headerKey = "Content-Disposition";
               String headerValue = String.format("attachment; filename='"%s'"", fileName);
               response.setHeader("Expires:", "0"); // eliminates browser caching
               response.setHeader(headerKey, headerValue);
               org.apache.commons.io.IOUtils.copy(is, response.getOutputStream());
               response.flushBuffer();
               is.close();
               doc.close();

我错过了doc.save(),因为我觉得没有必要,因为我没有将文件存储在驱动器的任何地方。但是下面的代码可以正常工作。

ByteArrayOutputStream output = new ByteArrayOutputStream();
doc.save(output);
doc.close();
response.addHeader("Content-Type", "application/force-download");
response.addHeader("Content-Disposition", "attachment; filename='""+fileName+"'"");
response.getOutputStream().write(output.toByteArray());