Java实现文件格式转换(图片,视频,文档,音频)

图片格式转换使用ImageIO 实现

视频,音频格式转换使用FFmpeg 实现

文档格式转换使用Apache PDFBox ,‌Apache POI实现

引入如下依赖:

xml 复制代码
        <!--文件转码FFmpeg-->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.5.10</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.10</version>
        </dependency>
        <!-- 办公文档处理 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.3</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

实现如下:

java 复制代码
package com.core.Utils;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hslf.usermodel.HSLFShape;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.hslf.usermodel.HSLFTextShape;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TranscodeUtil {

    /**
     * 文件转换
     * @param type 文件转换类型(1:图片,2:视频,3:文档,4:音频)
     * @param convertBeforeFileExtension 转换前文件后缀
     * @param convertAfterFileExtension 转换后文件后缀
     * @param multipartFile 文件内容
     * @return
     */
    public Map<String,Object> convert(String type, String convertBeforeFileExtension, String convertAfterFileExtension, MultipartFile multipartFile){
        if (StringUtils.isBlank(type) || StringUtils.isBlank(convertBeforeFileExtension) || StringUtils.isBlank(convertAfterFileExtension) || multipartFile == null){
            return null;
        }
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        Map<String,Object> map = new HashMap<>();
        try {
            if ("1".equals(type)){
                inputStream = multipartFile.getInputStream();
                byteArrayOutputStream = new ByteArrayOutputStream();
                //转换图片
                map = this.convertImage(convertBeforeFileExtension, convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else if ("2".equals(type)){
                inputStream = multipartFile.getInputStream();
                byteArrayOutputStream = new ByteArrayOutputStream();
                //转换视频
                map = this.convertVideo(convertBeforeFileExtension, convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else if ("3".equals(type)){
                inputStream = multipartFile.getInputStream();
                byteArrayOutputStream = new ByteArrayOutputStream();
                //转换文档
                map = this.convertDocument(convertBeforeFileExtension, convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else if ("4".equals(type)){
                inputStream = multipartFile.getInputStream();
                byteArrayOutputStream = new ByteArrayOutputStream();
                //转换音频
                map = this.convertAudio(convertBeforeFileExtension, convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else {
                throw new Exception("文件转换类型有误");
            }
            //保存文件
            if ((Boolean) map.get("flag")){
                String fileName = multipartFile.getOriginalFilename();
                fileName = fileName.substring(0,fileName.lastIndexOf(".")) + "." + convertAfterFileExtension;
                saveFile(fileName, byteArrayOutputStream);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            this.closeInputStream(inputStream);
            this.closeOutputStream(byteArrayOutputStream);
            return map;
        }
    }

    /**
     * 转换图片
     * @param convertBeforeFileExtension
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @return
     */
    public Map<String,Object> convertImage(String convertBeforeFileExtension, String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream){
        Map<String,Object> map = new HashMap<>();
        Boolean flag = false;
        try {
            BufferedImage image = ImageIO.read(inputStream);
            if (image == null){
                throw new Exception("无法读取图片");
            }
            flag = ImageIO.write(image, convertAfterFileExtension, byteArrayOutputStream);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("error", e.getMessage());
        } finally {
            map.put("flag", flag);
            return map;
        }
    }

    /**
     * 转换视频
     * @param convertBeforeFileExtension
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @return
     */
    public Map<String,Object> convertVideo(String convertBeforeFileExtension, String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream){
        Map<String,Object> map = new HashMap<>();
        Boolean flag = false;
        FFmpegFrameGrabber fFmpegFrameGrabber = null;
        FFmpegFrameRecorder fFmpegFrameRecorder = null;
        try {
            //创建FFmpegFrameGrabber对象,读取输入视频
            fFmpegFrameGrabber = new FFmpegFrameGrabber(inputStream);
            fFmpegFrameGrabber.setFormat(convertBeforeFileExtension);
            fFmpegFrameGrabber.start();
            //创建FFmpegFrameRecorder对象,设置输出视频格式
            fFmpegFrameRecorder = new FFmpegFrameRecorder(byteArrayOutputStream, fFmpegFrameGrabber.getImageWidth(), fFmpegFrameGrabber.getImageHeight());
            //设置视频参数
            fFmpegFrameRecorder.setFormat(convertAfterFileExtension);
            fFmpegFrameRecorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
            fFmpegFrameRecorder.setVideoBitrate(fFmpegFrameGrabber.getVideoBitrate());
            fFmpegFrameRecorder.setFrameRate(fFmpegFrameGrabber.getFrameRate());
            //设置音频参数
            fFmpegFrameRecorder.setAudioChannels(fFmpegFrameGrabber.getAudioChannels());
            fFmpegFrameRecorder.setAudioBitrate(fFmpegFrameGrabber.getAudioBitrate());
            fFmpegFrameRecorder.setSampleRate(fFmpegFrameGrabber.getSampleRate());
            fFmpegFrameRecorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
            fFmpegFrameRecorder.start();
            //循环读取视频帧并进行录制
            Frame frame;
            while ((frame = fFmpegFrameGrabber.grabFrame()) != null){
                fFmpegFrameRecorder.record(frame);
            }
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
            map.put("error", e.getMessage());
        } finally {
            this.closeFFmpegFrameGrabber(fFmpegFrameGrabber);
            this.closeFFmpegFrameRecorder(fFmpegFrameRecorder);
            map.put("flag", flag);
            return map;
        }
    }

    /**
     * 转换文档
     * @param convertBeforeFileExtension
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @return
     */
    public Map<String,Object> convertDocument(String convertBeforeFileExtension, String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream){
        Map<String,Object> map = new HashMap<>();
        Boolean flag = false;
        try {
            if ("doc".equals(convertBeforeFileExtension)){
                //转换doc文件
                this.convertDOC(convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else if ("docx".equals(convertBeforeFileExtension)){
                //转换docx文件
                this.convertDOCX(convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else if ("xls".equals(convertBeforeFileExtension)){
                //转换xls文件
                this.convertXLS(convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else if ("xlsx".equals(convertBeforeFileExtension)){
                //转换xlsx文件
                this.convertXLSX(convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else if ("ppt".equals(convertBeforeFileExtension)){
                //转换ppt文件
                this.convertPPT(convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else if ("pptx".equals(convertBeforeFileExtension)){
                //转换pptx文件
                this.convertPPTX(convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }else if ("pdf".equals(convertBeforeFileExtension)){
                //转换pdf文件
                this.convertPDF(convertAfterFileExtension, inputStream, byteArrayOutputStream);
            }
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
            map.put("error", e.getMessage());
        } finally {
            map.put("flag", flag);
            return map;
        }
    }

    /**
     * 转换DOC
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @throws IOException
     * @throws DocumentException
     */
    public void convertDOC(String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream) throws IOException, DocumentException {
        if ("xlsx".equals(convertAfterFileExtension)){
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
            Sheet sheet = xssfWorkbook.createSheet("data");
            int row = 0;
            HWPFDocument hwpfDocument = new HWPFDocument(inputStream);
            WordExtractor wordExtractor = new WordExtractor(hwpfDocument);
            String[] paragraphs = wordExtractor.getParagraphText();
            for (String paragraph : paragraphs) {
                Row sheetRow = sheet.createRow(row++);
                Cell cell = sheetRow.createCell(0);
                cell.setCellValue(paragraph);
            }
            xssfWorkbook.write(byteArrayOutputStream);
            xssfWorkbook.close();
            hwpfDocument.close();
        }else if ("pptx".equals(convertAfterFileExtension)){
            XMLSlideShow xmlSlideShow = new XMLSlideShow();
            HWPFDocument hwpfDocument = new HWPFDocument(inputStream);
            WordExtractor wordExtractor = new WordExtractor(hwpfDocument);
            String[] paragraphs = wordExtractor.getParagraphText();
            for (String paragraph : paragraphs) {
                XSLFSlide slide = xmlSlideShow.createSlide();
                XSLFTextBox textBox = slide.createTextBox();
                textBox.setText(paragraph);
                textBox.setAnchor(new Rectangle(50,50,600,100));
            }
            xmlSlideShow.write(byteArrayOutputStream);
            xmlSlideShow.close();
            hwpfDocument.close();
        }else if ("pdf".equals(convertAfterFileExtension)){
            Document document = new Document();
            PdfWriter.getInstance(document, byteArrayOutputStream);
            document.open();
            HWPFDocument hwpfDocument = new HWPFDocument(inputStream);
            WordExtractor wordExtractor = new WordExtractor(hwpfDocument);
            String[] paragraphs = wordExtractor.getParagraphText();
            com.itextpdf.text.Font font = createFont();
            for (String paragraph : paragraphs) {
                document.add(new Paragraph(paragraph, font));
            }
            document.close();
            hwpfDocument.close();
        }else if ("jpg".equals(convertAfterFileExtension)){

        }
    }

    /**
     * 转换DOCX
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @throws IOException
     * @throws DocumentException
     */
    public void convertDOCX(String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream) throws IOException, DocumentException {
        if ("xlsx".equals(convertAfterFileExtension)){
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
            Sheet sheet = xssfWorkbook.createSheet("data");
            int row = 0;
            XWPFDocument xwpfDocument = new XWPFDocument(inputStream);
            java.util.List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs();
            for (XWPFParagraph paragraph : paragraphs) {
                Row sheetRow = sheet.createRow(row++);
                Cell cell = sheetRow.createCell(0);
                cell.setCellValue(paragraph.getText());
            }
            xssfWorkbook.write(byteArrayOutputStream);
            xssfWorkbook.close();
            xwpfDocument.close();
        }else if ("pptx".equals(convertAfterFileExtension)){
            XMLSlideShow xmlSlideShow = new XMLSlideShow();
            XWPFDocument xwpfDocument = new XWPFDocument(inputStream);
            java.util.List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs();
            for (XWPFParagraph paragraph : paragraphs) {
                XSLFSlide slide = xmlSlideShow.createSlide();
                XSLFTextBox textBox = slide.createTextBox();
                textBox.setText(paragraph.getText());
                textBox.setAnchor(new Rectangle(50,50,600,100));
            }
            xmlSlideShow.write(byteArrayOutputStream);
            xmlSlideShow.close();
            xwpfDocument.close();
        }else if ("pdf".equals(convertAfterFileExtension)){
            Document document = new Document();
            PdfWriter.getInstance(document, byteArrayOutputStream);
            document.open();
            XWPFDocument xwpfDocument = new XWPFDocument(inputStream);
            List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs();
            com.itextpdf.text.Font font = createFont();
            for (XWPFParagraph paragraph : paragraphs) {
                for (XWPFRun run : paragraph.getRuns()){
                    document.add(new Paragraph(run.getText(0), font));
                }
            }
            document.close();
            xwpfDocument.close();
        }else if ("jpg".equals(convertAfterFileExtension)){

        }
    }

    /**
     * 转换XLS
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @throws IOException
     * @throws DocumentException
     */
    public void convertXLS(String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream) throws IOException, DocumentException {
        if ("docx".equals(convertAfterFileExtension)){
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream);
            XWPFDocument xwpfDocument = new XWPFDocument();
            for (int i = 0; i < hssfWorkbook.getNumberOfSheets(); i++) {
                Sheet sheet = hssfWorkbook.getSheetAt(i);
                XWPFParagraph title = xwpfDocument.createParagraph();
                title.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun titleRun = title.createRun();
                titleRun.setText("Sheet: " + sheet.getSheetName());
                titleRun.setBold(true);
                titleRun.setFontSize(16);
                for (Row row : sheet){
                    XWPFParagraph paragraph = xwpfDocument.createParagraph();
                    XWPFRun run = paragraph.createRun();
                    StringBuilder stringBuilder = new StringBuilder();
                    for (Cell cell : row){
                        cell.setCellType(CellType.STRING);
                        stringBuilder.append(cell.getStringCellValue()).append("\t");
                    }
                    run.setText(stringBuilder.toString());
                }
                xwpfDocument.createParagraph().createRun().addBreak();
            }
            xwpfDocument.write(byteArrayOutputStream);
            xwpfDocument.close();
            hssfWorkbook.close();
        }else if ("pptx".equals(convertAfterFileExtension)){
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream);
            XMLSlideShow xmlSlideShow = new XMLSlideShow();
            for (int i = 0; i < hssfWorkbook.getNumberOfSheets(); i++) {
                Sheet sheet = hssfWorkbook.getSheetAt(i);
                XSLFSlide slide = xmlSlideShow.createSlide();
                XSLFTextBox title = slide.createTextBox();
                title.setText("Sheet: " + sheet.getSheetName());
                title.setAnchor(new Rectangle(50,20,600,30));
                int yPos = 60;
                for (Row row : sheet){
                    StringBuilder stringBuilder = new StringBuilder();
                    for (Cell cell : row){
                        cell.setCellType(CellType.STRING);
                        stringBuilder.append(cell.getStringCellValue()).append("\t");
                    }
                    XSLFTextBox textBox = slide.createTextBox();
                    textBox.setText(stringBuilder.toString());
                    textBox.setAnchor(new Rectangle(50,yPos,600,30));
                    yPos += 30;
                    if (yPos > 400){
                        slide = xmlSlideShow.createSlide();
                        yPos = 60;
                    }
                }
            }
            xmlSlideShow.write(byteArrayOutputStream);
            xmlSlideShow.close();
            hssfWorkbook.close();
        }else if ("pdf".equals(convertAfterFileExtension)){
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream);
            Document document = new Document();
            PdfWriter.getInstance(document, byteArrayOutputStream);
            document.open();
            com.itextpdf.text.Font font = createFont();
            for (int i = 0; i < hssfWorkbook.getNumberOfSheets(); i++) {
                Sheet sheet = hssfWorkbook.getSheetAt(i);
                document.add(new Paragraph("Sheet: " + sheet.getSheetName(),font));
                for (Row row : sheet){
                    StringBuilder stringBuilder = new StringBuilder();
                    for (Cell cell : row){
                        cell.setCellType(CellType.STRING);
                        stringBuilder.append(cell.getStringCellValue()).append("\t");
                    }
                    document.add(new Paragraph(stringBuilder.toString(),font));
                }
                document.add(new Paragraph("\n"));
            }
            document.close();
            hssfWorkbook.close();
        }else if ("jpg".equals(convertAfterFileExtension)){

        }
    }

    /**
     * 转换XLSX
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @throws IOException
     * @throws DocumentException
     */
    public void convertXLSX(String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream) throws IOException, DocumentException {
        if ("docx".equals(convertAfterFileExtension)){
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
            XWPFDocument xwpfDocument = new XWPFDocument();
            for (int i = 0; i < xssfWorkbook.getNumberOfSheets(); i++) {
                Sheet sheet = xssfWorkbook.getSheetAt(i);
                XWPFParagraph title = xwpfDocument.createParagraph();
                title.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun titleRun = title.createRun();
                titleRun.setText("Sheet: " + sheet.getSheetName());
                titleRun.setBold(true);
                titleRun.setFontSize(16);
                for (Row row : sheet){
                    XWPFParagraph paragraph = xwpfDocument.createParagraph();
                    XWPFRun run = paragraph.createRun();
                    StringBuilder stringBuilder = new StringBuilder();
                    for (Cell cell : row){
                        cell.setCellType(CellType.STRING);
                        stringBuilder.append(cell.getStringCellValue()).append("\t");
                    }
                    run.setText(stringBuilder.toString());
                }
                xwpfDocument.createParagraph().createRun().addBreak();
            }
            xwpfDocument.write(byteArrayOutputStream);
            xwpfDocument.close();
            xssfWorkbook.close();
        }else if ("pptx".equals(convertAfterFileExtension)){
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
            XMLSlideShow xmlSlideShow = new XMLSlideShow();
            for (int i = 0; i < xssfWorkbook.getNumberOfSheets(); i++) {
                Sheet sheet = xssfWorkbook.getSheetAt(i);
                XSLFSlide slide = xmlSlideShow.createSlide();
                XSLFTextBox title = slide.createTextBox();
                title.setText("Sheet: " + sheet.getSheetName());
                title.setAnchor(new Rectangle(50,20,600,30));
                int yPos = 60;
                for (Row row : sheet){
                    StringBuilder stringBuilder = new StringBuilder();
                    for (Cell cell : row){
                        cell.setCellType(CellType.STRING);
                        stringBuilder.append(cell.getStringCellValue()).append("\t");
                    }
                    XSLFTextBox textBox = slide.createTextBox();
                    textBox.setText(stringBuilder.toString());
                    textBox.setAnchor(new Rectangle(50,yPos,600,30));
                    yPos += 30;
                    if (yPos > 400){
                        slide = xmlSlideShow.createSlide();
                        yPos = 60;
                    }
                }
            }
            xmlSlideShow.write(byteArrayOutputStream);
            xmlSlideShow.close();
            xssfWorkbook.close();
        }else if ("pdf".equals(convertAfterFileExtension)){
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
            Document document = new Document();
            PdfWriter.getInstance(document, byteArrayOutputStream);
            document.open();
            com.itextpdf.text.Font font = createFont();
            for (int i = 0; i < xssfWorkbook.getNumberOfSheets(); i++) {
                Sheet sheet = xssfWorkbook.getSheetAt(i);
                document.add(new Paragraph("Sheet: " + sheet.getSheetName(),font));
                for (Row row : sheet){
                    StringBuilder stringBuilder = new StringBuilder();
                    for (Cell cell : row){
                        cell.setCellType(CellType.STRING);
                        stringBuilder.append(cell.getStringCellValue()).append("\t");
                    }
                    document.add(new Paragraph(stringBuilder.toString(),font));
                }
                document.add(new Paragraph("\n"));
            }
            document.close();
            xssfWorkbook.close();
        }else if ("jpg".equals(convertAfterFileExtension)){

        }
    }

    /**
     * 转换PPT
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @throws IOException
     * @throws DocumentException
     */
    public void convertPPT(String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream) throws IOException, DocumentException {
        if ("docx".equals(convertAfterFileExtension)){
            HSLFSlideShow hslfSlideShow = new HSLFSlideShow(inputStream);
            XWPFDocument xwpfDocument = new XWPFDocument();
            for (HSLFSlide hslfSlide : hslfSlideShow.getSlides()){
                XWPFParagraph title = xwpfDocument.createParagraph();
                title.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun titleRun = title.createRun();
                titleRun.setText("Slide " + (hslfSlideShow.getSlides().indexOf(hslfSlide) + 1));
                titleRun.setBold(true);
                titleRun.setFontSize(16);
                for (HSLFShape hslfShape : hslfSlide.getShapes()){
                    if (hslfShape instanceof HSLFTextShape){
                        HSLFTextShape hslfTextShape = (HSLFTextShape) hslfShape;
                        XWPFParagraph text = xwpfDocument.createParagraph();
                        XWPFRun textRun = text.createRun();
                        textRun.setText(hslfTextShape.getText());
                    }
                }
            }
            xwpfDocument.createParagraph().createRun().addBreak();
            xwpfDocument.write(byteArrayOutputStream);
            xwpfDocument.close();
            hslfSlideShow.close();
        }else if ("xlsx".equals(convertAfterFileExtension)){
            HSLFSlideShow hslfSlideShow = new HSLFSlideShow(inputStream);
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
            XSSFSheet sheet = xssfWorkbook.createSheet("data");
            int row = 0;
            for (HSLFSlide hslfSlide : hslfSlideShow.getSlides()){
                XSSFRow sheetRow = sheet.createRow(row++);
                XSSFCell cell = sheetRow.createCell(0);
                StringBuilder stringBuilder = new StringBuilder();
                for (HSLFShape hslfShape : hslfSlide.getShapes()){
                    if (hslfShape instanceof HSLFTextShape){
                        HSLFTextShape hslfTextShape = (HSLFTextShape) hslfShape;
                        stringBuilder.append(hslfTextShape.getText()).append("\n");
                    }
                }
                cell.setCellValue(stringBuilder.toString());
            }
            xssfWorkbook.write(byteArrayOutputStream);
            xssfWorkbook.close();
            hslfSlideShow.close();
        }else if ("pdf".equals(convertAfterFileExtension)){
            HSLFSlideShow hslfSlideShow = new HSLFSlideShow(inputStream);
            Document document = new Document();
            PdfWriter.getInstance(document,byteArrayOutputStream);
            document.open();
            com.itextpdf.text.Font font = createFont();
            for (HSLFSlide hslfSlide : hslfSlideShow.getSlides()){
                document.add(new Paragraph("Slide " + (hslfSlideShow.getSlides().indexOf(hslfSlide) + 1),font));
                for (HSLFShape hslfShape : hslfSlide.getShapes()){
                    if (hslfShape instanceof HSLFTextShape){
                        HSLFTextShape hslfTextShape = (HSLFTextShape) hslfShape;
                        document.add(new Paragraph(hslfTextShape.getText(),font));
                    }
                }
                document.add(new Paragraph("\n"));
            }
            document.close();
            hslfSlideShow.close();
        }else if ("jpg".equals(convertAfterFileExtension)){

        }
    }

    /**
     * 转换PPTX
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @throws IOException
     * @throws DocumentException
     */
    public void convertPPTX(String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream) throws IOException, DocumentException {
        if ("docx".equals(convertAfterFileExtension)){
            XMLSlideShow xmlSlideShow = new XMLSlideShow(inputStream);
            XWPFDocument xwpfDocument = new XWPFDocument();
            for (XSLFSlide xslfSlide : xmlSlideShow.getSlides()){
                XWPFParagraph title = xwpfDocument.createParagraph();
                title.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun titleRun = title.createRun();
                titleRun.setText("Slide " + (xmlSlideShow.getSlides().indexOf(xslfSlide) + 1));
                titleRun.setBold(true);
                titleRun.setFontSize(16);
                for (XSLFShape xslfShape : xslfSlide.getShapes()){
                    if (xslfShape instanceof XSLFTextShape){
                        XSLFTextShape xslfTextShape = (XSLFTextShape) xslfShape;
                        XWPFParagraph text = xwpfDocument.createParagraph();
                        XWPFRun textRun = text.createRun();
                        textRun.setText(xslfTextShape.getText());
                    }
                }
            }
            xwpfDocument.createParagraph().createRun().addBreak();
            xwpfDocument.write(byteArrayOutputStream);
            xwpfDocument.close();
            xmlSlideShow.close();
        }else if ("xlsx".equals(convertAfterFileExtension)){
            XMLSlideShow xmlSlideShow = new XMLSlideShow(inputStream);
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
            XSSFSheet sheet = xssfWorkbook.createSheet("data");
            int row = 0;
            for (XSLFSlide xslfSlide : xmlSlideShow.getSlides()){
                XSSFRow sheetRow = sheet.createRow(row++);
                XSSFCell cell = sheetRow.createCell(0);
                StringBuilder stringBuilder = new StringBuilder();
                for (XSLFShape xslfShape : xslfSlide.getShapes()){
                    if (xslfShape instanceof XSLFTextShape){
                        XSLFTextShape xslfTextShape = (XSLFTextShape) xslfShape;
                        stringBuilder.append(xslfTextShape.getText()).append("\n");
                    }
                }
                cell.setCellValue(stringBuilder.toString());
            }
            xssfWorkbook.write(byteArrayOutputStream);
            xssfWorkbook.close();
            xmlSlideShow.close();
        }else if ("pdf".equals(convertAfterFileExtension)){
            XMLSlideShow xmlSlideShow = new XMLSlideShow(inputStream);
            Document document = new Document();
            PdfWriter.getInstance(document,byteArrayOutputStream);
            document.open();
            com.itextpdf.text.Font font = createFont();
            for (XSLFSlide xslfSlide : xmlSlideShow.getSlides()){
                document.add(new Paragraph("Slide " + (xmlSlideShow.getSlides().indexOf(xslfSlide) + 1),font));
                for (XSLFShape xslfShape : xslfSlide.getShapes()){
                    if (xslfShape instanceof XSLFTextShape){
                        XSLFTextShape xslfTextShape = (XSLFTextShape) xslfShape;
                        document.add(new Paragraph(xslfTextShape.getText(),font));
                    }
                }
                document.add(new Paragraph("\n"));
            }
            document.close();
            xmlSlideShow.close();
        }else if ("jpg".equals(convertAfterFileExtension)){

        }
    }

    /**
     * 转换PDF
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @throws IOException
     */
    public void convertPDF(String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream) throws IOException {
        if ("docx".equals(convertAfterFileExtension)){
            PdfReader pdfReader = new PdfReader(inputStream);
            XWPFDocument xwpfDocument = new XWPFDocument();
            for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {
                String text = PdfTextExtractor.getTextFromPage(pdfReader, i);
                String[] split = text.split("\n");
                XWPFParagraph title = xwpfDocument.createParagraph();
                title.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun titleRun = title.createRun();
                titleRun.setText("Page " + i);
                titleRun.setBold(true);
                titleRun.setFontSize(16);
                for (String line : split) {
                    XWPFParagraph paragraph = xwpfDocument.createParagraph();
                    XWPFRun run = paragraph.createRun();
                    run.setText(line);
                }
            }
            xwpfDocument.createParagraph().createRun().addBreak();
            xwpfDocument.write(byteArrayOutputStream);
            xwpfDocument.close();
            pdfReader.close();
        }else if ("xlsx".equals(convertAfterFileExtension)){
            PdfReader pdfReader = new PdfReader(inputStream);
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
            Sheet sheet = xssfWorkbook.createSheet("data");
            int row = 0;
            for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {
                String text = PdfTextExtractor.getTextFromPage(pdfReader, i);
                String[] split = text.split("\n");
                Row title = sheet.createRow(row++);
                Cell titleCell = title.createCell(0);
                titleCell.setCellValue("Page " + i);
                for (String line : split) {
                    Row sheetRow = sheet.createRow(row++);
                    Cell cell = sheetRow.createCell(0);
                    cell.setCellValue(line);
                }
                row++;
            }
            xssfWorkbook.write(byteArrayOutputStream);
            xssfWorkbook.close();
            pdfReader.close();
        }else if ("pptx".equals(convertAfterFileExtension)){
            PdfReader pdfReader = new PdfReader(inputStream);
            XMLSlideShow xmlSlideShow = new XMLSlideShow();
            for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {
                String text = PdfTextExtractor.getTextFromPage(pdfReader, i);
                String[] split = text.split("\n");
                XSLFSlide slide = xmlSlideShow.createSlide();
                XSLFTextBox title = slide.createTextBox();
                title.setText("Page " + i);
                title.setAnchor(new Rectangle(50,20,600,30));
                int yPos = 60;
                for (String line : split) {
                    XSLFTextBox textBox = slide.createTextBox();
                    textBox.setText(line);
                    textBox.setAnchor(new Rectangle(50,yPos,600,30));
                    yPos += 30;
                    if (yPos > 400){
                        slide = xmlSlideShow.createSlide();
                        yPos = 60;
                    }
                }
            }
            xmlSlideShow.write(byteArrayOutputStream);
            xmlSlideShow.close();
            pdfReader.close();
        }else if ("jpg".equals(convertAfterFileExtension)){

        }
    }

    /**
     * 转换音频
     * @param convertBeforeFileExtension
     * @param convertAfterFileExtension
     * @param inputStream
     * @param byteArrayOutputStream
     * @return
     */
    public Map<String,Object> convertAudio(String convertBeforeFileExtension, String convertAfterFileExtension, InputStream inputStream, ByteArrayOutputStream byteArrayOutputStream){
        Map<String,Object> map = new HashMap<>();
        Boolean flag = false;
        FFmpegFrameGrabber fFmpegFrameGrabber = null;
        FFmpegFrameRecorder fFmpegFrameRecorder = null;
        try {
            //创建FFmpegFrameGrabber对象
            fFmpegFrameGrabber = new FFmpegFrameGrabber(inputStream);
            fFmpegFrameGrabber.setFormat(convertBeforeFileExtension);
            fFmpegFrameGrabber.start();
            //创建FFmpegFrameRecorder对象
            fFmpegFrameRecorder = new FFmpegFrameRecorder(byteArrayOutputStream, fFmpegFrameGrabber.getAudioChannels());
            fFmpegFrameRecorder.setFormat(convertAfterFileExtension);
            fFmpegFrameRecorder.setSampleRate(fFmpegFrameGrabber.getSampleRate());
            fFmpegFrameRecorder.start();
            //循环读取视频帧并进行录制
            Frame frame;
            while ((frame = fFmpegFrameGrabber.grabFrame()) != null){
                fFmpegFrameRecorder.record(frame);
            }
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
            map.put("error", e.getMessage());
        } finally {
            this.closeFFmpegFrameGrabber(fFmpegFrameGrabber);
            this.closeFFmpegFrameRecorder(fFmpegFrameRecorder);
            map.put("flag", flag);
            return map;
        }
    }

    public void saveFile(String fileName, ByteArrayOutputStream byteArrayOutputStream){
        try (FileOutputStream fileOutputStream = new FileOutputStream(fileName)) {
            byteArrayOutputStream.writeTo(fileOutputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭输入流
     * @param inputStream
     */
    public void closeInputStream(InputStream inputStream){
        if (inputStream != null){
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭输出流
     * @param outputStream
     */
    public void closeOutputStream(OutputStream outputStream){
        if (outputStream != null){
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭抓取器
     * @param fFmpegFrameGrabber
     */
    public void closeFFmpegFrameGrabber(FFmpegFrameGrabber fFmpegFrameGrabber){
        if (fFmpegFrameGrabber != null){
            try {
                fFmpegFrameGrabber.stop();
            } catch (FFmpegFrameGrabber.Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭录制器
     * @param fFmpegFrameRecorder
     */
    public void closeFFmpegFrameRecorder(FFmpegFrameRecorder fFmpegFrameRecorder){
        if (fFmpegFrameRecorder != null){
            try {
                fFmpegFrameRecorder.stop();
            } catch (FFmpegFrameRecorder.Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 创建字体
     * @return
     * @throws IOException
     * @throws DocumentException
     */
    private static com.itextpdf.text.Font createFont() throws IOException, DocumentException {
        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        return new com.itextpdf.text.Font(bf, 12, com.itextpdf.text.Font.NORMAL);
    }

}
相关推荐
愿你天黑有灯下雨有伞17 小时前
高性能Java并发编程:如何优雅地使用CompletableFuture进行异步编排
java
indexsunny17 小时前
互联网大厂Java面试实战:基于电商场景的Spring Boot与微服务技术问答
java·spring boot·微服务·面试·hibernate·电商场景·技术问答
qq_124987075317 小时前
基于Spring Boot的电影票网上购票系统的设计与实现(源码+论文+部署+安装)
java·大数据·spring boot·后端·spring·毕业设计·计算机毕业设计
无心水17 小时前
【分布式利器:腾讯TSF】6、TSF可观测性体系建设实战:Java全链路Metrics+Tracing+Logging落地
java·分布式·架构·wpf·分布式利器·腾讯tsf·分布式利器:腾讯tsf
小鸡脚来咯17 小时前
Java字符串详解
java·开发语言
麦兜*17 小时前
【Spring Boot】 接口性能优化“十板斧”:从数据库连接到 JVM 调优的全链路提升
java·大数据·数据库·spring boot·后端·spring cloud·性能优化
廋到被风吹走17 小时前
【Spring 】Spring Security深度解析:过滤器链、认证授权架构与现代集成方案
java·spring·架构
蛐蛐蜉蝣耶17 小时前
Spring Boot实现DynamicMethodMatcherPointcut示例
java·spring boot·后端
予枫的编程笔记18 小时前
Elasticsearch聚合分析与大规模数据处理:解锁超越搜索的进阶能力
java·大数据·人工智能·分布式·后端·elasticsearch·全文检索