一、业务需求
1.用户上传多张图片,三方系统只能接收一个文件。所以需要将多个图片合在一个PDF里。
2.用户传的图片大小不一,需要将过大的图片进件缩放,以免图片显示不完整。
二、技术选择
1.itextpdf
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
三、具体实现
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
public class PdfManager {
//画布最宽:500
private static int MAX_WIDTH = 550;
//画布最高:750
private static int MAX_HEIGHT = 750;
private static final Logger LOGGER = LoggerFactory.getLogger(PdfManager.class);
public static void main(String[] args) {
ArrayList<String> sources = new ArrayList<>();
sources.add("d://mer/t1.png");
sources.add("d://mer/t2.png");
sources.add("d://mer/t3.png");
imgToPdf(sources, "merPDF");
}
public static File imgToPdf(ArrayList<String> sources, String target) {
//创建文件并设置文档页边距
Document document = new Document(PageSize.A4, 20, 20, 20, 20);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(target);
PdfWriter.getInstance(document , fos);
//打开文件
document .open();
for (int i = 0; i < sources.size(); i++) {
//获取原图片的宽高
Image image = Image.getInstance(sources.get(i));
float imageHeight = image.getScaledHeight();
float imageWidth = image.getScaledWidth();
// 获取缩放比例
int percent = 100;
//如果原图宽度大于原图高度,则使用宽度来计算缩放比例,否则按高度来计算缩放比较。
//例:原图高1500,宽1000,则使用画布高度和原图高度来计算缩放比例(750/1500*100=50%)
if (imageWidth >= imageHeight) {
//小于画布宽度的图片不用缩放
if (imageWidth > MAX_WIDTH) {
percent = Math.round(MAX_WIDTH / imageWidth * 100) - 3;
}
} else {
//小于画布高度的图片不用缩放
if (imageHeight > MAX_HEIGHT) {
percent = Math.round(MAX_HEIGHT / imageHeight * 100) - 3;
}
}
// 设置图片比例,表示是原来图像的比例(原图越大,percent的值越小);
image.scalePercent(percent);
//图片居中
image.setAlignment(Image.MIDDLE);
//新建一页添加图片
document.newPage();
document.add(image);
}
} catch (Exception e) {
LOGGER.error("{}图片合成失败:{}", target, e.getMessage(), e);
return null;
}finally {
//关闭文档
document.close();
try {
fos.flush();
fos.close();
} catch (IOException e) {
LOGGER.error("关闭文档失败。。。。。。。。。。。");
}
}
File outputPdfFile = new File(target);
if (!outputPdfFile.exists()) {
outputPdfFile.deleteOnExit();
return null;
}
return outputPdfFile;
}
}
四、应该考虑的问题
1.图片放入的目标画布高度是多少,目前使用的是A4纸画布,最宽设置为550,最高设置成750。
2.图片过大需要缩放的比例,缩放后的长宽会不会超过画布的大小。