Java poi 将 word 转成 html,ppt 转成图片

本贴最后更新于 2733 天前,其中的信息可能已经时过境迁

Java 容易被忽视的 poi 包

Poi 提取技术是 java 中一大亮点。前几日在做项目时需要将 ppt 转化为图片,将 word 文档输出的功能。在百度搜了些资料,整理了一下,借用前辈们的经验整合了这两个小小的类

文章原出两处:http://vtrtbb.iteye.com/blog/601267

          http://pengenjing.iteye.com/blog/1901225

来看下面的吧 word 文档转化为 html 格式的代码先:

package com.hsp.util;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.util.List;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.OutputKeys;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.apache.commons.io.output.ByteArrayOutputStream;

import org.apache.poi.hwpf.HWPFDocument;

import org.apache.poi.hwpf.converter.PicturesManager;

import org.apache.poi.hwpf.converter.WordToHtmlConverter;

import org.apache.poi.hwpf.model.PicturesTable;

import org.apache.poi.hwpf.usermodel.CharacterRun;

import org.apache.poi.hwpf.usermodel.Paragraph;

import org.apache.poi.hwpf.usermodel.Picture;

import org.apache.poi.hwpf.usermodel.PictureType;

import org.apache.poi.hwpf.usermodel.Range;

import org.apache.poi.hwpf.usermodel.Table;

import org.apache.poi.hwpf.usermodel.TableCell;

import org.apache.poi.hwpf.usermodel.TableIterator;

import org.apache.poi.hwpf.usermodel.TableRow;

import org.w3c.dom.Document;

public class Word2Html {

/*newrealpath是指word文档的原路径,realpath是指word文档的新路径,newsid是指该word文档存储在数据库中的唯一id值,用户没上传一个word文档,后台会根据生成的唯一id值创建一个.html文件,就是newsid.html*/

public static boolean changeWord2html(String newrealpath,String realpath,int newsid) {  

    boolean b=true; 

 try {  

        convert2Html(newrealpath,realpath+"//"+newsid+".html");  

    } catch (Exception e) {  

        e.printStackTrace();

        b=false;

    }  

    return b;

}  

//该方法是将文本写入路径之中

public static void writeFile(String content, String path) {  

    FileOutputStream fos = null;  

    BufferedWriter bw = null;  

    try {  

        File file = new File(path);  

        fos = new FileOutputStream(file);  

        bw = new BufferedWriter(new OutputStreamWriter(fos,"GB2312"));  

        bw.write(content);  

    } catch (FileNotFoundException fnfe) {  

        fnfe.printStackTrace();  

    } catch (IOException ioe) {  

        ioe.printStackTrace();  

    } finally {  

        try {  

            if (bw != null)  

                bw.close();  

            if (fos != null)  

                fos.close();  

        } catch (IOException ie) {  

        }  

    }  

}  

public static void convert2Html(String fileName, String outPutFile)  

        throws TransformerException, IOException,  

        ParserConfigurationException {  

    HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(fileName));//创建一个文档  

    WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(  

            DocumentBuilderFactory.newInstance().newDocumentBuilder()  

                    .newDocument());//对普通文本的操作

     wordToHtmlConverter.setPicturesManager( new PicturesManager()  

     {  

         public String savePicture( byte[] content,  

                 PictureType pictureType, String suggestedName,  

                 float widthInches, float heightInches )  

         {  

             return "test/"+suggestedName;  

         }  

     } );//对图片的操作

    wordToHtmlConverter.processDocument(wordDocument);  

    //保存图片  

    List pics=wordDocument.getPicturesTable().getAllPictures();  

    if(pics!=null){  

        for(int i=0;i下面都是转换

    TransformerFactory tf = TransformerFactory.newInstance();  

    Transformer serializer = tf.newTransformer();  

    serializer.setOutputProperty(OutputKeys.ENCODING, "GB2312");  

    serializer.setOutputProperty(OutputKeys.INDENT, "yes");  

    serializer.setOutputProperty(OutputKeys.METHOD, "html");  

    serializer.transform(domSource, streamResult);  

    out.close();  

    writeFile(new String(out.toByteArray()), outPutFile); //调用writeFile类 

}  

}

下面的我们来看看 ppt 转化为图片格式的代码:

package com.hsp.util;

import java.awt.Dimension;

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.List;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics2D;

import java.awt.geom.Rectangle2D;

import java.awt.image.BufferedImage;

import org.apache.poi.hslf.model.TextRun;

import org.apache.poi.hslf.record.Slide;

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

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

public class PPTtoImage {

/pptload 是指 ppt 的原路径,newfullnewpath 是指 ppt 的新路径,newsid 是指该 ppt 存储在数据库中的唯一 id 值,用户没上传一个 ppt,后台会根据生成的唯一 id 值创建一个唯一的文件夹,该文件夹内存放该 ppt 转化的图片/

public static List changppttoimage(String pptload,String newfullnewpath,int newsid){

// 读入 PPT 文件

File file = new File(pptload);

return doPPTtoImage(file,newfullnewpath,newsid);

}

public static List doPPTtoImage(File file,String newfullnewpath,int newsid){

/*boolean isppt = checkFile(file);

if (!isppt) {

System.out.println("你指定的文件不是 ppt 文档!");

return false;

}*/

List al=new ArrayList();

try {

FileInputStream is = new FileInputStream(file);

SlideShow ppt = new SlideShow(is);

is.close();

Dimension pgsize = ppt.getPageSize();

org.apache.poi.hslf.model.Slide[] slide = ppt.getSlides();

for (int i = 0; i < slide.length; i++) {

//System.out.print("第" + i + "页。");

if(slide[i].getNotesSheet()!=null&&slide[i].getNotesSheet().getTextRuns()!=null){

 //获取第一个备注

 //System.out.println("备注:" + slide[i].getNotesSheet().getTextRuns()[0].getText());

}

TextRun[] truns = slide[i].getTextRuns();

for (int k = 0; k < truns.length; k++) {

 RichTextRun[] rtruns = truns[k].getRichTextRuns();

 for (int l = 0; l < rtruns.length; l++) {

  rtruns[l].setFontIndex(1);

  rtruns[l].setFontName("宋体");

  // 获取文本列表

  //System.out.println(rtruns[l].getText());   

 }

}

BufferedImage img = new BufferedImage(pgsize.width,

  pgsize.height, BufferedImage.TYPE_INT_RGB);

Graphics2D graphics = img.createGraphics();

graphics.setPaint(Color.white);

graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,

  pgsize.height));

slide[i].draw(graphics);

// 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径

File f=new File(newfullnewpath);

//判断该文件夹是否存在,如果不存在,这创建一个新的文件夹

if(!f.isDirectory())

{

f.mkdirs();

}

FileOutputStream out = new FileOutputStream(newfullnewpath+"pict_"+(i + 1) + ".jpeg");

javax.imageio.ImageIO.write(img, "jpeg", out);

al.add("pict_"+(i + 1) + ".jpeg");

out.close();

}

/*System.out.println("ok");

return true;*/

} catch (FileNotFoundException e) {

System.out.println(e);

} catch (IOException e) {

e.printStackTrace();

}

return al;

}

// function 检查文件是否为 PPT

public static boolean checkFile(File file) {

boolean isppt = false;

String filename = file.getName();

String suffixname = null;

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

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

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

isppt = true;

}

return isppt;

} else {

return isppt;

}

}

}

经测试是可行的,在小编这里是可以运行成功的,不过,上面只是简单的两个类而已,在项目中,还要用 struts2 去限定转化文件的大小等等。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3206 引用 • 8217 回帖
  • POI
    23 引用 • 21 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • scmod

    我记得是不是只支持 doc 文件来着,docx 好像要用别的,ppt 不清楚..excel 好像也是这样

推荐标签 标签

  • OneNote
    2 引用 • 5 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 51 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 559 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖 • 2 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 152 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 158 关注
  • Anytype
    3 引用 • 31 回帖 • 59 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    11 引用 • 15 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 260 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    502 引用 • 1397 回帖 • 241 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 405 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 120 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    43 引用 • 130 回帖 • 259 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 64 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 668 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 123 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 770 关注
  • OnlyOffice
    4 引用 • 41 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 636 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 11 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 53 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    126 引用 • 83 回帖 • 2 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 724 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 222 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 44 关注