我有这种控制器方法,根据用户引入的参数下载某个PDF文件,并显示一个视图,其不同的页面转换为PNG。
所以我接近它的方式是这样的:
首先,我映射一个方法来接收用户发送的帖子数据,然后生成实际PDF转换器的URL并将其传递给模型:
@RequestMapping(method = RequestMethod.POST)
public String formPost(Model model, HttpServletRequest request) {
//Gather parameters and generate PDF url
Long idPdf = Long.parseLong(request.getParam("idPdf"));
//feed the jsp the url of the to-be-generated image
model.addAttribute("image", "getImage?idPdf=" + idPdf);
}
然后在getImageMethod中我下载PDF,然后从中生成PNG:
@RequestMapping("/getImage")
public HttpEntity<byte[]> getPdfToImage(@RequestParam Long idPdf) {
String url = "myPDFrepository?idPDF=" + idPdf;
URL urlUrl = new URL(url);
URLConnection urlConnection;
urlConnection = urlUrl.openConnection();
InputStream is = urlConnection.getInputStream();
return PDFtoPNGConverter.convert(is);
}
我的JSP只有一个引用此url的img标记:
<img src="${image}" />
到目前为止,这项工作完美无缺。但现在我需要允许查看多页PDF的可能性,转换为PNGS,每个都在不同的页面中。所以我会添加一个page
参数,然后使用包含该页面参数的图片网址提供我的模型,在我的getImage
方法中我只会转换该页面。
但是实现的方式,我会再次为每个页面下载PDF,再加上视图的额外时间,这样就可以看出这个特定的PDF是否有更多的页面,然后显示“prev”和“下一个“按钮。
在这些请求期间保留同一文件的好方法是什么,所以我只下载一次?我想过使用临时文件但是管理它的删除可能是个问题。那么将PDF存储在会话中可能是一个很好的解决方案吗?我甚至都不知道这是不是好习惯。
我顺便使用Spring MVC。
答案 0 :(得分:2)
我认为最简单的方法是使用spring cache abstraction。查看tutorial并需要稍微更改一下代码:将加载pdf的逻辑移到单独的类中。
它看起来像:
interface PDFRepository {
byte[] getImage(long id);
}
@Repository
public class PDFRepositoryImpl implements PDFRepository {
@Cacheable
public byte[] getImage(long id) {
String url = "myPDFrepository?idPDF=" + idPdf;
URL urlUrl = new URL(url);
URLConnection urlConnection;
urlConnection = urlUrl.openConnection();
InputStream is = urlConnection.getInputStream();
return PDFtoPNGConverter.convert(is);
}
}
您将获得可插入缓存实施支持和良好的缓存过期管理。