代码 - 多张图片合并成PDF(每页宽高即是当前页面图片的宽高)- easypdf

384 阅读1分钟

easy-pdf

1. 概述

代码仓库: gitee.com/dromara/x-e…

官网: www.x-easypdf.cn

2. 代码

2.1 多张图片转成PDF(每页PDF的宽高是当前页面图片的宽高)

图片构建: www.x-easypdf.cn/#/md/pdfbox…

页面构建: www.x-easypdf.cn/#/md/pdfbox…

元素保存到某页面: www.x-easypdf.cn/#/md/pdfbox…


依赖

        <!-- https://mvnrepository.com/artifact/wiki.xsx/x-easypdf -->
        <dependency>
            <groupId>wiki.xsx</groupId>
            <artifactId>x-easypdf</artifactId>
            <version>2.10.1</version>
        </dependency>


基于上述官方Demo进行代码合并-从而支持多张图片合并PDF

package work.linruchang;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import lombok.SneakyThrows;
import wiki.xsx.core.pdf.component.XEasyPdfComponent;
import wiki.xsx.core.pdf.doc.XEasyPdfDocument;
import wiki.xsx.core.pdf.doc.XEasyPdfPage;
import wiki.xsx.core.pdf.doc.XEasyPdfPageRectangle;
import wiki.xsx.core.pdf.handler.XEasyPdfHandler;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

/**
 * @author LinRuChang
 * @version 1.0
 * @date 2022/09/03
 * @since 1.8
 **/
public class OtherEasyPdfTest3 {

    /**
     * 本地文件转成Itex的图片对象  【转换失败不抛出异常直接返回null】
     *
     * @param imageFile    图片文件
     * @return
     */
    public static XEasyPdfComponent toEasyPdfImage(File imageFile) {
        return XEasyPdfHandler.Image.build(imageFile);
    }

    public static XEasyPdfPage customNewPageByImage(File image) {
        BufferedImage bufferedImage = ImgUtil.toBufferedImage(ImgUtil.toImage(FileUtil.readBytes(image)));
        return XEasyPdfHandler.Page.build(XEasyPdfPageRectangle.create(Convert.toFloat(bufferedImage.getWidth()), Convert.toFloat(bufferedImage.getHeight())));
    }


    /**
     * 图片转PDF(每张图就是每页的PDF(每张根据图片的宽高进行调整))
     * 文档:https://www.x-easypdf.cn/#/md/pdfbox/%E5%8A%A9%E6%89%8B%E8%AF%B4%E6%98%8E?id=%e5%9b%be%e7%89%87%e6%9e%84%e5%bb%ba
     *
     * @param imageFiles        一系列图片文件
     * @param targetPdfFilePath 合并后的pdf路径
     */
    @SneakyThrows
    public static File imagesToPdf(List<File> imageFiles, File targetPdfFilePath) {


        if (CollUtil.isNotEmpty(imageFiles) && targetPdfFilePath != null) {


            XEasyPdfDocument document = XEasyPdfHandler.Document.build();

            imageFiles.stream().forEachOrdered(imageFile -> {
                XEasyPdfComponent xEasyPdfImage = toEasyPdfImage(imageFile);
                XEasyPdfPage newPage = customNewPageByImage(imageFile);
                newPage.addComponent(xEasyPdfImage);
                document.addPage(newPage);
            });

            document.save(new FileOutputStream(targetPdfFilePath)).close();

            return targetPdfFilePath;
        }

        return null;
    }

    public static void main(String[] args) {
        List<File> imagesFiles = CollUtil.list(false, FileUtil.file("D:\\截图3\\合并截图0-版权信息.jpg"), FileUtil.file("D:\\截图3\\合并截图1-小桥老树致微信读书朋友的一封信+独家视频.jpg"));
        File resultPdf = FileUtil.file("D:\\截图3\\test2.pdf");
        imagesToPdf(imagesFiles, resultPdf);
    }

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pusjmS5q-1662196633574)(en-resource://database/61536:0)]



[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UufNbeGV-1662196633575)(en-resource://database/61538:0)]