【问题标题】:PDF download in new window in java在java中的新窗口中下载PDF
【发布时间】:2015-06-30 12:27:13
【问题描述】:

我对PDF下载的要求是:

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

我应该怎么做?

提前致谢。

【问题讨论】:

  • 到目前为止您尝试过什么?你有PDF字节数组吗?您是否使用普通的 java servlet 来映射下载 URL? json 将如何从客户端发送?它是一个帖子吗?一个GET?请详细说明。
  • 我正在使用弹簧。 JSON 数据将来自 POST 请求。之后,我将使用这些数据创建 JASPER 报告。

标签: java json pdf


【解决方案1】:

如果您使用 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下载代码,可以看一个例子here或者here

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

我会使用这样的界面

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 文件。目前尚不清楚“需要返回下载链接和唯一ID”是否可以仅返回唯一ID,然后在前端硬编码下载位置。如果没有,则返回一个 JSON 映射它。

【讨论】:

  • 能否分享一下 getFromStore(uniqueId) 的示例代码
  • 我在控制器上添加了一个示例实现。
  • getFromStore() 将是reportFileStore.getFile(),我想...另外deleteFileFromStore() 将是reportFileStore.deletFile()...
  • @UsagiMiyamoto,是的,它们具有相同的签名,上面的代码只是关于如何创建文件下载端点的伪代码。这个想法是生成PDF,存储在interface ReportFileStore,然后使用它在控制器上流式传输文件内容
猜你喜欢
  • 2020-04-16
  • 2012-09-18
  • 1970-01-01
  • 2022-12-09
  • 2022-06-19
  • 2017-12-05
  • 2012-09-01
  • 2014-07-01
  • 2012-09-01
相关资源
最近更新 更多