将Excel转为PDF、PDF添加图片

封装在如下工具类中

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();
    }
}

相关推荐

  1. Excel转为PDF、PDF添加图片

    2024-03-19 12:28:10       43 阅读
  2. Excel(11) : 生成xlsx添加图片

    2024-03-19 12:28:10       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-19 12:28:10       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-19 12:28:10       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-19 12:28:10       82 阅读
  4. Python语言-面向对象

    2024-03-19 12:28:10       91 阅读

热门阅读

  1. excel是编程语言?

    2024-03-19 12:28:10       41 阅读
  2. C语言经典面试题目(十五)

    2024-03-19 12:28:10       42 阅读
  3. mysql 常见问题

    2024-03-19 12:28:10       44 阅读
  4. 人工智能需要的数学基础有哪些?

    2024-03-19 12:28:10       41 阅读
  5. Python基础知识

    2024-03-19 12:28:10       41 阅读
  6. windows 自动启动jar

    2024-03-19 12:28:10       39 阅读
  7. Linux:vim详解及使用

    2024-03-19 12:28:10       36 阅读
  8. P1041 [NOIP2003 提高组] 传染病控制

    2024-03-19 12:28:10       43 阅读
  9. Windows程序员用MAC:初始设置(用起来像win一些)

    2024-03-19 12:28:10       49 阅读
  10. 【无标题】

    2024-03-19 12:28:10       43 阅读
  11. MacOS安装Homebrew教程

    2024-03-19 12:28:10       44 阅读
  12. c# Action 关键字使用

    2024-03-19 12:28:10       43 阅读