1.将office文件转换成pdf文件
所需依赖:
<!-- office转pdf2 -->
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-local</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-transformer-msoffice-word</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-transformer-msoffice-excel</artifactId>
<version>1.1.7</version>
</dependency>
工具类formatConversion2Pdf方法: 可以将office文件流输出为byte[]数组
/**
* office文件转换成pdf文件
*
* @param inputStream
* @return 注意调用的是本地ws office的服务,linux环境无法运行
*/
public static byte[] formatConversion2Pdf(InputStream inputStream, String documentType) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
IConverter converter = LocalConverter.builder().build();
DocumentType officeType = null;
switch (documentType) {
case "doc":
officeType = DocumentType.DOC;break;
case "docx":
officeType = DocumentType.DOCX;break;
case "xls":
officeType = DocumentType.XLS;break;
case "xlsx":
officeType = DocumentType.XLSX;break;
}
//officeType类型转换DocumentType.PDF
converter.convert(inputStream).as(officeType).to(baos).as(DocumentType.PDF).execute();
converter.kill();
System.out.println(DocumentType.DOC + " success convert to pdf");
return baos.toByteArray();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
inputStream.close();
} catch (Exception e) {
}
}
}
测试类:
//word,excel转pdf
@Test
void formatConversion2PdfTest() throws Exception {
String srcXls = "C:\\Users\\86131\\Desktop\\translate\\word\\bbb.xls";
String srcXlsx = "C:\\Users\\86131\\Desktop\\translate\\word\\bbb2.xlsx";
String srcDoc = "C:\\Users\\86131\\Desktop\\translate\\word\\ccc.doc";
String srcDocx = "C:\\Users\\86131\\Desktop\\translate\\word\\ccc2.docx";
InputStream srcXlsStream = Files.newInputStream(Paths.get(srcXls));
InputStream srcXlsxStream = Files.newInputStream(Paths.get(srcXlsx));
InputStream srcDocStream = Files.newInputStream(Paths.get(srcDoc));
InputStream srcDocxStream = Files.newInputStream(Paths.get(srcDocx));
//生成Docx文档字节
byte[] docByte = OfficeWUtil.formatConversion2Pdf(srcDocStream, "doc");
//生成Docx文档缩略图
byte[] docxByte = OfficeWUtil.formatConversion2Pdf(srcDocxStream, "docx");
//生成Xls表格字节
byte[] xlsByte = OfficeWUtil.formatConversion2Pdf(srcXlsStream, "xls");
//生成Xlsx表格字节
byte[] xlsxByte = OfficeWUtil.formatConversion2Pdf(srcXlsxStream, "xlsx");
OutputStream docOutputStream = Files.newOutputStream(Paths.get(getTongUrl(srcDoc, "-thumb.pdf")));
OutputStream docxOutputStream = Files.newOutputStream(Paths.get(getTongUrl(srcDocx, "-thumb.pdf")));
OutputStream xlsOutputStream = Files.newOutputStream(Paths.get(getTongUrl(srcXls, "-thumb.pdf")));
OutputStream xlsxOutputStream = Files.newOutputStream(Paths.get(getTongUrl(srcXlsx, "-thumb.pdf")));
docOutputStream.write(docByte);
docxOutputStream.write(docxByte);
xlsOutputStream.write(xlsByte);
xlsxOutputStream.write(xlsxByte);
docOutputStream.flush();
docOutputStream.close();
docxOutputStream.flush();
docxOutputStream.close();
xlsOutputStream.flush();
xlsOutputStream.close();
xlsxOutputStream.flush();
xlsxOutputStream.close();
}
/**
* 根据地址生成同级地址+suffix
*/
private String getTongUrl(String srcPath, String suffix) {
//获取文件后缀
String srcSuffix = FileNameUtil.getSuffix(srcPath).toLowerCase();
return srcPath.substring(0, srcPath.length() - srcSuffix.length() - 1) + suffix;
}
/**
* 打印图片
*/
public static void printImg(InputStream inputStream, String tarPath) throws Exception {
printImg(ImageIO.read(inputStream), tarPath);
}
/**
* 打印图片
*/
public static void printImg(BufferedImage bufferedImage, String tarPath) throws Exception {
ImageIO.write(bufferedImage, "jpg", new File(tarPath));
System.out.println("打印图片成功");
}
测试结果截图:
2.PDF转缩略图
所需依赖:
<!-- pdf转png-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.16</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.16</version>
</dependency>
工具类:pdfConversion2ImgStream
注意: 我是调用的自己写的生成缩略图的地址
链接:各种图片处理,hutool的裁剪工具。生成渐进式jpeg格式图片以及生成缩略图
//如果想自己写的话就修改返回值注释掉记性。
/**
* 获取Pdf流转换Img流,返回InputStream
*/
public static InputStream pdfConversion2ImgStream(InputStream inputStream, String inputType) {
try (PDDocument doc = PDDocument.load(inputStream)) {
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
if (pageCount > 0) {
BufferedImage image = renderer.renderImage(0, 4.0f);
image.flush();
// 需要直接输出可以使用 ImageIO.write(image, "jpg", new FileOutputStream("a.jpg"));
//调用图片裁剪流输出方法
return ImageWUtil.bufferedConversion2ImgStream(image, inputType);
}
return null;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
inputStream.close();
} catch (Exception e) {
}
}
}
测试方法
//pdf生成缩略图到本地
@Test
void bufferedConversion2ImgStreamTest() throws Exception {
String srcPdf = "C:\\Users\\86131\\Desktop\\translate\\pdf\\ppp.pdf";
InputStream srcPdfStream = Files.newInputStream(Paths.get(srcPdf));
//生成pdf缩略图
InputStream inputPdfStream = OfficeWUtil.pdfConversion2ImgStream(srcPdfStream, "pdf");
printImg(inputPdfStream, getTongUrl(srcPdf, "-thumb.jpg"));
}
/**
* 根据地址生成同级地址+suffix
*/
private String getTongUrl(String srcPath, String suffix) {
//获取文件后缀
String srcSuffix = FileNameUtil.getSuffix(srcPath).toLowerCase();
return srcPath.substring(0, srcPath.length() - srcSuffix.length() - 1) + suffix;
}
/**
* 打印图片
*/
public static void printImg(InputStream inputStream, String tarPath) throws Exception {
printImg(ImageIO.read(inputStream), tarPath);
}
/**
* 打印图片
*/
public static void printImg(BufferedImage bufferedImage, String tarPath) throws Exception {
ImageIO.write(bufferedImage, "jpg", new File(tarPath));
System.out.println("打印图片成功");
}
测试结果图:
附上完整OfficeWUtil工具类代码以及测试类:
import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
/**
* @program: spring-boot-demo
* @author: Wu ZiLin
* @create: 2023-09-06 16:14
* @description: Office图片格式工具类
**/
public class OfficeWUtil {
private OfficeWUtil() {
}
/**
* 获取Pdf流转换Img流,返回InputStream
*/
public static InputStream pdfConversion2ImgStream(InputStream inputStream, String inputType) {
try (PDDocument doc = PDDocument.load(inputStream)) {
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
if (pageCount > 0) {
BufferedImage image = renderer.renderImage(0, 4.0f);
image.flush();
// 需要直接输出可以使用 ImageIO.write(image, "jpg", new FileOutputStream("a.jpg"));
//调用图片裁剪流输出方法
return ImageWUtil.bufferedConversion2ImgStream(image, inputType);
}
return null;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
inputStream.close();
} catch (Exception e) {
}
}
}
/**
* office文件转换成pdf文件
*
* @param inputStream
* @return 注意调用的是本地ws office的服务,linux环境无法运行
*/
public static byte[] formatConversion2Pdf(InputStream inputStream, String documentType) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
IConverter converter = LocalConverter.builder().build();
DocumentType officeType = null;
switch (documentType) {
case "doc":
officeType = DocumentType.DOC;break;
case "docx":
officeType = DocumentType.DOCX;break;
case "xls":
officeType = DocumentType.XLS;break;
case "xlsx":
officeType = DocumentType.XLSX;break;
}
//officeType类型转换DocumentType.PDF
converter.convert(inputStream).as(officeType).to(baos).as(DocumentType.PDF).execute();
converter.kill();
System.out.println(DocumentType.DOC + " success convert to pdf");
return baos.toByteArray();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
inputStream.close();
} catch (Exception e) {
}
}
}
}
import cn.hutool.core.io.file.FileNameUtil;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import zut.wu.fileinstall.FileInstallDemoApplication;
import zut.wu.fileinstall.utils.OfficeWUtil;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* @program: spring-boot-demo
* @author: Wu ZiLin
* @create: 2023-09-07 17:41
* @description:
**/
//FileInstallDemoApplication.class 是我的启动类
@SpringBootTest(classes = FileInstallDemoApplication.class)
public class OfficeWUtilTest {
//pdf生成缩略图到本地
@Test
void bufferedConversion2ImgStreamTest() throws Exception {
String srcPdf = "C:\\Users\\86131\\Desktop\\translate\\pdf\\ppp.pdf";
InputStream srcPdfStream = Files.newInputStream(Paths.get(srcPdf));
//生成pdf缩略图
InputStream inputPdfStream = OfficeWUtil.pdfConversion2ImgStream(srcPdfStream, "pdf");
printImg(inputPdfStream, getTongUrl(srcPdf, "-thumb.jpg"));
}
//word,excel转pdf
@Test
void formatConversion2PdfTest() throws Exception {
String srcXls = "C:\\Users\\86131\\Desktop\\translate\\word\\bbb.xls";
String srcXlsx = "C:\\Users\\86131\\Desktop\\translate\\word\\bbb2.xlsx";
String srcDoc = "C:\\Users\\86131\\Desktop\\translate\\word\\ccc.doc";
String srcDocx = "C:\\Users\\86131\\Desktop\\translate\\word\\ccc2.docx";
InputStream srcXlsStream = Files.newInputStream(Paths.get(srcXls));
InputStream srcXlsxStream = Files.newInputStream(Paths.get(srcXlsx));
InputStream srcDocStream = Files.newInputStream(Paths.get(srcDoc));
InputStream srcDocxStream = Files.newInputStream(Paths.get(srcDocx));
//生成Docx文档字节
byte[] docByte = OfficeWUtil.formatConversion2Pdf(srcDocStream, "doc");
//生成Docx文档缩略图
byte[] docxByte = OfficeWUtil.formatConversion2Pdf(srcDocxStream, "docx");
//生成Xls表格字节
byte[] xlsByte = OfficeWUtil.formatConversion2Pdf(srcXlsStream, "xls");
//生成Xlsx表格字节
byte[] xlsxByte = OfficeWUtil.formatConversion2Pdf(srcXlsxStream, "xlsx");
OutputStream docOutputStream = Files.newOutputStream(Paths.get(getTongUrl(srcDoc, "-thumb.pdf")));
OutputStream docxOutputStream = Files.newOutputStream(Paths.get(getTongUrl(srcDocx, "-thumb.pdf")));
OutputStream xlsOutputStream = Files.newOutputStream(Paths.get(getTongUrl(srcXls, "-thumb.pdf")));
OutputStream xlsxOutputStream = Files.newOutputStream(Paths.get(getTongUrl(srcXlsx, "-thumb.pdf")));
docOutputStream.write(docByte);
docxOutputStream.write(docxByte);
xlsOutputStream.write(xlsByte);
xlsxOutputStream.write(xlsxByte);
docOutputStream.flush();
docOutputStream.close();
docxOutputStream.flush();
docxOutputStream.close();
xlsOutputStream.flush();
xlsOutputStream.close();
xlsxOutputStream.flush();
xlsxOutputStream.close();
}
/**
* 根据地址生成同级地址+suffix
*/
private String getTongUrl(String srcPath, String suffix) {
//获取文件后缀
String srcSuffix = FileNameUtil.getSuffix(srcPath).toLowerCase();
return srcPath.substring(0, srcPath.length() - srcSuffix.length() - 1) + suffix;
}
/**
* 打印图片
*/
public static void printImg(InputStream inputStream, String tarPath) throws Exception {
printImg(ImageIO.read(inputStream), tarPath);
}
/**
* 打印图片
*/
public static void printImg(BufferedImage bufferedImage, String tarPath) throws Exception {
ImageIO.write(bufferedImage, "jpg", new File(tarPath));
System.out.println("打印图片成功");
}
}