Springboot整合itext實(shí)現(xiàn)PDF文件合并
前言
本文實(shí)現(xiàn) Springboot 整合 itext 實(shí)現(xiàn)PDF文件合并,圖片轉(zhuǎn)PDF拼接。
一、引用依賴
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>8.0.5</version> <type>pom</type> </dependency>
二、使用步驟
1.Controller
代碼如下(示例):
import com.ruoyi.tools.service.IPdfHandlerService; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; @RestController @RequiredArgsConstructor @RequestMapping("/pdf") public class PdfHandlerController { private final IPdfHandlerService pdfHandlerService; @PostMapping(value = "/generateFromFiles", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public void uploadFiles(@RequestPart("files") List<MultipartFile> files, HttpServletResponse response) throws Exception { byte[] pdfBytes = pdfHandlerService.generatePdfFromFiles(files); response.setContentType("application/pdf"); response.setContentLength(pdfBytes.length); //把字節(jié)數(shù)組寫入輸出流中 response.getOutputStream().write(pdfBytes); }
2.Service接口
import org.springframework.web.multipart.MultipartFile; import java.util.List; public interface IPdfHandlerService { byte[] generatePdfFromFiles(List<MultipartFile> files); }
3.實(shí)現(xiàn)類
import com.itextpdf.io.image.ImageDataFactory; import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfReader; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Image; import com.itextpdf.layout.element.Paragraph; import com.ruoyi.tools.service.IPdfHandlerService; import lombok.SneakyThrows; import org.apache.commons.io.FilenameUtils; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.List; @Service public class PdfHandlerServiceImpl implements IPdfHandlerService { @SneakyThrows public byte[] generatePdfFromFiles(List<MultipartFile> files) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter writer = new PdfWriter(baos); PdfDocument pdfDoc = new PdfDocument(writer); Document document = new Document(pdfDoc); for (MultipartFile file : files) { if (isPdf(file)) { PdfDocument sourcePdf = new PdfDocument(new PdfReader(file.getInputStream())); int n = sourcePdf.getNumberOfPages(); for (int i = 1; i <= n; i++) { PdfPage page = sourcePdf.getPage(i); PdfFormXObject pageCopy = page.copyAsFormXObject(pdfDoc); Rectangle pageSize = page.getPageSize(); PdfPage newPage = pdfDoc.addNewPage(); newPage.setMediaBox(pageSize); new PdfCanvas(newPage).addXObjectAt(pageCopy, 0, 0); newPage.setRotation(page.getRotation()); } sourcePdf.close(); continue; } if (isImage(file)) { // 創(chuàng)建一個(gè)新的 A4 頁(yè)面 PdfPage newPage = pdfDoc.addNewPage(PageSize.A4); Image img = new Image(ImageDataFactory.create(file.getBytes())); // 設(shè)置圖片大小以適應(yīng) A4 頁(yè)面 img.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight()); // 獲取當(dāng)前頁(yè)面編號(hào) int pageNumber = pdfDoc.getNumberOfPages(); // 設(shè)置圖片位置為頁(yè)面中心 img.setFixedPosition(pageNumber, (PageSize.A4.getWidth() - img.getImageScaledWidth()) / 2, (PageSize.A4.getHeight() - img.getImageScaledHeight()) / 2); // 添加圖片到文檔 document.add(img); continue; } //可以刪掉此提示 document.add(new Paragraph(file.getOriginalFilename() + "僅支持PDF和圖片的拼接")); } document.close(); return baos.toByteArray(); } @SneakyThrows private boolean isPdf(MultipartFile file) { String contentType = file.getContentType(); String extension = FilenameUtils.getExtension(file.getOriginalFilename()); if (contentType != null && contentType.equals("application/pdf")) { return true; } if ("pdf".equalsIgnoreCase(extension)) { byte[] fileHeader = new byte[4]; try (ByteArrayInputStream bis = new ByteArrayInputStream(file.getBytes())) { int bytesRead = bis.read(fileHeader); if (bytesRead != fileHeader.length) { return false; } } return new String(fileHeader).startsWith("%PDF"); } return false; } @SneakyThrows private boolean isImage(MultipartFile file) { String contentType = file.getContentType(); String extension = FilenameUtils.getExtension(file.getOriginalFilename()); if (contentType != null && contentType.startsWith("image")) { return true; } if (extension != null) { switch (extension.toLowerCase()) { case "jpg": case "jpeg": case "png": case "gif": case "bmp": return true; default: return false; } } return false; } }
三、請(qǐng)求接口及結(jié)果
http://localhost:8080/pdf/generateFromFiles
以上就是Springboot整合itext實(shí)現(xiàn)PDF文件合并的詳細(xì)內(nèi)容,更多關(guān)于Springboot itext PDF合并的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- SpringBoot3集成iText實(shí)現(xiàn)PDF導(dǎo)出功能
- SpringBoot集成iTextPDF的實(shí)例
- SpringBoot整合iText7導(dǎo)出PDF及性能優(yōu)化方式
- SpringBoot使用itext填充pdf表單及導(dǎo)出pdf的流程
- SpringBoot集成itext實(shí)現(xiàn)html轉(zhuǎn)PDF
- SpringBoot集成itextpdf實(shí)現(xiàn)根據(jù)模板動(dòng)態(tài)生成PDF
- SpringBoot使用iText7實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF并添加頁(yè)眉頁(yè)腳水印
- SpringBoot集成itext導(dǎo)出PDF的過程
相關(guān)文章
JAVA讀取HDFS的文件數(shù)據(jù)出現(xiàn)亂碼的解決方案
這篇文章主要介紹了JAVA讀取HDFS的文件數(shù)據(jù)出現(xiàn)亂碼的解決方案,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11Mybatis-plus解決兼容oracle批量插入的示例詳解
Mybatis-Plus 是一個(gè) MyBatis 的增強(qiáng)工具,提供無侵入、損耗小的 CRUD 操作,本文給大家介紹了Mybatis-plus解決兼容oracle批量插入,文中通過大家介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11SpringBoot集成FastDFS依賴實(shí)現(xiàn)文件上傳的示例
這篇文章主要介紹了SpringBoot集成FastDFS依賴實(shí)現(xiàn)文件上傳,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05關(guān)于Java JDK安裝、配置環(huán)境變量的問題
這篇文章主要介紹了Java JDK安裝、配置環(huán)境變量,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Spring Security整合Oauth2實(shí)現(xiàn)流程詳解
這篇文章主要介紹了Spring Security整合Oauth2實(shí)現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08關(guān)于RestTemplate中的Get請(qǐng)求
這篇文章主要介紹了關(guān)于RestTemplate中的Get請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java中定時(shí)器Timer致命缺點(diǎn)案例詳解
這篇文章主要介紹了Java中定時(shí)器Timer致命缺點(diǎn),以Java中定時(shí)器Time為案例整理下我的學(xué)習(xí)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02深入Ajax代理的Java Servlet的實(shí)現(xiàn)詳解
本篇文章是對(duì)Ajax代理的Java Servlet的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06SpringBoot整合JPA詳細(xì)代碼實(shí)例
這篇文章主要給大家介紹了關(guān)于SpringBoot整合JPA的相關(guān)資料,JPA(Java Persistence API)是Sun官方提出的Java持久化規(guī)范,它為Java開發(fā)人員提供了一種對(duì)象/關(guān)聯(lián)映射工具來管理Java應(yīng)用中的關(guān)系數(shù)據(jù),需要的朋友可以參考下2024-05-05