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.PDFConverUtil.TypeEnum.*; /** * 功能描述:
* PDF 转换工具 * * @Author: lx * @Date: 2022/12/13 16:26 */ public final class PDFConverUtil { final private static Map> types = new HashMap<>(); public static enum TypeEnum { WORD, EXCEL, PPT, PPTX, 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(OTHER, Arrays.asList("OOXML", "RTF HTML", "OpenDocument", "PDF","EPUB", "XPS", "SWF")); } /** * @param inputStream 源文件输入流 * @param outputStream pdf文件输出流 **/ public static boolean imgToPdf(InputStream inputStream, OutputStream outputStream) { Document document = null; try { // 创建文档,设置PDF页面的大小 A2-A9, 个人觉得A3最合适 document = new Document(PageSize.A6, 20, 20, 20, 20); // 新建pdf文档,具体逻辑看.getInstance方法 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 { 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(OTHER).contains(fileSuffix)) { return wordToPdfByAspose(inputStream, outputStream); } return false; } /** * 功能描述:
* 取文件名后缀 * * @param fileName * @return {@link String} * @Author: lx * @Date: 2022/12/13 21:51 */ private static String getFileSuffix(String fileName) { String[] split = fileName.split("\\."); int length = split.length; return split[length - 1]; } }