unix 如何从.doc和.docx文件中提取纯文本?[已关闭]

sg3maiej  于 2022-11-23  发布在  Unix
关注(0)|答案(6)|浏览(330)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

我们不允许问题寻求书籍、工具、软件库等的建议。您可以编辑问题,以便使用事实和引文来回答。
七年前就关门了。
Improve this question
有人知道他们可以推荐什么东西来从.doc.docx中提取纯文本吗?
我找到了this-想知道是否还有其他建议?

vs3odd8k

vs3odd8k1#

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

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

我在command line fu找到的
它解压缩docx文件,得到实际的文档,然后剥离所有的xml标记。显然,所有的格式都丢失了。

sc4hvdpw

sc4hvdpw2#

自由办公室
其中一个选项是libreoffice/openoffice,处于无头模式(确保首先关闭所有其他的libreoffice示例):

libreoffice --headless --convert-to "txt:Text (encoded):UTF8" mydocument.doc

有关更多详细信息,请参见以下链接: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命令行语法有点过于复杂,有一个方便的 Package 器可以使这个过程更简单:unoconv
Apache兴趣点
另一个选择是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>

注意事项:您需要将apache poi库添加到类路径中。在ubuntu/debian上,这些库可以通过sudo apt-get install libapache-poi-java安装-这会将它们安装在/usr/share/java下。对于其他系统,您需要对库执行download操作,并将归档文件解压缩到您应该使用的文件夹中,而不是/usr/share/java。如果您使用maven/gradle(推荐选项),然后包括org.apache.poi dependencies,如代码片段所示。
相同的代码将适用于.doc.docx,因为所需的转换器实现将通过检查二进制流来选择。
编译上面的类(假设它在默认包中,并且apache poi jar在/usr/share/java下):

javac -cp /usr/share/java/*:. WordToTextConverter.java

运行转换:

java -cp /usr/share/java/*:. WordToTextConverter doc.docx doc.txt

一个clonable gradle project,它提取所有必要的依赖项并生成 Package 器shell脚本(使用gradle installDist)。

yh2wf1be

yh2wf1be3#

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

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

wko9yo5t4#

尝试使用“反字”或“反字-xp-rb”

我最喜欢的是反话:
http://www.winfield.demon.nl/
下面是一个类似的项目,它声称支持docx:
https://github.com/rainey/antiword-xp-rb/wiki

omhiaaxx

omhiaaxx5#

我发现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
}
hiz5n14c

hiz5n14c6#

我最近处理了这个问题,发现OpenOffice/LibreOffice命令行工具在生产中不可靠(处理了数千个文档,并发处理了几十个)。
最后,我构建了一个轻量级的 Package 器DocRipper,它的速度要快得多,可以从.doc、.docx和.pdf中抓取所有文本而不进行格式化。

相关问题