java ppt转图片 失真_java poi 实现ppt转图片(解决图片不高清问题)

本文介绍了如何使用Apache POI库在Java中将PPT转换为高清图片,通过放大图片尺寸来提高清晰度。示例代码详细展示了转换过程,包括设置字体、处理每一页幻灯片并保存为不同格式的图片。

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。

POI 操作office需要的jar包:

86158a9a908c?tdsourcetag=s_pctim_aiomsg

image.png

poi生成的原图清晰度比较有限,所以转高清图的思路是生成图片的时候放大图片。下面是代码的实现。

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics2D;

import java.awt.geom.Rectangle2D;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.UUID;

import javax.imageio.ImageIO;

import org.apache.poi.hslf.usermodel.HSLFSlide;

import org.apache.poi.hslf.usermodel.HSLFSlideShow;

import org.apache.poi.hslf.usermodel.HSLFTextParagraph;

import org.apache.poi.hslf.usermodel.HSLFTextRun;

public class pptUtils {

/**

* 将PPT 文件转换成image

*

* @param orignalPPTFileName //PPT文件路径 如:d:/demo/demo1.ppt

* @param targetImageFileDir //转换后的图片保存路径 如:d:/demo/pptImg

* @param imageFormatNameString //图片转化的格式字符串 ,如:"jpg"、"jpeg"、"bmp" "png" "gif" "tiff"

* @param 生成图片放大的倍数,倍数越高,清晰度越高

* @return 图片名列表

*/

@SuppressWarnings("resource")

public static List converPPTtoImage(String orignalPPTFileName, String targetImageFileDir,

String imageFormatNameString, int times) {

List imgList = new ArrayList<>();

List imgNamesList = new ArrayList();// PPT转成图片后所有名称集合

FileInputStream orignalPPTFileInputStream = null;

FileOutputStream orignalPPTFileOutStream = null;

HSLFSlideShow oneHSLFSlideShow = null;

//创建文件夹

createDirIfNotExist(targetImageFileDir);

try {

try {

orignalPPTFileInputStream = new FileInputStream(orignalPPTFileName);

} catch (FileNotFoundException e) {

e.printStackTrace();

return Collections.emptyList();

}

try {

oneHSLFSlideShow = new HSLFSlideShow(orignalPPTFileInputStream);

} catch (IOException e) {

e.printStackTrace();

return Collections.emptyList();

}

// 获取PPT每页的大小(宽和高度)

Dimension onePPTPageSize = oneHSLFSlideShow.getPageSize();

// 获得PPT文件中的所有的PPT页面(获得每一张幻灯片),并转为一张张的播放片

List pptPageSlideList = oneHSLFSlideShow.getSlides();

// 下面循环的主要功能是实现对PPT文件中的每一张幻灯片进行转换和操作

for (int i = 0; i < pptPageSlideList.size(); i++) {

// 这几个循环只要是设置字体为宋体,防止中文乱码,

List> oneTextParagraphs = pptPageSlideList.get(i).getTextParagraphs();

for (List list : oneTextParagraphs) {

for (HSLFTextParagraph hslfTextParagraph : list) {

List HSLFTextRunList = hslfTextParagraph.getTextRuns();

for (int j = 0; j < HSLFTextRunList.size(); j++) {

// 如果PPT在WPS中保存过,则

// HSLFTextRunList.get(j).getFontSize();的值为0或者26040,

// 因此首先识别当前文本框内的字体尺寸是否为0或者大于26040,则设置默认的字体尺寸。

// 设置字体大小

Double size = HSLFTextRunList.get(j).getFontSize();

if ((size <= 0) || (size >= 26040)) {

HSLFTextRunList.get(j).setFontSize(20.0);

}

// 设置字体样式为宋体

// String

// family=HSLFTextRunList.get(j).getFontFamily();

HSLFTextRunList.get(j).setFontFamily("宋体");

}

}

}

// 创建BufferedImage对象,图像的尺寸为原来的每页的尺寸*倍数times

BufferedImage oneBufferedImage = new BufferedImage(onePPTPageSize.width * times,

onePPTPageSize.height * times, BufferedImage.TYPE_INT_RGB);

Graphics2D oneGraphics2D = oneBufferedImage.createGraphics();

// 设置转换后的图片背景色为白色

oneGraphics2D.setPaint(Color.white);

oneGraphics2D.scale(times, times);// 将图片放大times倍

oneGraphics2D

.fill(new Rectangle2D.Float(0, 0, onePPTPageSize.width * times, onePPTPageSize.height * times));

pptPageSlideList.get(i).draw(oneGraphics2D);

// 设置图片的存放路径和图片格式,注意生成的图片路径为绝对路径,最终获得各个图像文件所对应的输出流对象

try {

String imgName = (i + 1) + "_" + UUID.randomUUID().toString() + "." + imageFormatNameString;

imgNamesList.add(imgName);// 将图片名称添加的集合中

imgList.add(imgName);

orignalPPTFileOutStream = new FileOutputStream(targetImageFileDir + imgName);

} catch (FileNotFoundException e) {

e.printStackTrace();

return Collections.emptyList();

}

// 转换后的图片文件保存的指定的目录中

try {

ImageIO.write(oneBufferedImage, imageFormatNameString, orignalPPTFileOutStream);

} catch (IOException e) {

e.printStackTrace();

return Collections.emptyList();

}

}

} finally {

try {

if (orignalPPTFileInputStream != null) {

orignalPPTFileInputStream.close();

}

} catch (IOException e) {

e.printStackTrace();

}

try {

if (orignalPPTFileOutStream != null) {

orignalPPTFileOutStream.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return imgList;

}

/**

* 检查是否为ppt文件

* @param file

* @return

*/

public static boolean checkIsPPTFile(File file) {

boolean isppt = false;

String filename = file.getName();

String suffixname = null;

if (filename != null && filename.indexOf(".") != -1) {

suffixname = filename.substring(filename.lastIndexOf("."));

if (suffixname.equals(".ppt") || suffixname.equals(".pptx")) {

isppt = true;

}

return isppt;

} else {

return isppt;

}

}

/**

* 创建文件如果路径不存在则创建对应的文件夹

* @param file

* @return

*/

public static File createDirIfNotExist(String file) {

File fileDir = new File(file);

if (!fileDir.exists()) {

fileDir.mkdirs();

}

return fileDir;

}

public static void main(String[] args) {

List result = converPPTtoImage("C:\\Users\\Administrator\\Desktop\\demo.ppt", "D:\\demo\\", "jpg", 8);

for(String s:result){

System.out.println(s);

}

// testPPT();

// testPPTX();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值