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转图片(解决图片不高清问题)相关推荐

  1. java poi 读取 word图片_Java Poi 根据文字内容 插入 word 图片-Go语言中文社区

    需求描述 如下图,我需要在word里根据一个图片的名字,将名字替换成该图片(公章) 思路: 用POI遍历每一个表格里的每一行的每一个单元格,如果遇到我自己定义的"&章",则 ...

  2. java图片位置设置_java poi设置生成的word的图片为上下型环绕以及其位置

    问题描述 在使用poi-tl word模版工具时,发现生成的文档中,图片格式为嵌入型,有的图片甚至被表格遮挡一半.而自己想要的图片格式为上下型环绕,并且图片需要居中. 问题分析 poi-tl渲染图片, ...

  3. java excel row遍历空_Java poi读取,写入Excel,处理row和cell可能为空的情况

    首先需要导入包 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.NP ...

  4. java excel 多列排序_java poi处理excel多sheet并实现排序

    需求:有一个数据字典全量汇总表,其中第一个sheet为目录,包括编号和表名,第二个以后为表的明细.其中sheet名就是表名但无序,sheet内字段序号无序有空行 现在要求将其中101,104,107, ...

  5. xwpftemplate的时间设置_java poi设置生成的word的图片为上下型环绕以及其位置

    问题描述 在使用poi-tl word模版工具时,发现生成的文档中,图片格式为嵌入型,有的图片甚至被表格遮挡一半.而自己想要的图片格式为上下型环绕,并且图片需要居中. 问题分析 poi-tl渲染图片, ...

  6. java给frame设置背景_JAVA设置FRAME背景总结设置背景图片

    Java中有关Frame背景的设置总结 我们在进行图形用户界面编程时,为了做出一个漂亮.个性化的界面,那么界面的背景就必须考虑了.要想灵活使用背景,就一定要对frame的基本有一些了解,因为在java ...

  7. java图片小猫_java爬取猫咪上的图片

    1 package文件操作;2 3 importjava.io.ByteArrayOutputStream;4 importjava.io.File;5 importjava.io.FileOutpu ...

  8. 科研论文绘图:ppt, word,latex,python matplotlib绘图 ,矢量图,高清图,放大不失真

    目录 1. 用PPT绘图,保存为高清图片,不推荐使用,方法链接 2. 用PPT绘图,保存为emf矢量图,适合插入word,方法链接 3. 用PPT画图,保存为eps文件,适合插入latex,方法链接 ...

  9. poi 拆分带图片的word_java poi设置生成的word的图片为上下型环绕以及其位置的实现...

    问题描述 在使用poi-tl word模版工具时,发现生成的文档中,图片格式为嵌入型,有的图片甚至被表格遮挡一半.而自己想要的图片格式为上下型环绕,并且图片需要居中. 问题分析 poi-tl渲染图片, ...

  10. 南丁格尔邮票图片大全_【鉴赏】武夷山普通纪念币鉴赏(高清图片)

    点击上方蓝字『爱好纪念币』:点击右上角『...』:点选『设为星标』. 2020年12月21日,央行发行世界文化和自然遗产--武夷山普通纪念币一枚,采用黄铜合金材质,面额为5元,式样为圆角正方形,外接圆 ...

最新文章

  1. vue搜不到c_vue不是内部命令、安装@vue/cli失败、找不到vue.cmd文件等问题的解决方法...
  2. 现在很多技术知识点缺乏来龙去脉的介绍
  3. 基本概念-编写第一个C程序
  4. 一口气说出 6种 延时队列的实现方案,大厂offer稳稳的
  5. 扫描线算法-求线段交点数量
  6. 使用 cx recipe 安装 Hybris Commerce Cloud 之后,遇到 indexer workder failed 错误
  7. 计算机网络实验进入实时模式,计算机网络实验1 PacketTrace基本使用.doc
  8. 监督学习 | 线性分类 之Logistic回归原理及Sklearn实现
  9. SpringBoot指南(四)——RESTful风格
  10. 电力电容器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  11. Jmeter下载安装配置
  12. 用编译安装搭建自己的http服务器
  13. 关于网页内容加速黑科技的趣谈
  14. 提升Windows xp系统运行速度的九大技巧
  15. LeetCode-回文数C语言实现
  16. 程序员无处安放的青春
  17. 万诤:同心同向同行,才算得上不负遇见
  18. 15.Scala- 文件和正则表达式
  19. 2018中国初创企业融资近千亿 人工智能领跑新经济破局
  20. 一道积分不等式的最优估计探索

热门文章

  1. Hashtable如何保证线程安全
  2. 微信接口报错:40163
  3. 【word】右上角标
  4. 2022年证券大宗交易研究报告
  5. AndroidUI:Android的Holo Theme
  6. 谷歌浏览器开发者工具network_关于Chrome谷歌浏览器开发者工具网络Network中返回无数据的问题...
  7. 华为路由器a1怎么设置虚拟服务器,华为路由器a1 lite该怎么设置? | 192.168.1.1登陆页面...
  8. DT741-csf联通创维光猫桥接模式+华为WS5200路由器拨号设置
  9. java开发坦克大战小游戏
  10. 实数系与实数定理(上)