easy-pdf
1. 概述
代码仓库: https://gitee.com/dromara/x-easypdf
官网: https://www.x-easypdf.cn
2. 代码
2.1 多张图片转成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
页面构建: https://www.x-easypdf.cn/#/md/pdfbox/%E5%8A%A9%E6%89%8B%E8%AF%B4%E6%98%8E?id=%e9%a1%b5%e9%9d%a2%e6%9e%84%e5%bb%ba
元素保存到某页面: https://www.x-easypdf.cn/#/md/pdfbox/%E5%8F%82%E8%80%83%E7%A4%BA%E4%BE%8B?id=%e5%88%86%e6%ae%b5%e4%bf%9d%e5%ad%98
依赖
<!-- 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);
}
}