最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot整合itext實(shí)現(xiàn)PDF文件合并

 更新時間:2024年11月12日 09:22:03   作者:無敵小肥007  
這篇文章主要為大家詳細(xì)介紹了Springboot整合itext實(shí)現(xiàn)PDF文件合并以及識別圖片轉(zhuǎn)成PDF拼接的相關(guān)知識,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

本文實(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)建一個新的 A4 頁面
                PdfPage newPage = pdfDoc.addNewPage(PageSize.A4);
                Image img = new Image(ImageDataFactory.create(file.getBytes()));
                // 設(shè)置圖片大小以適應(yīng) A4 頁面
                img.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight());
                // 獲取當(dāng)前頁面編號
                int pageNumber = pdfDoc.getNumberOfPages();
                // 設(shè)置圖片位置為頁面中心
                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;
    }

}

三、請求接口及結(jié)果

http://localhost:8080/pdf/generateFromFiles

以上就是Springboot整合itext實(shí)現(xiàn)PDF文件合并的詳細(xì)內(nèi)容,更多關(guān)于Springboot itext PDF合并的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中Thread類的使用和它的屬性

    Java中Thread類的使用和它的屬性

    在java中可以進(jìn)行多線程編程,在java標(biāo)準(zhǔn)庫中提供了一個Thread類,來表示線程操作,本文主要介紹了Java中Thread類的使用和它的屬性,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java?9?中的模塊Module系統(tǒng)

    Java?9?中的模塊Module系統(tǒng)

    Java?9?引入的模塊是在Java包(package)的基礎(chǔ)上又引入的一個新的抽象層,基于package這一點(diǎn)很重要,這里需要強(qiáng)調(diào)一下,接下來通過本文給大家介紹Java?9?中的模塊Module系統(tǒng),感興趣的朋友一起看看吧
    2022-03-03
  • Spring Boot 對接深度求索接口實(shí)現(xiàn)知識問答功能

    Spring Boot 對接深度求索接口實(shí)現(xiàn)知識問答功能

    本文詳細(xì)介紹了如何使用 Spring Boot 對接深度求索接口,實(shí)現(xiàn)知識問答功能,通過整合深度求索 API,我們可以輕松地在 Spring Boot 項(xiàng)目中實(shí)現(xiàn)智能問答功能,
    2025-02-02
  • spring mvc中的@ModelAttribute注解示例介紹

    spring mvc中的@ModelAttribute注解示例介紹

    在Spring mvc中,注解@ModelAttribute是一個非常常用的注解,下面這篇文章主要給大家介紹了關(guān)于spring mvc中@ModelAttribute注解的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • Mybatis collection查詢集合屬性報(bào)錯的解決方案

    Mybatis collection查詢集合屬性報(bào)錯的解決方案

    這篇文章主要介紹了Mybatis collection查詢集合屬性報(bào)錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot整合Kafka完成生產(chǎn)消費(fèi)的方案

    SpringBoot整合Kafka完成生產(chǎn)消費(fèi)的方案

    網(wǎng)上找了很多管理kafka整合springboot的教程,但是很多都沒辦法應(yīng)用到生產(chǎn)環(huán)境,很多配置都是缺少,或者不正確的,只能當(dāng)個demo,所以本文給大家介紹了SpringBoot整合Kafka完成生產(chǎn)消費(fèi)的方案,需要的朋友可以參考下
    2024-12-12
  • 基于spring注入為null的原因及解決方案

    基于spring注入為null的原因及解決方案

    這篇文章主要介紹了spring注入為null的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot整合OpenFeign的完整指南

    SpringBoot整合OpenFeign的完整指南

    OpenFeign 是由 Netflix 開發(fā)的一個聲明式 Web 服務(wù)客戶端,它使得編寫 HTTP 客戶端變得更加簡單,本文為大家介紹了SpringBoot整合OpenFeign的詳細(xì)步驟,需要的小伙伴可以參考下
    2025-04-04
  • SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能

    SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能

    接口簽名是一種重要的安全機(jī)制,用于確保 API 請求的真實(shí)性、數(shù)據(jù)的完整性以及防止重放攻擊,這篇文章主要介紹了SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能,需要的朋友可以參考下
    2025-04-04
  • SpringBoot基于docx4j實(shí)現(xiàn)DOCX轉(zhuǎn)PDF的具體方案

    SpringBoot基于docx4j實(shí)現(xiàn)DOCX轉(zhuǎn)PDF的具體方案

    在日常項(xiàng)目開發(fā)中,我們經(jīng)常遇到用戶上傳 Word( .docx)文件,希望后臺自動生成 PDF,用于下載、歸檔或在線預(yù)覽,本文將介紹一個完全開源、部署簡單、純 Java 的實(shí)現(xiàn)方案,感興趣的小伙伴可以跟著小編一起來看看
    2025-11-11

最新評論

千阳县| 胶南市| 横峰县| 土默特左旗| 长丰县| 老河口市| 古蔺县| 宜宾市| 武功县| 息烽县| 扶沟县| 大悟县| 拜泉县| 台东县| 塔城市| 泸州市| 宜丰县| 土默特左旗| 敦化市| 浙江省| 讷河市| 祁阳县| 石家庄市| 玉溪市| 竹山县| 汽车| 荔浦县| 西乌珠穆沁旗| 郎溪县| 东台市| 九龙城区| 星子县| 皋兰县| 连城县| 乌鲁木齐县| 东兴市| 托克托县| 定西市| 桦甸市| 福安市| 崇左市|