一、maven依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.29</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
二、工具类
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Slf4j
public class ImageToPdfUtils {
public static void convertImages2Pdf(String imgFilePath, String outFile) {
try {
List<byte[]> list = getImgByteList(imgFilePath);
PDDocument document = new PDDocument();
for (byte[] imageBytes : list) {
PDImageXObject image = PDImageXObject.createFromByteArray(document, imageBytes, "image");
PDRectangle pageSize = new PDRectangle(image.getWidth(), image.getHeight());
PDPage page = new PDPage(pageSize);
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
float pageWidth = pageSize.getWidth();
float pageHeight = pageSize.getHeight();
float imageWidth = image.getWidth();
float imageHeight = image.getHeight();
float scale = Math.min(pageWidth / imageWidth, pageHeight / imageHeight);
float scaledWidth = imageWidth * scale;
float scaledHeight = imageHeight * scale;
float x = (pageWidth - scaledWidth) / 2;
float y = (pageHeight - scaledHeight) / 2;
contentStream.drawImage(image, x, y, scaledWidth, scaledHeight);
contentStream.close();
}
File outputFile = new File(outFile);
File parentFolder = outputFile.getParentFile();
if (parentFolder != null && !parentFolder.exists()) {
boolean success = parentFolder.mkdirs();
log.info("生成PDF文件结果:{}", success);
}
document.save(outputFile);
document.close();
} catch (Exception e) {
log.error("生成PDF文件结果失败,imgFilePath:{},filePath:{}", imgFilePath, outFile, e);
}
}
private static List<byte[]> getImgByteList(String filePath) throws IOException {
List<byte[]> imageBytesList = new ArrayList<>();
File folder = new File(filePath);
File[] files = folder.listFiles();
if (Objects.isNull(files) || files.length == 0) {
return imageBytesList;
}
for (File file : files) {
if (file.isFile() && isImage(file)) {
byte[] imageBytes = convertImageToBytes(file);
imageBytesList.add(imageBytes);
}
}
return imageBytesList;
}
private static boolean isImage(File file) {
String fileName = file.getName().toLowerCase();
return fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") ||
fileName.endsWith(".png") || fileName.endsWith(".gif") ||
fileName.endsWith(".bmp");
}
private static byte[] convertImageToBytes(File file) throws IOException {
BufferedImage image = ImageIO.read(file);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", outputStream);
return outputStream.toByteArray();
}
}