当我们需要传输较大的pdf文件时,将文件整个传给前端会导致pdf加载时间过长,影响用户体验。这是就需要对pdf进行分片后在进行传输,减少文件的打开时间。
使用itextpdf实现截取pdf文档第几页到第几页
- 使用itextpdf ,先导入依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
- 对指定pdf进行分页,返回文件流
//对pdf进行分页
@ResponseBody
@CrossOrigin
@GetMapping("api/download")
public void pdf( HttpServletResponse response, HttpServletRequest request) throws IOException, DocumentException {
//获取开始页和结束页
String startPage = request.getHeader("startPage");
String endPage = request.getHeader("endPage");
String page=startPage+"-"+endPage;
//获取文件路径
String path="test.pdf";
// 读取pdf文档
PdfReader reader = new PdfReader(path);
//获取pdf总页数,可以事先将总页数传给前端
int numberOfPages = reader.getNumberOfPages();
// 截取开始页
int start = Integer.parseInt(page.substring(0,1));
response.setHeader("Content-Page", String.valueOf(numberOfPages));
//截取pdf部分页,格式"2-5" 第2页到第5页 页码超出范围(10页,你选择"15-20")只会读最后一页
// 参数为String型,可让前端传值,控制读取第几页
// reader.selectPages("2-5");
reader.selectPages(page);
//源码没怎么看懂,但是需要内存中存放文件流,所以用了HttpServletResponse
PdfStamper stamp = new PdfStamper(reader, response.getOutputStream());
// 开始页 如果大于pdf总页数,不返回文件流,stamp.close()结果返回1
if(start <= numberOfPages){
stamp.close();
}
reader.close();
}