使用Java基于数据流直接抽取ppt文本

标签: Java资料 | 发表时间:2012-05-28 08:00 | 作者:Administrator
出处:http://www.scriptlover.com
如下代码是直接基于数据流进行文本抽取,支持powerpoint97-powerpoint2003版本,之后的版本实际都是xml,抽取文本非常简单,因此在此处不再说明,代码仅供研究学习使用,禁止用于商业用途。


public class PPTExtractor {

    public static StringBuilder logBytes = new StringBuilder();

    public static int getPPTDcoument(byte[] ogiBytes, Stream stream, int dirSect1)
    {
        for(int i=0;i<8;i++)
        {
            int offsetEntry = (dirSect1 + 1)*512 + i*128;
            StringBuilder content = new StringBuilder();
            bytesToString(ogiBytes, content, offsetEntry, 64, 0);
            if(content.toString().indexOf("PowerPoint Document") > -1)
            {
                return offsetEntry;
            }
        }
       
        return 0;
    }
   
    public static void bytesToString(byte[] ogiBytes, StringBuilder content, int start, int length, int fc)
    {
        byte[] bytes = new byte[length];
        System.arraycopy(ogiBytes, start, bytes, 0, length);
        if(fc == 0)
        {
            for(int i=0;i<bytes.length;i++)
            {
                if(i == bytes.length - 1)
                {
                    return;
                }
               
                String hexStr = Integer.toHexString(bytes[i+1] & 0xFF) + Integer.toHexString(bytes[i] & 0xFF);
                int ch = Integer.valueOf(hexStr, 16);
                content.append( (char)ch );
                i++;
            }
        }
        else
        {
            for(int i=0;i<bytes.length;i++)
            {
                int ch = bytes[i] & 0xFF;
                content.append( (char)ch );
            }
        }
       
    }
   
    public static void printLogBytes(List<Byte> legaled) throws Exception
    {
        logBytes = new StringBuilder();
       
        logBytes.append("\n========================================================");
        for(int a=0;a<legaled.size();a++)
        {
            if(a % 16 == 0)
            {
                logBytes.append("\n");
            }
            logBytes.append(Integer.toHexString(legaled.get(a) & 0xFF) +" ");
        }
        logBytes.append("\n========================================================");
       
        FileUtil.writeAscFile("E:\\bytes.txt", logBytes.toString());
    }
   
    public static int findTextRecords(Stream stream, byte[] bytes, int start, StringBuilder content, int[] offset)
    {
        byte opt = bytes[start];
        int container = opt & 0x0f;
        if(container == 0x0f)
        {
            return start+8;
        }
       
        offset[0] = start + 2;
        int type = stream.getShort(offset);
       
        offset[0] = start + 4;
        int len = stream.getInteger(offset);

        if(type == 0x0FA8)
        {
            bytesToString(bytes, content, start+8, len, 1);
            System.out.println("Text Bytes Atom found!");
        }
   
        if(type == 0x0FA0)
        {
            bytesToString(bytes, content, start+8, len, 0);
            System.out.println("Text Chars Atom found!");
        }

        int newStart = start + 8 + len;
        if(newStart > bytes.length - 8)
        {
            newStart = -1;
        }
       
        return newStart;
    }
   
    public static void main(String[] args) throws Exception
    {
        byte[] ogiBytes = FileUtil.readBinFile("D:\\tools\\oletest\\cn-t.ppt");
       
        System.out.println("Total bytes: "+ ogiBytes.length);
        if(
                ogiBytes.length < 8         ||
                (ogiBytes[0] & 0xFF) != 208 ||
                (ogiBytes[1] & 0xFF) != 207 ||
                (ogiBytes[2] & 0xFF) != 17     ||
                (ogiBytes[3] & 0xFF) != 224 ||
                (ogiBytes[4] & 0xFF) != 161 ||
                (ogiBytes[5] & 0xFF) != 177 ||
                (ogiBytes[6] & 0xFF) != 26     ||
                (ogiBytes[7] & 0xFF) != 225
        ){
            System.out.println("Not the ppt file!");
            return;
        }
       
        Stream stream = new Stream(ogiBytes);
        int[] offset = new int[1];
       
        offset[0] = 48;
        int dirSect1 = stream.getInteger(offset);
        int pptDocument = getPPTDcoument(ogiBytes, stream, dirSect1);
        if(pptDocument <= 0)
        {
            System.out.println("This version of ppt can not be parsed!");
            return;
        }
       
        offset[0] = pptDocument + 116;
        int startSect = stream.getInteger(offset);
        int docStart = (startSect + 1)*512;
        int docLength = stream.getInteger(offset);
       
        byte[] bytes = new byte[docLength];
        System.arraycopy(ogiBytes, docStart, bytes, 0, docLength);
       
        stream = new Stream(bytes);
       
        StringBuilder content = new StringBuilder();
        int start = 0;
        while(start != -1)
        {
            start = findTextRecords(stream, bytes, start, content, offset);
        }
       
        FileUtil.writeAscFile("E:\\output.txt", content.toString(), false);
       
        System.out.println("Done!");
    }
}

相关 [java 数据 ppt] 推荐:

使用Java基于数据流直接抽取ppt文本

- - 脚本爱好者
如下代码是直接基于数据流进行文本抽取,支持powerpoint97-powerpoint2003版本,之后的版本实际都是xml,抽取文本非常简单,因此在此处不再说明,代码仅供研究学习使用,禁止用于商业用途.

Java常见疑惑和陷阱(PPT)

- water - BlogJava-首页技术区
本来是打算小范围内讨论的,话题也比较小,后来听说人多了,临时拼凑些材料. 话题过大后重点就放在讲解上,其实这里面讲解的东东还是挺多的. 以后有时间会将并发完整整理一次. xylz 2010-12-03 16:13 发表评论.

将PPT转化为PDF我的JAVA代码实现!

- - CSDN博客推荐文章
jacob的方法,足可以解决这个问题,但是我既然以前曾经做过报表,就想尝试不同的方法. JACOB是一座连接JAVA和微软的桥,所有的解析由微软解析. POI是没有微软解析的那么原汁原味的,所以如果要求高的话,还是使用JACOB. 大致思路很简单,将PPT先转化为图片,然后将图片写入PDF. 转化图片是用POI,操作PDF使用ITEX.

为 Java 程序员准备的 Go 入门 PPT

- - 外刊IT评论
这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT,为 Java 程序员快速入门 Go 而准备的. 这个 PPT 是 2015年4月23日在 NYJavaSIG 中使用的. 前往 YouTube 观看视频. “Go 是开源的编程语言,可以很简单的构建简单,可靠和高效的软件.

java 数据存储 bit

- - zzm
大家都知道在Java 数据存储方式. 定1 int = 4 byte, 1 byte = 8 bit. 以此推理那么1个int在计算机中就是以4 * 8 = 32位(bit)的方式存储的. 内存大小为一个1G的空间,有 8*1024*1024*1024=8.58*10^9bit;85亿长度. 用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过.

通过Java程序获取Dynatrace数据

- - Taobao QA Team
“dynaTrace Ajax是一个详细的底层追踪工具,它不仅可以显示所有请求和文件在网络中传输的时间,还会记录浏览器Render、CPU消耗、JavaScript解析和运行情况等详细的信息,而这些也只是dynaTrace Ajax的冰山一角. showslow平台同样采集了dynatrace的数据,所以做为kelude平台前端页面测试组件,同样要支持dynatrace数据的获取,该代码由云晰同学编写维护:.

JSON与JAVA的数据转换

- - BlogJava_首页
本文介绍如何使用JSON-lib这个Java类包实现Java的数据转换. 通过此类包可以把bean,map和XML转换成JSON并能够把JSON转回成bean和DynaBean. JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把JSON转回成bean和DynaBean.

java解析xml数据---sax解析器

- - ITeye博客
下面是handler解析数据的方法. private HashMap map = null;// 存储单个解析的完整对象. private List> list = null;// 存储全部的解析对象. private String currentTag = null; // 正在解析的元素的标签.

JAVA操作HBASE数据操作详解

- -
Hbase对于建表,和RDBMS类似,HBase也有namespace的概念,可以指定表空间创建表,也可以直接创建表,进入default表空间. 对于数据操作,HBase支持四类主要的数据操作,分别是:. Put :增加一行,修改一行;. Delete :删除一行,删除指定列族,删除指定column的多个版本,删除指定column的制定版本等;.

用PPT做笔记

- winners - 蔡學鏞【言程序】部落格
我具有十多年的讲师经历,这让我浅意识里「随时准备开发新课程教材」. 开发教材的方式有两种:「由上而下」或者「由下而上」. 这次我在QCon的演讲有两场,刚好分别是用这两种不同的方式做出来的. 对于我熟悉的主题,我采用由上而下的方式制作教材PPT;例如,我已经相当熟悉REBOL,所以我可以先决定要讲哪些内容,然后安排这些内容的次序,再加上一些润饰,就OK了.