指定页数到处pdf
指定页数显示pdf文档。
有些业务中,如果保存的是一个word
文档模板,这个模板可能有几百页,非常多。展示文档的时候,需要将模板中的某些地方填充数据。
- 方案一:不推荐
将word
转为PDF
后替换里面的数据,其实PDF是最终文本格式,这样替换是特别麻烦,还有会出现格式上的问题。例如:将文档中的某个字符替换成一段文字,这段文字的位置肯定是不够的,所以就会重叠在其他文档上面。
- 方案二:
批量获取word
文档,然后把数据替换后再转为PDF
文档渲染。(后期给出demo
)
开源参考:
https://github.com/aspose-pdf/Aspose.PDF-for-Java
https://github.com/aspose-words/Aspose.Words-for-Java
一、导入依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>1.8.10</version>
</dependency>
package com.open.capacity.datasource.controller;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.Splitter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/pdf/{startPage}/{endPage}")
public void findPdf(HttpServletResponse response, @PathVariable Integer startPage,@PathVariable Integer endPage) {
splitPdf(response,startPage,endPage,"C:\\Users\\stars\\Desktop\\Linux安装各种各种程序.pdf");
}
@GetMapping("/pdf")
public void find(HttpServletResponse response) {
splitCompletely(response,"C:\\Users\\stars\\Desktop\\Linux安装各种各种程序.pdf");
}
/**
* 分页读取pdf文档
* <b>这里只能显示一页,具体不填清楚</b>
*
* <p>如果只显示一页,开始时间和结束时间设置为一样的。</p>
* @param response
* @param startPage 开始也
* @param endPage 结束页
* @param filePath pdf 文档所在路径
*/
public void splitPdf(HttpServletResponse response, Integer startPage, Integer endPage, String filePath) {
// 这是对应文件名
File indexFile = new File(filePath);
try {
PDDocument document = PDDocument.load(indexFile);
// 获取总页数
// int numberOfPages = document.getNumberOfPages();
// System.out.println("总页数告诉你哦:" + numberOfPages);
Splitter splitter = new Splitter();
// 开始页
splitter.setStartPage(startPage);
// 结束页
splitter.setEndPage(endPage);
List<PDDocument> pages = splitter.split(document);
pages.forEach(pdDocument -> {
try {
pdDocument.save(response.getOutputStream());
pdDocument.close();
} catch (IOException e) {
e.printStackTrace();
} catch (COSVisitorException e) {
e.printStackTrace();
}
});
}catch (IOException ex){
ex.printStackTrace();
}
}
/**
* 查询全部PDF文档
* <p>
* 获取总页数
* int numberOfPages = document.getNumberOfPages();
* System.out.println("总页数告诉你哦:"+numberOfPages);
* </p>
* @param response
* @param filePath PDF 所在的目录
*/
public void splitCompletely (HttpServletResponse response, String filePath) {
// 这是对应文件名
File indexFile = new File(filePath);
try {
PDDocument document = PDDocument.load(indexFile);
document.save(response.getOutputStream());
document.close();
} catch (IOException e) {
e.printStackTrace();
} catch (COSVisitorException e) {
e.printStackTrace();
}
}
}