diff --git a/admin-framework/admin-convert-pdf/src/main/java/util/convertPDF/PDFConvertUtil.java b/admin-framework/admin-convert-pdf/src/main/java/util/convertPDF/PDFConvertUtil.java
new file mode 100644
index 00000000..1f709fa4
--- /dev/null
+++ b/admin-framework/admin-convert-pdf/src/main/java/util/convertPDF/PDFConvertUtil.java
@@ -0,0 +1,505 @@
+package util.convertPDF;
+
+import com.aspose.words.License;
+import com.aspose.words.SaveFormat;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.xslf.usermodel.*;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static util.convertPDF.PDFConvertUtil.TypeEnum.*;
+
+/**
+ * 功能描述:
+ * PDF 转换工具
+ *
+ * @Author: lx
+ * @Date: 2022/12/13 16:26
+ */
+public final class PDFConvertUtil {
+
+ final private static Map> types = new HashMap<>();
+
+ public static enum TypeEnum {
+ WORD, EXCEL, PPT, PPTX, IMG, OTHER
+ }
+
+ static {
+ types.put(WORD, Arrays.asList("DOC", "DOCX"));
+ types.put(EXCEL, Arrays.asList("XLS", "XLSX"));
+ types.put(PPT, Arrays.asList("PPT"));
+ types.put(PPTX, Arrays.asList("PPTX"));
+// types.put(IMG, Arrays.asList("JPEG", "JPG", "PNG"));
+ types.put(OTHER, Arrays.asList("OOXML", "RTF HTML", "OpenDocument", "EPUB", "XPS", "SWF"));
+
+ }
+
+ /**
+ * @param inputStream 源文件输入流
+ * @param outputStream pdf文件输出流
+ **/
+ public static boolean imgToPdf(InputStream inputStream, OutputStream outputStream) {
+
+ Document document = null; PdfWriter pdfWriter = null;
+ try {
+
+ // 创建文档,设置PDF页面的大小 A2-A9, 个人觉得A3最合适
+ document = new Document(PageSize.A6, 0, 0, 0, 0);
+
+ // 新建pdf文档,具体逻辑看.getInstance方法
+ pdfWriter = PdfWriter.getInstance(document, outputStream);
+
+ document.open();
+ document.newPage();
+
+ // 将文件流转换为字节流,便于格式转换
+ BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ byte[] bytes = new byte[1024];
+ int length = 0 ;
+ while (-1 != (length = bufferedInputStream.read(bytes))) {
+ byteArrayOutputStream.write(bytes, 0, length);
+ }
+
+ // 处理img图片
+ Image image = Image.getInstance(byteArrayOutputStream.toByteArray());
+
+ float height = image.getHeight();
+ float width = image.getWidth();
+
+ float percent = 0.0f;
+ // 设置像素或者长宽高,将会影响图片的清晰度,因为只是对图片放大或缩小
+ if (height > width) {
+ // A4 - A9
+ percent = PageSize.A6.getHeight() / height * 100;
+ } else {
+ percent = PageSize.A6.getWidth() / width * 100;
+ }
+
+ image.setAlignment(Image.MIDDLE);
+ image.scalePercent(percent);
+
+ // 将图片放入文档中,完成pdf转换
+ document.add(image);
+ System.out.println("image转换完毕");
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ } finally {
+ close(document, pdfWriter);
+ closeOutput(outputStream);
+ closeInput(inputStream);
+ }
+
+ return true;
+ }
+
+ /**
+ * @param inputStream 源文件输入流
+ * @param outputStream pdf文件输出流
+ **/
+ public static boolean wordToPdfByAspose(InputStream inputStream, OutputStream outputStream) {
+
+ // 验证License 若不验证则转化出的pdf文档会有水印产生
+ if (!getLicense()) {
+ return false;
+ }
+ try {
+ // 将源文件保存在com.aspose.words.Document中,具体的转换格式依靠里面的save方法
+ com.aspose.words.Document doc = new com.aspose.words.Document(inputStream);
+
+ // 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换
+ doc.save(outputStream, SaveFormat.PDF);
+
+ System.out.println("word转换完毕");
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }finally {
+ closeOutput(outputStream);
+ closeInput(inputStream);
+ }
+ return true;
+ }
+
+ /**
+ * 关闭输出流
+ * @param outputStream
+ */
+ private static void closeOutput(OutputStream outputStream) {
+ if (outputStream != null) {
+ try {
+ outputStream.flush();
+ outputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 关闭输出流
+ * @param inputStream
+ */
+ private static void closeInput(InputStream inputStream) {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private static void close(Document document, PdfWriter pdfWriter) {
+ if (document != null) {
+ document.close();
+ }
+ if (pdfWriter != null) {
+ pdfWriter.close();
+ }
+ }
+
+ // 官方文档的要求 无需理会
+ public static boolean getLicense() {
+ boolean result = false;
+ try {
+ String s = "\n" +
+ " \n" +
+ " \n" +
+ " Aspose.Total for Java\n" +
+ " Aspose.Words for Java\n" +
+ " \n" +
+ " Enterprise\n" +
+ " 20991231\n" +
+ " 20991231\n" +
+ " 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7\n" +
+ " \n" +
+ " sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=\n" +
+ "";
+ ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
+ License aposeLic = new License();
+ aposeLic.setLicense(is);
+ result = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+ /**
+ * @param inputStream 源文件输入流
+ * @param outputStream pdf文件输出流
+ **/
+ public static boolean excelToPdf(InputStream inputStream, OutputStream outputStream) {
+ // 验证License 若不验证则转化出的pdf文档会有水印产生
+ if (!getExcelLicense()) {
+ return false;
+ }
+ try {
+ // 原始excel路径
+ com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(inputStream);
+
+ com.aspose.cells.PdfSaveOptions pdfSaveOptions = new com.aspose.cells.PdfSaveOptions();
+ pdfSaveOptions.setOnePagePerSheet(false);
+
+ int[] autoDrawSheets={3};
+ //当excel中对应的sheet页宽度太大时,在PDF中会拆断并分页。此处等比缩放。
+ autoDraw(wb,autoDrawSheets);
+
+ int[] showSheets={0};
+ //隐藏workbook中不需要的sheet页。
+ printSheetPage(wb,showSheets);
+ wb.save(outputStream, pdfSaveOptions);
+ System.out.println("excel转换完毕");
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }finally {
+ closeOutput(outputStream);
+ closeInput(inputStream);
+ }
+ return true;
+ }
+
+
+ /**
+ * 设置打印的sheet 自动拉伸比例
+ * @param wb
+ * @param page 自动拉伸的页的sheet数组
+ */
+ public static void autoDraw(com.aspose.cells.Workbook wb,int[] page){
+ if(null!=page&&page.length>0){
+ for (int i = 0; i < page.length; i++) {
+ wb.getWorksheets().get(i).getHorizontalPageBreaks().clear();
+ wb.getWorksheets().get(i).getVerticalPageBreaks().clear();
+ }
+ }
+ }
+
+ /**
+ * 隐藏workbook中不需要的sheet页。
+ *
+ * @param wb
+ * @param page 显示页的sheet数组
+ */
+ public static void printSheetPage(com.aspose.cells.Workbook wb, int[] page) {
+ for (int i = 1; i < wb.getWorksheets().getCount(); i++) {
+ wb.getWorksheets().get(i).setVisible(false);
+ }
+ if (null == page || page.length == 0) {
+ wb.getWorksheets().get(0).setVisible(true);
+ } else {
+ for (int i = 0; i < page.length; i++) {
+ wb.getWorksheets().get(i).setVisible(true);
+ }
+ }
+ }
+
+ public static boolean getExcelLicense() {
+ boolean result = false;
+ try {
+ String s = "\n" +
+ " \n" +
+ " \n" +
+ " Aspose.Cells for Java\n" +
+ " \n" +
+ " Enterprise\n" +
+ " 29991231\n" +
+ " 29991231\n" +
+ " evilrule\n" +
+ " \n" +
+ " evilrule\n" +
+ "";
+ ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
+ com.aspose.cells.License aposeLic = new com.aspose.cells.License();
+ aposeLic.setLicense(is);
+ result = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
+ /**
+ * pptToPdf
+ * @param inputStream
+ * @param outputStream
+ * @return
+ */
+ public static boolean pptToPdf(InputStream inputStream, OutputStream outputStream) {
+
+ Document document = null;
+ HSLFSlideShow hslfSlideShow = null;
+ PdfWriter pdfWriter = null;
+
+ try {
+ hslfSlideShow = new HSLFSlideShow(inputStream);
+
+ // 获取ppt文件页面
+ Dimension dimension = hslfSlideShow.getPageSize();
+
+ document = new Document();
+
+ // pdfWriter实例
+ pdfWriter = PdfWriter.getInstance(document, outputStream);
+
+ document.open();
+
+ PdfPTable pdfPTable = new PdfPTable(1);
+
+ List hslfSlideList = hslfSlideShow.getSlides();
+
+ for (int i=0; i < hslfSlideList.size(); i++) {
+ HSLFSlide hslfSlide = hslfSlideList.get(i);
+ // 设置字体, 解决中文乱码
+ for (HSLFShape shape : hslfSlide.getShapes()) {
+ if (shape instanceof HSLFTextShape) {
+ HSLFTextShape textShape = (HSLFTextShape) shape;
+
+ for (HSLFTextParagraph textParagraph : textShape.getTextParagraphs()) {
+ for (HSLFTextRun textRun : textParagraph.getTextRuns()) {
+ textRun.setFontFamily("宋体");
+ }
+ }
+ }
+ }
+ BufferedImage bufferedImage = new BufferedImage((int)dimension.getWidth(), (int)dimension.getHeight(), BufferedImage.TYPE_INT_RGB);
+
+ Graphics2D graphics2d = bufferedImage.createGraphics();
+
+ graphics2d.setPaint(Color.white);
+ graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12));
+
+ hslfSlide.draw(graphics2d);
+
+ graphics2d.dispose();
+
+ Image image = Image.getInstance(bufferedImage, null);
+ image.scalePercent(50f);
+
+ // 写入单元格
+ pdfPTable.addCell(new PdfPCell(image, true));
+ document.add(image);
+
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ } finally {
+ close(document, pdfWriter);
+ closeOutput(outputStream);
+ closeInput(inputStream);
+ }
+ System.out.println("ppt转换完毕");
+ return true;
+ }
+
+ /**
+ * pptxToPdf
+ * @param inputStream
+ * @param outputStream
+ * @return
+ */
+ public static boolean pptxToPdf(InputStream inputStream, OutputStream outputStream) {
+
+ Document document = null;
+
+ XMLSlideShow slideShow = null;
+
+ PdfWriter pdfWriter = null;
+
+ try {
+
+ slideShow = new XMLSlideShow(inputStream);
+
+ Dimension dimension = slideShow.getPageSize();
+
+ document = new Document();
+
+ pdfWriter = PdfWriter.getInstance(document, outputStream);
+
+ document.open();
+
+ PdfPTable pdfPTable = new PdfPTable(1);
+
+ List slideList = slideShow.getSlides();
+
+ for (int i = 0, row = slideList.size(); i < row; i++) {
+
+ XSLFSlide slide = slideList.get(i);
+
+ // 设置字体, 解决中文乱码
+ for (XSLFShape shape : slide.getShapes()) {
+ if (shape instanceof XSLFTextShape) {
+ XSLFTextShape textShape = (XSLFTextShape) shape;
+
+ for (XSLFTextParagraph textParagraph : textShape.getTextParagraphs()) {
+ for (XSLFTextRun textRun : textParagraph.getTextRuns()) {
+ textRun.setFontFamily("宋体");
+ }
+ }
+ }
+ }
+
+ BufferedImage bufferedImage = new BufferedImage((int)dimension.getWidth(), (int)dimension.getHeight(), BufferedImage.TYPE_INT_RGB);
+
+ Graphics2D graphics2d = bufferedImage.createGraphics();
+
+ graphics2d.setPaint(Color.white);
+ graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12));
+
+ slide.draw(graphics2d);
+
+ graphics2d.dispose();
+
+ Image image = Image.getInstance(bufferedImage, null);
+ image.scalePercent(50f);
+
+ // 写入单元格
+ pdfPTable.addCell(new PdfPCell(image, true));
+ document.add(image);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ } finally {
+ close(document, pdfWriter);
+ closeOutput(outputStream);
+ closeInput(inputStream);
+ }
+ System.out.println("pptx转换完毕");
+ return true;
+ }
+
+ /**
+ * 功能描述:
+ * 通过文件名后缀来进行转换
+ *
+ * @return {@link boolean}
+ * @Author: lx
+ * @Date: 2022/12/13 16:37
+ */
+ public static boolean convertToPDFByFileNameSuffix(String fileName, InputStream inputStream, OutputStream outputStream) {
+
+ String fileSuffix = getFileSuffix(fileName).toUpperCase();
+
+ if (types.get(WORD).contains(fileSuffix)) {
+ return wordToPdfByAspose(inputStream, outputStream);
+ }
+ if (types.get(EXCEL).contains(fileSuffix)) {
+ return excelToPdf(inputStream, outputStream);
+ }
+ if (types.get(PPT).contains(fileSuffix)) {
+ return pptToPdf(inputStream, outputStream);
+ }
+ if (types.get(PPTX).contains(fileSuffix)) {
+ return pptxToPdf(inputStream, outputStream);
+ }
+// if (types.get(IMG).contains(fileSuffix)) {
+// return imgToPdf(inputStream, outputStream);
+// }
+ if (types.get(OTHER).contains(fileSuffix)) {
+ return wordToPdfByAspose(inputStream, outputStream);
+ }
+ return false;
+ }
+
+ /**
+ * 判断是否可以生成PDF文件
+ * @param fileName
+ * @return
+ */
+ public static boolean isCreatePdf(String fileName) {
+ return types.values().stream().anyMatch(item -> item.contains(getFileSuffix(fileName).toUpperCase()));
+ }
+
+ /**
+ * 功能描述:
+ * 取文件名后缀
+ *
+ * @param fileName
+ * @return {@link String}
+ * @Author: lx
+ * @Date: 2022/12/13 21:51
+ */
+ private static String getFileSuffix(String fileName) {
+ if (!fileName.contains(".")) {
+ throw new RuntimeException("非法的文件名,文件名必须要有文件类型!");
+ }
+ String[] split = fileName.split("\\.");
+ return split[split.length - 1];
+ }
+}
\ No newline at end of file