maven项目添加依赖包
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-cells</artifactId>
<version>22.10</version>
</dependency>
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-words</artifactId>
<version>23.1</version>
</dependency>
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-pdf</artifactId>
<version>23.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>3.2.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-reload4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>SparseBitSet</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.0</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.26.0-GA</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.7</version>
</dependency>
转PDF及图片工具类:
import com.aspose.cells.PdfSaveOptions;
import com.aspose.cells.Workbook;
import com.aspose.pdf.PageCollection;
import com.aspose.pdf.devices.JpegDevice;
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.commons.io.output.UnsynchronizedByteArrayOutputStream;
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.List;
public class PdfConverUtil {
/**
*
* @param inputStream 源文件输入流
* @param outputStream PDF文件输入流
* @return
*/
public static boolean imgToPdf(InputStream inputStream, OutputStream outputStream){
Document document = null;
try{
//创建文档,三个字pdf页面的大小 A2-A9,个人觉得A3最合适
document = new Document(PageSize.A3,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 {
try{
if (document != null){
document.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
return true;
}
public static boolean wordTopdfByAspose(InputStream inputStream,OutputStream outputStream){
//验证License 若不验证则转化除的PDF文档会有水印产生
if (!getLicense()){
return false;
}
try{
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 {
if (outputStream != null){
try{
outputStream.flush();
outputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
if (inputStream != null){
try{
inputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return true;
}
// 官方文档的要求 无需理会
public static boolean getLicense() {
boolean result = false;
try {
String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static boolean excelToPdf(InputStream inputStream,OutputStream outputStream){
if (!getExeclLicense()){
return false;
}
try{
Workbook workbook = new Workbook(inputStream);
PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
pdfSaveOptions.setOnePagePerSheet(false);
int[] autoDrawSheets={3};
autoDraw(workbook,autoDrawSheets);
int[] showSheets={0};
//隐藏workbook中不需要的sheet页
printSheetPage(workbook,showSheets);
workbook.save(outputStream,pdfSaveOptions);
outputStream.flush();
outputStream.close();
System.out.println("excel转换完毕");
}catch (Exception e){
e.printStackTrace();
}finally {
if (outputStream != null){
try{
outputStream.flush();
outputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
if (inputStream != null){
try{
inputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return true;
}
public static boolean getExeclLicense() {
boolean result = false;
try {
String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
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;
}
//隐藏workbook中不需要的sheet页
public static void printSheetPage(Workbook workbook, int[] page) {
for (int i = 1;i < workbook.getWorksheets().getCount();i++){
workbook.getWorksheets().get(i).setVisible(false);
}
if (null == page || page.length == 0){
workbook.getWorksheets().get(0).setVisible(true);
}else{
for (int i = 0; i < page.length;i++){
workbook.getWorksheets().get(i).setVisible(true);
}
}
}
//设置打印的sheet,自动拉伸比例
public static void autoDraw(Workbook workbook, int[] page) {
if (null != page && page.length > 0){
for (int i = 0;i < page.length;i++){
workbook.getWorksheets().get(i).getHorizontalPageBreaks().clear();
workbook.getWorksheets().get(i).getVerticalPageBreaks().clear();
}
}
}
/**
* 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<HSLFSlide> 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 {
if (document != null) {
document.close();
}
if (pdfWriter != null) {
pdfWriter.close();
}
if (outputStream != null){
try{
outputStream.flush();
outputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
if (inputStream != null){
try{
inputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
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<XSLFSlide> 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 {
if (document != null) {
document.close();
}
if (pdfWriter != null) {
pdfWriter.close();
}
if (outputStream != null){
try{
outputStream.flush();
outputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
if (inputStream != null){
try{
inputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
System.out.println("pptx转换完毕");
return true;
}
/**
* pdf生成图片(第一页下标从1开始)
*
* @param pdfPath
* @param imgFullPathName
*/
public static boolean pdfToImg1(String pdfPath, String imgFullPathName) {
com.aspose.pdf.Document pdf = new com.aspose.pdf.Document(pdfPath);
PageCollection pages = pdf.getPages();
// pdf总页数
int size = pages.size();
boolean isOne = false;
/**
* 图片宽度:800 图片高度:100 分辨率 960 Quality [0-100] 最大100 new JpegDevice(800, 1000,
* resolution, 90);
*/
JpegDevice jpegDevice = new JpegDevice(100);
//只取一张图片
if (size > 0){
if (size == 1){
//是否只有一张图片
isOne = true;
}
// 输出路径
FileOutputStream fileOs = null;
try {
// File file = new File(imgFullPathName);
File file = new File(imgFullPathName+".png");
if (!file.exists()) {
file.createNewFile();
}
fileOs = new FileOutputStream(file);
jpegDevice.process(pages.get_Item(1), fileOs);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileOs != null) {
fileOs.flush();
fileOs.close();
}
pdf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return isOne;
}
public static void main(String[] args) {
// imgae to pdf
/* try {
FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\40239a44de0cd28ab095674e313419c6.png");
FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\40239a44de0cd28ab095674e313419c6.pdf");
PdfConverUtil.imgToPdf(inputStream, byteArrayOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// doc/docx to pdf
try {
FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\45c686e8-c4ba-4f55-ac9a-f9269f3a0685-20230710050128776.docx");
FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\45c686e8-c4ba-4f55-ac9a-f9269f3a0685-20230710050128776.pdf");
PdfConverUtil.wordTopdfByAspose(inputStream, byteArrayOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// execl to pdf
try {
FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\0b75f563d174464299ff964522e98569.xlsx");
FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\0b75f563d174464299ff964522e98569.pdf");
PdfConverUtil.excelToPdf(inputStream, byteArrayOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
*/
// ppt tp pdf
/*try {
FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\jjj.ppt");
FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\jjj.pdf");
PdfConverUtil.pptToPdf(inputStream, byteArrayOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// pptx to pdf
try {
FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\2.pptx");
FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\2.pdf");
PdfConverUtil.pptxToPdf(inputStream, byteArrayOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}*/
pdfToImg1("C:\\Users\\zmd\\Downloads\\45c686e8-c4ba-4f55-ac9a-f9269f3a0685-20230710050128776.pdf",
"C:\\Users\\zmd\\Downloads\\45c686e8-c4ba-4f55-ac9a-f9269f3a0685-20230710050128776");
}
}
图片裁剪:
/**
* 进行裁剪操作
*
* @param originalImage the original image
* @param width the width
* @param height the height
* @return the buffered image
* @throws IOException the io exception
*/
public static BufferedImage cutJPG(BufferedImage originalImage, int width, int height) throws IOException {
Iterator<ImageReader> iterator = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = iterator.next();
// 转换成字节流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// writeToJPEG(1080,originalImage,0.5f,outputStream);
ImageIO.write(originalImage, "jpg", outputStream);
InputStream is = new ByteArrayInputStream(outputStream.toByteArray());
ImageInputStream iis = ImageIO.createImageInputStream(is);
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
Rectangle rect = new Rectangle(0, 0, width, height);
param.setSourceRegion(rect);
return reader.read(0, param);
}
//裁剪方法:裁剪高度的三分之一
File imgFile = new File(imgPath);
BufferedImage bufferedImage = ImageIO.read(imgFile);
bufferedImage = cutJPG(bufferedImage, bufferedImage.getWidth(), bufferedImage.getHeight()/3);
ImageIO.write(bufferedImage,"jpeg",imgFile);