如何从.doc和.docx文件中提取纯文本?(UNIX)

doc*_*act 42 unix text-extraction doc extract docx

任何人都知道他们可以推荐什么,以便从.doc或.docx中提取纯文本?

我发现这种最好的方法从Word文档中提取文本而不使用COM /自动化? - 想知道是否还有其他建议?

速度并不重要,我们甚至可以使用具有一些API的网站上传和提取文件,但我一直无法找到.

谢谢

rob*_*rob 50

如果你想要纯文本(我的要求),那么你需要的只是

unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'
Run Code Online (Sandbox Code Playgroud)

我在命令行fu找到了

它解压缩docx文件并获取实际文档,然后删除所有xml标记.显然所有格式都丢失了.

  • 我喜欢这个命令,但通常换行仍然是最终版本中的有用数据.因此我改为使用以下命令:`unzip -p document.docx word/document.xml | sed -e's/<\/w:p>/\n/g; S/<[^>]\{1,\}> //克; s/[^ [:print:] \n]\{1,\} // g'`注意附加的sed参数,用实际的换行符替换换行符的XML表示,然后编辑最后一个sed参数为not strip换行符.这使得上面的命令对于扩展Word文档更有用. (12认同)

ccp*_*zza 28

LibreOffice的

一种选择是无头模式下的libreoffice/openoffice(确保首先关闭libreoffice的所有其他实例):

libreoffice --headless --convert-to "txt:Text (encoded):UTF8" mydocument.doc
Run Code Online (Sandbox Code Playgroud)

欲了解更多详情,请参见例如此链接:http://ask.libreoffice.org/en/question/2641/convert-to-command-line-parameter/

有关libreoffice过滤器的列表,请参阅http://cgit.freedesktop.org/libreoffice/core/tree/filter/source/config/fragments/filters

由于openoffice命令行语法有点过于复杂,因此有一个方便的包装器可以使过程更容易:unoconv.

Apache POI

另一种选择是Apache的POI -一个很好的支持Java库,它不像antiword可以阅读,创建和转换.doc,.docx,.xls,.xlsx,.ppt,.pptx文件.

以下是用于将文档.doc.docx文档转换为纯文本的最简单的Java代码:

import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;

import org.apache.poi.POITextExtractor;
import org.apache.poi.extractor.ExtractorFactory;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.xmlbeans.XmlException;

public class WordToTextConverter {
    public static void main(String[] args) {
        try {
            convertWordToText(args[0], args[1]);
        } catch (ArrayIndexOutOfBoundsException aiobe) {
            System.out.println("Usage: java WordToTextConverter <word_file> <text_file>");
        }
    }

    public static void convertWordToText(String src, String desc) {
        try {
            FileInputStream fs = new FileInputStream(src);
            final POITextExtractor extractor = ExtractorFactory.createExtractor(fs);
            FileWriter fw = new FileWriter(desc);
            fw.write(extractor.getText());
            fw.flush();
            fs.close();
            fw.close();

        } catch (IOException | OpenXML4JException | XmlException e) {
            e.printStackTrace();
        }
    }
}


# Maven dependencies (pom.xml):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>my.wordconv</groupId>
<artifactId>my.wordconv.converter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>3.17</version>
    </dependency>
</dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

注意:您需要将apache poi库添加到类路径中.在ubuntu/debian上可以安装库sudo apt-get install libapache-poi-java- 这将安装它们/usr/share/java.对于其他系统,您需要下载库并将存档解压缩到您应该使用的文件夹而不是/usr/share/java.如果您使用maven/gradle(推荐选项),则包含org.apache.poi依赖项,如代码段中所示.

相同的代码将适用于两者,.doc并且.docx将通过检查二进制流来选择所需的转换器实现.

编译上面的类(假设它在默认包中,并且apache poi jar在下面/usr/share/java):

javac -cp /usr/share/java/*:. WordToTextConverter.java
Run Code Online (Sandbox Code Playgroud)

运行转换:

java -cp /usr/share/java/*:. WordToTextConverter doc.docx doc.txt 
Run Code Online (Sandbox Code Playgroud)

  • @senderle:无需卸载现有的 GUI 安装版本——在这种情况下,二进制文件在 $PATH 中不可用;您仍然可以在 macos 上调用它,例如使用`/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --help` (3认同)
  • 当我尝试使用libreoffice转换一些docx文件时,我得到了这个奇怪的错误`错误:请重新验证输入参数...`,当我切换到`--convert-to"txt时我消失了:文本(编码):UTF8 "`,所以我建议(即使你没有非ascii字符). (2认同)
  • @senderle:足够公平;`brew cask info libreoffice` 指向 https://github.com/Homebrew/homebrew-cask/blob/master/Casks/libreoffice.rb 中的公式,您可以在其中看到它另外在 `/usr/local 下放置了一个包装脚本/bin/办公室`。如果公式被删除,或者如果您需要比 brew 提供的版本更新的版本,了解到底发生了什么很有用。 (2认同)

mol*_*arg 12

试试Apache Tika.它支持使用基于Java的库(其中包括Apache POI)的大多数文档格式(每种Office格式,OpenOffice/LibreOffice格式,PDF等).它使用起来非常简单:

java -jar tika-app-1.4.jar --text ./my-document.doc


Chr*_*rle 10

我最喜欢的是反词:

http://www.winfield.demon.nl/

这是一个声称支持docx的类似项目:

https://github.com/rainey/antiword-xp-rb/wiki


And*_*dre 5

我发现wv比catdoc或antiword更好。它可以处理.docx并转换为文本或html。这是我添加到.bashrc中的函数,用于在终端中临时查看文件。根据需要进行更改。

# open word in less (ie worl document.doc)
worl() {
    DOC=$(mktemp /tmp/output.XXXXXXXXXX)
    wvText $1 $DOC
    less $DOC
    rm $DOC
}
Run Code Online (Sandbox Code Playgroud)

  • 对于OSX上的用户,您可以“简单安装wv &amp;&amp; brew install elinks”。 (2认同)