PDF在新窗口中下载PDF

时间:2015-06-30 12:27:13

标签: java json pdf

我对PDF下载的要求是:

  1. 当用户点击“下载”链接时,前端会将 POST 一个JSON数据发送到后端。
  2. 后端将处理JSON,从其参数生成PDF文件。
  3. 作为回应,我(后端)需要发送下载链接和唯一文档ID。
  4. Frond-end将在新窗口中打开该链接(GET),这将打到后端并开始下载。
  5. 我该怎么做?

    提前致谢。

1 个答案:

答案 0 :(得分:2)

如果您正在使用Spring,则需要创建一个控制器

@Controller
@RequestMapping(value = "/report")
public class ReportController {

    @Autowired
    ReportFileStore reportFileStore;

    @RequestMapping(value = "/download/{uniqueId}", method = RequestMethod.GET)
    public void getFile(@PathVariable("uniqueId") String uniqueId, HttpServletResponse response) {
        //Find the generated PDF from somewhere, might be a disk, or RAM
        byte[] pdf = getFromStore(uniqueId);

        writeToResponse(pdf,response);
        deleteFileFromStore(uniqueId);
    }

    private byte[] getFromStore(String uniqueId){
        return reportFileStore.getFile(uniqueId);
    }
}

方法writeToResponse是标准的servlet下载代码,您可以看到示例herehere

关于getFromStore,这是一个简单的方法获取从Jasper生成的PDF的byte [],当你生成时,你可以使用put方法存储带有uniqueId的byte []。

我使用像这样的界面

public interface ReportFileStore {
     void storeFile(String uniqueId,byte[] content);
     byte[] getFile(String uniqueId);
     InputStream getFile(String uniqueId);
     void deleteFile(String uniqueId);
}

使用映射在RAM或磁盘上的VFS实现它。

当然,在PDF生成中,您需要为其生成唯一ID,您可以尝试使用UUID。将此UUID与ReportFileStore一起使用以保存PDF文件。目前还不清楚"是否需要返回下载链接和唯一身份标识"可以只返回uniqueId,然后在前端硬编码下载位置。如果没有,请返回JSON映射。