java ppt转图片 失真_java poi 实现ppt转图片(解决图片不高清问题)
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。
POI 操作office需要的jar包:
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();
}
}
java ppt转图片 失真_java poi 实现ppt转图片(解决图片不高清问题)相关推荐
- java poi 读取 word图片_Java Poi 根据文字内容 插入 word 图片-Go语言中文社区
需求描述 如下图,我需要在word里根据一个图片的名字,将名字替换成该图片(公章) 思路: 用POI遍历每一个表格里的每一行的每一个单元格,如果遇到我自己定义的"&章",则 ...
- java图片位置设置_java poi设置生成的word的图片为上下型环绕以及其位置
问题描述 在使用poi-tl word模版工具时,发现生成的文档中,图片格式为嵌入型,有的图片甚至被表格遮挡一半.而自己想要的图片格式为上下型环绕,并且图片需要居中. 问题分析 poi-tl渲染图片, ...
- java excel row遍历空_Java poi读取,写入Excel,处理row和cell可能为空的情况
首先需要导入包 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.NP ...
- java excel 多列排序_java poi处理excel多sheet并实现排序
需求:有一个数据字典全量汇总表,其中第一个sheet为目录,包括编号和表名,第二个以后为表的明细.其中sheet名就是表名但无序,sheet内字段序号无序有空行 现在要求将其中101,104,107, ...
- xwpftemplate的时间设置_java poi设置生成的word的图片为上下型环绕以及其位置
问题描述 在使用poi-tl word模版工具时,发现生成的文档中,图片格式为嵌入型,有的图片甚至被表格遮挡一半.而自己想要的图片格式为上下型环绕,并且图片需要居中. 问题分析 poi-tl渲染图片, ...
- java给frame设置背景_JAVA设置FRAME背景总结设置背景图片
Java中有关Frame背景的设置总结 我们在进行图形用户界面编程时,为了做出一个漂亮.个性化的界面,那么界面的背景就必须考虑了.要想灵活使用背景,就一定要对frame的基本有一些了解,因为在java ...
- java图片小猫_java爬取猫咪上的图片
1 package文件操作;2 3 importjava.io.ByteArrayOutputStream;4 importjava.io.File;5 importjava.io.FileOutpu ...
- 科研论文绘图:ppt, word,latex,python matplotlib绘图 ,矢量图,高清图,放大不失真
目录 1. 用PPT绘图,保存为高清图片,不推荐使用,方法链接 2. 用PPT绘图,保存为emf矢量图,适合插入word,方法链接 3. 用PPT画图,保存为eps文件,适合插入latex,方法链接 ...
- poi 拆分带图片的word_java poi设置生成的word的图片为上下型环绕以及其位置的实现...
问题描述 在使用poi-tl word模版工具时,发现生成的文档中,图片格式为嵌入型,有的图片甚至被表格遮挡一半.而自己想要的图片格式为上下型环绕,并且图片需要居中. 问题分析 poi-tl渲染图片, ...
- 南丁格尔邮票图片大全_【鉴赏】武夷山普通纪念币鉴赏(高清图片)
点击上方蓝字『爱好纪念币』:点击右上角『...』:点选『设为星标』. 2020年12月21日,央行发行世界文化和自然遗产--武夷山普通纪念币一枚,采用黄铜合金材质,面额为5元,式样为圆角正方形,外接圆 ...
最新文章
- vue搜不到c_vue不是内部命令、安装@vue/cli失败、找不到vue.cmd文件等问题的解决方法...
- 现在很多技术知识点缺乏来龙去脉的介绍
- 基本概念-编写第一个C程序
- 一口气说出 6种 延时队列的实现方案,大厂offer稳稳的
- 扫描线算法-求线段交点数量
- 使用 cx recipe 安装 Hybris Commerce Cloud 之后,遇到 indexer workder failed 错误
- 计算机网络实验进入实时模式,计算机网络实验1 PacketTrace基本使用.doc
- 监督学习 | 线性分类 之Logistic回归原理及Sklearn实现
- SpringBoot指南(四)——RESTful风格
- 电力电容器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- Jmeter下载安装配置
- 用编译安装搭建自己的http服务器
- 关于网页内容加速黑科技的趣谈
- 提升Windows xp系统运行速度的九大技巧
- LeetCode-回文数C语言实现
- 程序员无处安放的青春
- 万诤:同心同向同行,才算得上不负遇见
- 15.Scala- 文件和正则表达式
- 2018中国初创企业融资近千亿 人工智能领跑新经济破局
- 一道积分不等式的最优估计探索
热门文章
- Hashtable如何保证线程安全
- 微信接口报错:40163
- 【word】右上角标
- 2022年证券大宗交易研究报告
- AndroidUI:Android的Holo Theme
- 谷歌浏览器开发者工具network_关于Chrome谷歌浏览器开发者工具网络Network中返回无数据的问题...
- 华为路由器a1怎么设置虚拟服务器,华为路由器a1 lite该怎么设置? | 192.168.1.1登陆页面...
- DT741-csf联通创维光猫桥接模式+华为WS5200路由器拨号设置
- java开发坦克大战小游戏
- 实数系与实数定理(上)