2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > itextpdf实现多PDF文件合并为一个PDF文档

itextpdf实现多PDF文件合并为一个PDF文档

时间:2020-07-22 23:19:08

相关推荐

itextpdf实现多PDF文件合并为一个PDF文档

目录

1、引入POM2、编写工具类3、代码实现

1、引入POM

<dependencies><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency></dependencies>

2、编写工具类

public class PdfUtils {/*** 创建pdf文档** @param response* @param fileName* @return*/public static Document createDocument(HttpServletResponse response, String fileName) {try {response.reset();response.setHeader("Content-Type", "application/pdf-stream");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");} catch (Exception e) {e.printStackTrace();}// 设置大小return new Document(PageSize.A4, 50, 50, 80, 50);}/*** 合并pdf** @param response* @param document* @param byteList*/public static void mergePdf(HttpServletResponse response, Document document, List<byte[]> byteList) {try {OutputStream os = response.getOutputStream();// 以任意一个页面创建pdf模板document = new Document(new PdfReader(byteList.get(0)).getPageSize(1));PdfCopy copy = new PdfCopy(document, os);// 打开文档document.open();// 遍历pdf文件for (byte[] bytes : byteList) {// 读取pdfPdfReader reader = new PdfReader(bytes);// 获取页数int numberOfPages = reader.getNumberOfPages();// 从第一页开始for (int i = 1; i <= numberOfPages; i++) {// 新建文档页document.newPage();// 复制操作PdfImportedPage page = copy.getImportedPage(reader, i);copy.addPage(page);}}} catch (Exception e) {e.printStackTrace();throw new RuntimeException("PDF合并失败!");} finally {if (document != null) {document.close();}}}}

3、代码实现

支持上传MultipartFile文件或者通过本地文件的Path的进行合并PDF

@RestController@RequestMapping("/test")public class PdfController {/*** 上传文件进行合并** @param files* @param response*/@PostMapping("pdfStream")public void pdf(@RequestParam("files") MultipartFile[] files, HttpServletResponse response) {try {// 判断文件是否合规、以及转化为输入流List<byte[]> byteList = new ArrayList<>();for (MultipartFile file : files) {// 限制格式只能为pdfif (file == null) {throw new RuntimeException("文件不能为空!");}String originalFilename = file.getOriginalFilename();String substring = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);if (!substring.equals("pdf")) {throw new RuntimeException("只能上传pdf格式文件!");}// 获取输入流// 获取输入流InputStream inputStream = file.getInputStream();byte[] bytes = inputStreamToByte(inputStream);byteList.add(bytes);}// 1.设置输出流名称String fileName = "合并文件.pdf";Document document = PdfUtils.createDocument(response, fileName);// 2.开启合并PdfUtils.mergePdf(response, document, byteList);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}}/*** 本地文件转换合并** @param response*/@GetMapping("pdfPath")public void pdfPath(HttpServletResponse response) {try {// 加载本地文件List<String> paths = new ArrayList<>();paths.add("C:\\Users\\LiGezZ\\Desktop\\1.pdf");paths.add("C:\\Users\\LiGezZ\\Desktop\\2.pdf");// 判断文件是否合规、以及转化为输入流List<byte[]> byteList = new ArrayList<>();for (String path : paths) {File file = new File(path);// 限制格式只能为pdfif (!file.exists()) {throw new RuntimeException("文件不存在!");}if (file.length() <= 0) {throw new RuntimeException("文件不能为空!");}String name = file.getName();String substring = name.substring(name.lastIndexOf(".") + 1);if (!substring.equals("pdf")) {throw new RuntimeException("只能上传pdf格式文件!");}// 获取输入流FileInputStream inputStream = new FileInputStream(file);byte[] bytes = inputStreamToByte(inputStream);byteList.add(bytes);}// 1.设置输出流名称String fileName = "合并文件.pdf";Document document = PdfUtils.createDocument(response, fileName);// 2.开启合并PdfUtils.mergePdf(response, document, byteList);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}}private byte[] inputStreamToByte(InputStream inputStream) {try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {byte[] bytes = new byte[1024];int len = 0;while ((len = inputStream.read(bytes)) != -1) {os.write(bytes, 0, len);}os.flush();return os.toByteArray();} catch (Exception e) {throw new RuntimeException("InputStream转换失败!");}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。