封装在如下工具类中
import com.aspose.cells.SaveFormat;
import com.aspose.cells.Workbook;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
/**
* PDF工具类
*
* @author yxm
*/
@Slf4j
public abstract class PdfUtil {
/**
* 要去除的水印的字体
*/
private static final String WATERMARK_FONT = "FAAADD";
/**
* 存放照片的PDF页的水平宽度,即左边距,右边距
*/
private static final double SPACE_HORIZONTAL = 20;
/**
* 存放照片的PDF页的竖直高度,即上边距,下边距
*/
private static final double SPACE_VERTICAL = 20;
public static void main(String[] args) {
try {
long beginTime = System.currentTimeMillis();
excelToPdf("E:\\Code\\BCCloud\\ruoyi-modules\\exin-rhaj\\src\\main\\java\\com\\exin\\rhaj\\common\\template\\巡检用户安全检查表-非居.xlsx");
long endTime = System.currentTimeMillis();
System.out.println("执行时间:" + ((endTime - beginTime) / 1000) + "秒");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Excel转换为PDF
*
* @param excelPath 需要被转换的excel源文件全路径带文件名
* @Return void
*/
public static void excelToPdf(String excelPath) throws Exception {
//新建一个pdf文档
String pdfPath = excelPath.substring(0, excelPath.lastIndexOf(".")) + ".pdf";
File pdfFile = new File(pdfPath);
//Excel文件数据
Workbook wb = new Workbook(excelPath);
FileOutputStream fileOS = new FileOutputStream(pdfFile);
//保存为pdf文件
wb.save(fileOS, SaveFormat.PDF);
fileOS.close();
// 去除水印
removeWatermark(pdfPath);
// 添加照片
addImage(pdfFile, 4, 4, new String[]{"C:\\Users\\Administrator\\Pictures\\head.jpg",
"C:\\Users\\Administrator\\Pictures\\head.jpg",
"C:\\Users\\Administrator\\Pictures\\head.jpg",
"C:\\Users\\Administrator\\Pictures\\admin-settings-male.png",
"C:\\Users\\Administrator\\Pictures\\head.jpg",
"C:\\Users\\Administrator\\Pictures\\admin-settings-male.png",
"C:\\Users\\Administrator\\Pictures\\head.jpg",
"C:\\Users\\Administrator\\Pictures\\admin-settings-male.png",
"C:\\Users\\Administrator\\Pictures\\head.jpg",
"C:\\Users\\Administrator\\Pictures\\head.jpg"});
}
/**
* 移除文字水印
*
* @param pdfPath PDF源文件路径
* @return
*/
private static void removeWatermark(String pdfPath) throws IOException {
removeWatermark(new File(pdfPath));
}
/**
* 移除文字水印
*
* @param file PDF源文件
* @return
*/
private static void removeWatermark(File file) throws IOException {
//通过文件名加载文档
PDDocument document = Loader.loadPDF(file);
PDPageTree pages = document.getPages();
Iterator<PDPage> iter = pages.iterator();
while (iter.hasNext()) {
PDPage page = iter.next();
PDResources resources = page.getResources();
COSDictionary dict1 = resources.getCOSObject();
resources.getFontNames().forEach(e -> {
COSDictionary dict2 = dict1.getCOSDictionary(COSName.FONT);
if (e.getName().equals(WATERMARK_FONT)) {
dict2.removeItem(e);
}
page.setResources(new PDResources(dict1));
});
}
file.delete();
document.save(file);
document.close();
}
/**
* 在pdf中添加图片
*
* @param pdfFile PDF源文件
* @param rowNum 每页显示几行照片
* @param colNum 每页显示几列照片
* @param imgPaths 照片路径数组
* @throws IOException
*/
public static void addImage(File pdfFile, int rowNum, int colNum, String[] imgPaths) throws IOException {
// 获得PDF文件流对象
PDDocument pdDocument = Loader.loadPDF(pdfFile);
// 获取文档第一页配置信息
PDRectangle commonMediaBox = pdDocument.getPage(0).getMediaBox();
// 新页宽高
double docWidth = commonMediaBox.getWidth();
double docHeight = commonMediaBox.getHeight();
// 新页内容区宽高
double contentWidth = docWidth - SPACE_HORIZONTAL * 2;
double contentHeight = docHeight - SPACE_VERTICAL * 2;
// 遍历图片路径的指针、路径总数量
int imgPathIndex = 0;
int imgPathLength = imgPaths.length;
// 新增的页数
int newPageNum = (int) Math.ceil(1D * imgPathLength / (rowNum * colNum));
// 生成页数
for (int i = 1; i <= newPageNum; i++) {
// 向文档中添加新页 用于放置图片
PDPage newPage = new PDPage(commonMediaBox);
// 创建pageStream对象
PDPageContentStream pageStream = new PDPageContentStream(pdDocument, newPage, PDPageContentStream.AppendMode.APPEND, true, true);
// 每个图片宽高
double widthUnit = contentWidth / colNum;
double HeightUnit = contentHeight / rowNum;
// pageStream对象绘制图片位置及大小,已知PDF文件左下角为原点(0,0),图片左下角是(x,y),width、height是图片的宽和高
for (int row = rowNum - 1; row >= 0 && imgPathIndex < imgPathLength; row--) {
for (int col = 0; col < colNum && imgPathIndex < imgPathLength; col++) {
// 创建图片对象
PDImageXObject image = PDImageXObject.createFromFile(imgPaths[imgPathIndex], pdDocument);
imgPathIndex++;
pageStream.drawImage(image, (int) (widthUnit * col + SPACE_HORIZONTAL), (int) (HeightUnit * row + SPACE_VERTICAL), (int) widthUnit, (int) HeightUnit);
}
}
pageStream.close();
// 将新页添入文档
pdDocument.addPage(newPage);
}
// 删除原pdf
pdfFile.delete();
// 保存PDF到指定路径
pdDocument.save(pdfFile);
pdDocument.close();
}
}