最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

java pdf,word,ppt转图片

运维笔记admin37浏览0评论

java pdf,word,ppt转图片

java pdf,word,ppt转图片

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0" xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.test</groupId><artifactId>local-service</artifactId><version>0.0.1-SNAPSHOT</version><name>local-service</name><description>local-service</description><properties><java.version>8</java.version><mavenpiler.source>8</mavenpiler.source><mavenpiler.target>8</mavenpiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- .apachemons/commons-lang3 --><dependency><groupId>org.apachemons</groupId><artifactId>commons-lang3</artifactId><version>3.13.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.32</version></dependency><!-- .apachemons/commons-compress --><dependency><groupId>org.apachemons</groupId><artifactId>commons-compress</artifactId><version>1.24.0</version></dependency><!--PDF操作工具包--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app</artifactId><version>2.0.16</version></dependency><!-- word操作工具包--><dependency><groupId>words</groupId><artifactId>aspose-words</artifactId><version>1.0.0</version></dependency><!-- ppt操作工具包--><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.apache.xmlgraphics</groupId><artifactId>batik-bridge</artifactId><version>1.9.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
文件转换统一工具类 FileConvertUtil.java

调用 FileConvertUtil.convert2Images(filePath)即可输出图片信息

import lombok.extern.slf4j.Slf4j;
import org.apachemonspress.utils.Lists;
import org.python.jline.internal.Log;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.Base64Utils;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;/*** @author yangguang* @date 2023年11月01日 17:01*/
@Slf4j
public class FileConvertUtil {private static Map<String, BiFunction<String,String, List<ImageInfo>>> convertFactory = new HashMap<>();static {convertFactory.put("ppt", PPTUtil::ppt2image);convertFactory.put("pptx", PPTUtil::pptx2image);convertFactory.put("doc", WordUtil::word2image);convertFactory.put("docx", WordUtil::word2image);convertFactory.put("pdf", PdfUtil::pdf2image);}public static List<ImageInfo> convert2Images(String filePath) {File file = new File(filePath);String name = file.getName().substring(0,file.getName().lastIndexOf("."));String targetDir = file.getParentFile().getAbsolutePath()+File.separator+name;if(new File(targetDir).exists()){return Arrays.stream(new File(targetDir).listFiles()).map(File::getAbsolutePath).sorted((name1,name2)->Integerpare(getFileIndex(name1),getFileIndex(name2))).map(FileConvertUtil::file2ImageInfo).collect(Collectors.toList());}else{new File(targetDir).mkdirs();}String suffix = filePath.substring(filePath.lastIndexOf(".") + 1);List<ImageInfo> list = Optional.ofNullable(convertFactory.get(suffix)).map(f -> f.apply(filePath,targetDir)).orElseThrow(() -> new CustomException("不支持得文件类型"));return list;}public static List<String> convert2ImagesBase64(String filePath) {return convert2Images(filePath).stream().map(ImageInfo::getPath).map(FileConvertUtil::base64Encoding).collect(Collectors.toList());}public static void clearWorkPath(File dir) {if (dir == null) {File file = new File(Constants.TEMP_PATH);for (File f : file.listFiles()) {clearWorkPath(f);}} else if (dir.isDirectory()) {for (File file : dir.listFiles()) {clearWorkPath(file);}dir.delete();} else {dir.delete();}}private static String base64Encoding(String imagePath) {InputStream in = null;try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {//建一个空的字节数组byte[] result = null;in = new FileInputStream(imagePath);byte[] buf = new byte[1024];//用来定义一个准备接收图片总长度的局部变量int len;//将流的内容读取到buf内存中while ((len = in.read(buf)) > 0) {//将buf内存中的内容从0开始到总长度输出出去out.write(buf, 0, len);}//将out中的流内容拷贝到一开始定义的字节数组中result = out.toByteArray();//通过util包中的Base64类对字节数组进行base64编码String base64 = Base64.getEncoder().encodeToString(result);return "data:Image/" + "PNG" + ";base64," + base64;} catch (Exception e) {log.error("image to base64 error",e);throw new CustomException("image to base64 error");}}private static int getFileIndex(String filePath){String fileName = new File(filePath).getName();return Integer.parseInt(fileName.substring(0,fileName.lastIndexOf(".")));}private static ImageInfo file2ImageInfo(String filePath) {ImageInfo.ImageInfoBuilder builder = ImageInfo.builder();BufferedImage img = null;File f = null;try {f = new File(filePath);img = ImageIO.read(f);return builder.width(img.getWidth()).height(img.getHeight()).path(filePath).build();}catch (IOException e) {log.error("读取文件失败",e);throw new CustomException("读取文件失败");}}}

图片对象ImageInfo.java

@Data
@Builder
public class ImageInfo {private String path;private Integer width;private Integer height;}
常量文件输出路径Constants.java
/*** @author yangguang* @date 2023年11月01日 15:35*/
public interface Constants {String CONF_PATH = System.getProperty("user.dir") + File.separator + "conf";String TEMP_PATH = System.getProperty("user.dir") + File.separator + "temp";
}

WordUtil.java

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.IntStream;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import com.aspose.words.Document;
import com.aspose.words.ImageSaveOptions;
import com.aspose.words.SaveFormat;
import lombok.extern.slf4j.Slf4j;
import org.apachemonspress.utils.Lists;
import org.apache.tomcat.util.http.fileupload.IOUtils;@Slf4j
public class WordUtil {/*** 验证aspose.word组件是否授权:无授权的文件有水印标记* 需要使用(aspose-words-15.8.0-jdk16.jar),版本要对应。无水印* @return*/private static boolean isWordLicense(){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 inputStream = new ByteArrayInputStream(s.getBytes());com.aspose.words.License license = new com.aspose.words.License();license.setLicense(inputStream);result = true;} catch (Exception e) {e.printStackTrace();}return result;}//outputStream转inputStreamprivate static ByteArrayInputStream parse(OutputStream out) throws Exception{ByteArrayOutputStream baos = new ByteArrayOutputStream();baos = (ByteArrayOutputStream) out;ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());return swapStream;}/*** word和txt文件转换图片* @param inputStream* @param* @return* @throws Exception*/private static List<BufferedImage> wordToImg(InputStream inputStream) throws Exception{if (!isWordLicense()){return null;}try {Date start = new Date();Document doc = new Document(inputStream);ImageSaveOptions options = new ImageSaveOptions(SaveFormat.PNG);options.setPrettyFormat(true);options.setUseAntiAliasing(true);options.setUseHighQualityRendering(true);int pageCount = doc.getPageCount();//生成前pageCount张,这可以限制输出长图时的页数(方法入参可以传值pageNum)/*if (pageCount > pageNum) {pageCount = pageNum;}*/List<BufferedImage> imageList = new ArrayList<BufferedImage>();for (int i = 0; i < pageCount; i++){OutputStream output = new ByteArrayOutputStream();options.setPageIndex(i);doc.save(output, options);ImageInputStream imageInputStream = javax.imageio.ImageIO.createImageInputStream(parse(output));imageList.add(javax.imageio.ImageIO.read(imageInputStream));}List<BufferedImage> imageList2 = new ArrayList<BufferedImage>();//这个重新生成新的图片是因为直接输出的图片底色为红色for(int j=0; j<imageList.size(); j++){// 生成新图片BufferedImage destImage = imageList.get(j);int w1 = destImage.getWidth();int h1 = destImage.getHeight();destImage = new BufferedImage(w1, h1, BufferedImage.TYPE_INT_RGB);Graphics2D g2 = (Graphics2D) destImage.getGraphics();g2.setBackground(Color.LIGHT_GRAY);g2.clearRect(0, 0, w1, h1);g2.setPaint(Color.RED);// 从图片中读取RGBint[] ImageArrayOne = new int[w1 * h1];ImageArrayOne = imageList.get(j).getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中destImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGBimageList2.add(destImage);}Date end = new Date();long l=end.getTime()-start.getTime();long hour= l / (1000 * 60 * 60);long min=  (l-hour*(1000 * 60 * 60 ))/(1000* 60);long s= (l-hour*(1000 * 60 * 60 )-min*1000*60)/(1000);long ss= (l-hour*(1000 * 60 * 60 )-min*1000*60 -s*1000)/(1000/60);System.out.println("word转图片时间:"+min+"分"+s+"秒" + ss + "毫秒");//hour+"小时"+return imageList2;} catch (Exception e) {e.printStackTrace();throw e;}}/*** 合并任数量的图片成一张图片* @param isHorizontal true代表水平合并,fasle代表垂直合并* @param imgs 待合并的图片数组* @return* @throws IOException*/public static BufferedImage mergeImage(boolean isHorizontal, List<BufferedImage> imgs) throws IOException{// 生成新图片BufferedImage destImage = null;// 计算新图片的长和高int allw = 0, allh = 0, allwMax = 0, allhMax = 0;// 获取总长、总宽、最长、最宽for (int i = 0; i < imgs.size(); i++){BufferedImage img = imgs.get(i);allw += img.getWidth();if (imgs.size() != i + 1){allh += img.getHeight() + 5;} else {allh += img.getHeight();}if (img.getWidth() > allwMax){allwMax = img.getWidth();}if (img.getHeight() > allhMax){allhMax = img.getHeight();}}// 创建新图片if (isHorizontal){destImage = new BufferedImage(allw, allhMax, BufferedImage.TYPE_INT_RGB);} else {destImage = new BufferedImage(allwMax, allh, BufferedImage.TYPE_INT_RGB);}Graphics2D g2 = (Graphics2D) destImage.getGraphics();g2.setBackground(Color.LIGHT_GRAY);g2.clearRect(0, 0, allw, allh);g2.setPaint(Color.RED);// 合并所有子图片到新图片int wx = 0, wy = 0;for (int i = 0; i < imgs.size(); i++){BufferedImage img = imgs.get(i);int w1 = img.getWidth();int h1 = img.getHeight();// 从图片中读取RGBint[] ImageArrayOne = new int[w1 * h1];ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中if (isHorizontal) { // 水平方向合并destImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB} else { // 垂直方向合并destImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB}wx += w1;wy += h1 + 5;}return destImage;}public static List<ImageInfo> word2image(String wordPath,String targetDir){List<ImageInfo> list = Lists.newArrayList();File file = new File(wordPath);InputStream inStream =null;try {inStream = new FileInputStream(file);List<BufferedImage> wordToImg = wordToImg(inStream);IntStream.range(0,wordToImg.size()).forEach(i->{//可以保存图片(每页保存为一张)try {String filePath = (targetDir==null?Constants.TEMP_PATH:targetDir)+File.separator+ i +".png";BufferedImage image = wordToImg.get(i);ImageInfo imageInfo = ImageInfo.builder().width(image.getWidth()).height(image.getHeight()).path(filePath).build();ImageIO.write(image, "jpg", new File(filePath)); //将其保存在C:/imageSort/targetPIC/下synchronized (list){list.add(imageInfo);}}catch (Exception e){log.error("word2pdf error 212",e);}});}catch (Exception e){log.error("word2pdf error",e);}finally {IOUtils.closeQuietly(inStream);}return list;}// 测试工具类public static void main(String[] args){String path = "E:\\网页\\test.docx";new WordUtil().word2image(path,null);}}

PPTUtil.java

import lombok.extern.slf4j.Slf4j;
import org.apachemonspress.utils.Lists;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.sl.usermodel.Slide;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.List;/*** @author yangguang* @date 2023年11月01日 16:11*/
@Slf4j
public class PPTUtil {private final static double IMAGE_SCALE = 8;public static List<ImageInfo> ppt2image(String pptPath, String targetDir){List<ImageInfo> list = Lists.newArrayList();InputStream is = null;HSLFSlideShow ppt = null;try {File file = new File(pptPath);is = new FileInputStream(file);ppt =new HSLFSlideShow(is);Dimension pgSize = ppt.getPageSize();int i=0;for (HSLFSlide slide : ppt.getSlides()) {ImageInfo imageInfo = toPNG(targetDir,pgSize.width, pgSize.height, slide,i);list.add(imageInfo);i++;}} catch (IOException e) {log.error("ppt转换图片失败,{}", e.getMessage());throw new RuntimeException("ppt转换图片失败" + e.getMessage());} finally {try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}try {if (ppt != null) {ppt.close();}} catch (IOException e) {e.printStackTrace();}}return list;}public static List<ImageInfo> pptx2image(String pptPath,String targetDir){InputStream is = null;XMLSlideShow ppt = null;List<ImageInfo> list = Lists.newArrayList();try {is = new FileInputStream(pptPath);ppt = new XMLSlideShow(is);Dimension pgSize = ppt.getPageSize();int i=0;for (XSLFSlide slide : ppt.getSlides()) {ImageInfo imageInfo = toPNG(targetDir,pgSize.width, pgSize.height, slide,i);list.add(imageInfo);i++;}} catch (IOException e) {log.error("pptx转换图片失败,{}", e.getMessage());throw new RuntimeException("pptx转换图片失败" + e.getMessage());} finally {try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}try {if (ppt != null) {ppt.close();}} catch (IOException e) {e.printStackTrace();}}return list;}private static ImageInfo toPNG(String targetDir,int pgWidth, int pgHeight, Slide slide,int i) throws IOException {int imageWidth = (int) Math.floor(IMAGE_SCALE * pgWidth);int imageHeight = (int) Math.floor(IMAGE_SCALE * pgHeight);BufferedImage img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);Graphics2D graphics = img.createGraphics();graphics.setPaint(Color.white);graphics.fill(new Rectangle2D.Float(0, 0, pgWidth, pgHeight));graphics.scale(IMAGE_SCALE, IMAGE_SCALE);slide.draw(graphics);// save the outputString filePath = (targetDir==null?Constants.TEMP_PATH:targetDir)+ File.separator+ i +".png";ImageInfo imageInfo = ImageInfo.builder().width(img.getWidth()).height(img.getHeight()).path(filePath).build();ImageIO.write(img, "jpg", new File(filePath));return imageInfo;}public static void main(String[] args) {new PPTUtil().ppt2image("E:\\网页test.ppt",null);}
}

PdfUtil.java

import lombok.extern.slf4j.Slf4j;
import org.apachemonspress.utils.Lists;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.stereotype.Component;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.stream.IntStream;/*** @author yangguang* @date 2022年12月20日 9:56*/
@Component
@Slf4j
public class PdfUtil {private static ImageInfo pdftoimageByNum(PDFRenderer renderer, Integer pageNum, String imagePath)throws IOException{BufferedImage image = renderer.renderImageWithDPI(pageNum-1, 296);//image = FileUtil.bufferedImage2Transparent(image);//          BufferedImage image = renderer.renderImage(i, 2.5f);File file1 = new File(imagePath);if(!file1.getParentFile().exists()){file1.getParentFile().mkdirs();}ImageInfo imageInfo = ImageInfo.builder().width(image.getWidth()).height(image.getHeight()).path(imagePath).build();ImageIO.write(image, "PNG", new File(imagePath));return imageInfo;}private static String getFileName(String filepath) {String fileName;filepath = filepath.replaceAll("\\\\",File.separator);if(filepath.contains(File.separator)){fileName = filepath.substring(filepath.lastIndexOf(File.separator) + 1);}else{fileName = filepath;}if(!fileName.endsWith(".pdf")){throw new CustomException("文件格式不正确");}return fileName.substring(0,fileName.lastIndexOf("."));}public static List<ImageInfo> pdf2image(String pdfPath,String targetDir){List<ImageInfo> list = Lists.newArrayList();File file = new File(pdfPath);PDDocument doc=null;try {doc = PDDocument.load(file);PDFRenderer renderer = new PDFRenderer(doc);int pageCount = doc.getNumberOfPages();IntStream.range(0,pageCount).forEach(i->{try {String imagePath = (targetDir==null?Constants.TEMP_PATH:targetDir)+File.separator+ i + ".png";ImageInfo imageInfo = pdftoimageByNum(renderer, i + 1, imagePath);synchronized (list){list.add(imageInfo);}}catch (Exception e){log.error("转换图片失败",e);}});} catch (IOException e) {log.error("转换失败,io异常",e);throw new CustomException("转换失败,io异常");}finally {try {doc.close();} catch (Exception e) {log.error("io异常",e);}}return list;}public static void main(String[] args){List<ImageInfo> a = new PdfUtil().pdf2image("C:\\test.pdf",null);System.out.println(a);}
}

发布评论

评论列表(0)

  1. 暂无评论