文档章节

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

 脚本爱好者
发布于 2012/06/25 11:42
字数 527
阅读 182
收藏 1
点赞 0
评论 0

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


public class WordExtractor {
   
    public static StringBuilder logBytes = new StringBuilder();
   
    public static String bytesToString(byte[] ogiBytes, int start, int length, int fc)
    {
        StringBuilder content = new StringBuilder();
        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 content.toString();
                }
               
                String a = Integer.toHexString(bytes[i+1] & 0xFF);
                String b = Integer.toHexString(bytes[i] & 0xFF);
                if(a.length() == 1)
                {
                    a = "0"+ a;
                }
               
                if(b.length() == 1)
                {
                    b = "0"+ b;
                }
               
                String hexStr = a + b;
                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 );
            }
        }
       
        return content.toString();
    }
   
    public static void bytesToString(byte[] ogiBytes, StringBuilder content, int start, int length, int fc)
    {
        content.append( bytesToString(ogiBytes, start, length, fc) );
    }
   
    public static void printLogBytes(List<Byte> legaled) throws Exception
    {
        logBytes = new StringBuilder();
       
        logBytes.append(" ========================================================");
        for(int a=0;a<legaled.size();a++)
        {
            if(a % 16 == 0)
            {
                logBytes.append(" ");
            }
            logBytes.append(Integer.toHexString(legaled.get(a) & 0xFF) +" ");
        }
        logBytes.append(" ========================================================");
       
        FileUtil.writeAscFile("E:ytes.txt", logBytes.toString());
    }
   
    public static int getOneTable(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("1Table") > -1)
            {
                return offsetEntry;
            }
        }
       
        return 0;
    }
   
    public static void main(String[] args) throws Exception
    {
        byte[] ogiBytes = FileUtil.readBinFile("D: oolsoletest est-old.doc");
       
        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 doc file!");
            return;
        }
       
        StringBuilder content = new StringBuilder();
       
        Stream stream = new Stream(ogiBytes);
        int[] offset = new int[1];
       
        offset[0] = 48;
        int dirSect1 = stream.getInteger(offset);
        int oneTable = getOneTable(ogiBytes, stream, dirSect1);
       
        offset[0] = oneTable + 116;
        int startSect = stream.getInteger(offset);
        int tableStream = (startSect + 1)*512;
       
        offset[0] = 930;
        int fcClx = stream.getInteger(offset);
        if(fcClx == -1)
        {
            System.out.println("This version of doc can not be parsed!");
            return;
        }
       
        int offsetClx = tableStream + fcClx;
       
        offset[0] = offsetClx + 1;
        int lcb = stream.getInteger(offset);
      
        int countPcd = (lcb - 4)/12;
        int countCp = (lcb - countPcd*8)/4;
        int offsetPlcpcd = offsetClx + 5;
      
        for(int i=0;i<countPcd;i++)
        {
            int offsetPcd = offsetPlcpcd + countCp*4 + i*8;
           
            offset[0] = offsetPcd + 2;
            int start = stream.getInteger(offset);
            int fc = start >> 30;
            start = (start << 2) >> 2;
      
            offset[0] = offsetPlcpcd + i*4;
            int cpPre = stream.getInteger(offset);
            int cpNext = stream.getInteger(offset);
            int length = cpNext - cpPre -1;
            if(fc == 0)
            {
                length *= 2;
            }
            else
            {
                start = start/2;
            }
           
            start += 512;
            bytesToString(ogiBytes, content, start, length, fc);
       
            System.out.println(start +", "+ length);
        }
       
        FileUtil.writeAscFile("E:output.txt", content.toString(), false);
       
        System.out.println("Done!");
       
    }
}

参考资料:
http://blog.csdn.net/hu0406/article/details/3157192
http://msdn.microsoft.com/zh-cn/library/gg615596.aspx

本文转载自:http://www.xiaomeiti.com

共有 人打赏支持
粉丝 1
博文 2
码字总数 0
作品 0
东城
程序员
ecplise常用的快捷键(汇总)

不多说,直接奉上: Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和...

爱幻想的螃蟹
2014/08/06
0
0
Eclipse开发andrioid常用快捷键

熟悉eclipse开发android的一些快捷键,能很大的提高效率,分享在下面: Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+...

索隆
2013/03/25
0
0
Eclipse平台快捷键,开发必备!

学习Android开发,eclipse的使用是少不了的,今天找了一些eclipse的快捷键跟大家分享一下,后续还会有更多资料和大家分享,呵呵,一起努力吧! Ctrl+1 快速修复(最经典的快捷键,就不用多说了...

铂金小猪
2011/08/17
0
0
Eclipse快捷键大全(转载)

Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置...

JavaGG
2009/03/12
0
0
Eclipse cdt安装与使用

Eclipse cdt安装与使用 基于Window 7 Ultimate X64 + Eclipse SDK3.5.2 + cdt + MinGW-5.1.6 + gdb-6.6 + MSYS-1.0.11 1、启动Eclipse SDK,选择Help->"Install New Software...","Work wit......

DB_Terrill
2011/08/05
0
0
eclipse中快速多行注释的方法以及Myeclipse快捷

1.选中你要加注释的区域,用ctrl+shift+C 会加上//注释 2.先把你要注释的东西选中,用shit+ctrl+/ 会加上/ /注释 3.要修改在eclispe中的命令的快捷键方式我们只需进入windows -> preference...

lzw_me
2013/09/06
0
0
1.5.1 编辑java源代码

编辑 java 源代码可以使用任何无格式的文本编辑器,在Windows操作系统上可以使用记事本(NotePad)、EditPlus 等程序,在Linux平台上可以使用VI工具等。 注意:编写java程序不要使用写字板,...

Gooiem
2015/08/25
0
0
JAVA自然语言处理NLP工具包

Java自然语言处理 LingPipe LingPipe 是一个自然语言处理的Java开源工具包。LingPipe目前已有很丰富的功能,包括主题分类(Top Classification)、命名实体识别(Named Entity Recognition)...

javaex999
2014/05/05
0
0
Elasticsearch的基友Logstash

Logstash 是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理。 一、原理 Input 可以从文件中、存储中、数据库中抽取数据,Input有两...

甩锅侠
2017/12/11
0
0
Android - eclipse快捷键与技巧大全

Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置...

Jerikc
2012/09/04
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring-@RequestBody

@RequestMapping("/login")    public void login(@RequestBody String userName,@RequestBody String pwd){      System.out.println(userName+" :"+pwd);    }    ......

说回答
6分钟前
0
0
Redis安装

大家可以通过该链接获取安装详情(这是一个Word文档,支持下载): http://note.youdao.com/noteshare?id=7a327ed6c58fb2037ba537e58ecf7510&sub=480DB8EF349747C3983B73AE94D45BB1 其他参考...

一梦心草
6分钟前
0
0
MySQL按天,按周,按月,按时间段统计【转载】

https://blog.csdn.net/qq_28056641/article/details/78306870 select DATE_FORMAT(create_time,'%Y%m%d') days,count(caseid) count from tc_case group by days; select DATE_FORMAT(creat......

李道福
8分钟前
0
0
浅谈parallelStream

parallelStream是什么,它是一个集合的并发处理流.其作用是把一个集合中的数据分片,进行一个多线程的处理,增快运行速度. 比如说这样一段代码 private Set<SysRole> sysRoles;private Set<St...

算法之名
10分钟前
3
0
器者,道之所载

形而上者谓之道,形而下者谓之器,化而裁之谓之变;推而行之谓之通,举而措之天下之民,谓之事业。—— 《道德经》

了凡川
11分钟前
0
0
C#命名规范中文版/C#编码规范中文版

最新文档地址https://github.com/hiramtan/CSharpNamingGuidelines_Chinese C#命名规范中文版/C#编码规范中文版 示例 /*****************************************************************......

海贝Hibey
13分钟前
0
0
刚从eclipse转到Intellij IDEA,分享一些配置经验

刚从eclipse转到Intellij IDEA,分享一些配置经验,IntelliJ IDEA作为最好的Java开发工具,在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等...

舒文joven
14分钟前
1
0
lombok 引入后,测试类始终找不到get,set方法。

开发环境为idea,jdk1.7,maven3.5. 网上直接搜出来的方法有: 1、在setting里安装lombok的plugins; 2、如下图,勾选enable annocation processing选项 3、升级maven plugins插件 我尝试了以...

Kidult
20分钟前
0
0
Duang,HUAWEI DevEco IDE全面升级啦

想感受全新UI带来的视觉及交互体验、 HiKey970开发板调测、 HiAI API推荐和收藏、 深度AI模型分析等新功能, 体验高清晰度和流畅度的远程AI真机调测吗? 全新的UI设计 采用最优秀的视觉及交互...

华为终端开放实验室
29分钟前
1
0
阻止事件冒泡,阻止默认事件

1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开, 2.event....

闫亚亚
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部