From c24e33a3d7014db3aeb8cc07877793fbed9cf752 Mon Sep 17 00:00:00 2001 From: Mlxa0324 Date: Fri, 23 Dec 2022 19:01:14 +0800 Subject: [PATCH] 1 --- .../java/util/convertPDF/PDFConvertUtil.java | 505 ++++++++++++++++++ 1 file changed, 505 insertions(+) create mode 100644 admin-framework/admin-convert-pdf/src/main/java/util/convertPDF/PDFConvertUtil.java 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