欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Springboot 整合 itext 实现PDF文件合并,识别图片则转成PDF拼接

Springboot 整合 itext 实现PDF文件合并,识别图片则转成PDF拼接

2025/5/9 11:20:30 来源:https://blog.csdn.net/weixin_45549188/article/details/143672955  浏览:    关键词:Springboot 整合 itext 实现PDF文件合并,识别图片则转成PDF拼接

目录

  • 前言
  • 一、引用依赖
  • 二、使用步骤
    • 1.Controller
    • 2.Service接口
    • 3.实现类
  • 三、请求接口及结果


前言

本文实现 Springboot 整合 itext 实现PDF文件合并,图片转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);//把字节数组写入输出流中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.实现类

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 {@SneakyThrowspublic 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)) {// 创建一个新的 A4 页面PdfPage newPage = pdfDoc.addNewPage(PageSize.A4);Image img = new Image(ImageDataFactory.create(file.getBytes()));// 设置图片大小以适应 A4 页面img.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight());// 获取当前页面编号int pageNumber = pdfDoc.getNumberOfPages();// 设置图片位置为页面中心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();}@SneakyThrowsprivate 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;}@SneakyThrowsprivate 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;}}

三、请求接口及结果

http://localhost:8080/pdf/generateFromFiles
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词