图片格式转换使用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);
}
}