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

Posted

技术标签:

【中文标题】如何从 .doc 和 .docx 文件中提取纯文本? [关闭]【英文标题】:How to extract just plain text from .doc & .docx files? [closed] 【发布时间】:2011-08-06 00:45:47 【问题描述】:

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

我找到了this - 想知道是否还有其他建议?

【问题讨论】:

这非常适合软件推荐。它应该转移到那里。 如果我们有Software Recommendations为什么不在这里转移呢?我也搜索类似任务的软件,但没有找到最佳答案。但可以推荐 pandoc 作为甚至表格正确转换的最佳解决方案。所以我建议重新提出问题。 您显然不在 Mac 上,但如果您是在命令行中使用“textutil”,则可以快速从各种专有文档类型中获取纯文本。 这个问题是discussed on Meta @Taryn:想解释一下为什么这个 Q 是题外话,但 ***.com/questions/8252220/… 不是? 【参考方案1】:

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

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

我在command line fu找到的

它解压缩 docx 文件并获取实际文档,然后剥离所有 xml 标签。显然所有格式都丢失了。

【讨论】:

我喜欢这个命令,但在最终版本中,换行符通常仍然是有用的数据。因此我改用了以下命令:unzip -p document.docx word/document.xml | sed -e 's/&lt;\/w:p&gt;/\n/g; s/&lt;[^&gt;]\1,\&gt;//g; s/[^[:print:]\n]\1,\//g' 注意附加的 sed 参数,用实际的换行符替换换行符的 XML 表示,并且我编辑了最后一个 sed 参数以不去除换行符。这使得上述命令对于区分 Word 文档更加有用。 谢谢罗伯! @Jeff:我同意,但以下命令在实践中对我来说效果更好: unzip -p document.docx word/document.xml | sed -e 's// /g; s/]\1,\>/ /g; s/[^[:print:]]\1,\/ /g' 非常好。是否也可以编辑 Word 文档中的 XML 数据而不损坏它?以及如何? 非 ASCII 字符的表现如何?尤其是更深奥的字符集? @einpoklum 命令的第一位获取原始 xml,以便正常工作。第二位获取所有无 xml 标记字符串并用新行分隔它们。因此,只要 sed 不讨厌深奥的字符集,您就可以了。如果您发现不是这种情况,请发表回复。【参考方案2】:

LibreOffice

一个选项是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 命令行语法有点过于复杂,所以有一个方便的包装器可以使过程更容易: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>

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

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

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

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

运行转换:

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

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

【讨论】:

如果您要添加 Java 选项,我想提一下“我的”docx4j(它也处理 pptx、xlsx)。对于文本提取,您可以使用 github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/… 另见问题 1686,询问 LibreOffice 关于与运行中的 LibreOffice 实例并行运行命令行转换:ask.libreoffice.org/en/question/1686/… 当我尝试使用 libreoffice 转换一些 docx 文件时,我得到了这个奇怪的错误 Error: Please reverify input parameters...,当我切换到 --convert-to "txt:Text (encoded):UTF8" 时我就消失了,所以我建议(即使你不'没有非ASCII字符)。 @senderle:无需卸载现有的 GUI 安装版本——在这种情况下,二进制文件在 $PATH 中不可用;你仍然可以在 macos 上调用它,例如与/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --help @senderle:很公平; brew cask info libreoffice 指向github.com/Homebrew/homebrew-cask/blob/master/Casks/… 处的公式,您可以在其中看到它还在/usr/local/bin/soffice 下放置了一个包装脚本。万一公式被删除,或者您需要比 brew 提供的版本更新的版本,了解究竟发生了什么是很有用的。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我最喜欢的是antiword:

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

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

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

【讨论】:

多次使用(上)antiword,但它不适用于docx。从其页面:“Antiword 将二进制文件从 Word 2、6、7、97、2000、2002 和 2003 转换为纯文本和 PostScript”【参考方案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

【讨论】:

OSX 用户可以brew install wv &amp;&amp; brew install elinks 工作愉快并支持 .doc 和 .docx【参考方案6】:

对于 docx,http://libopc.codeplex.com/ 怎么样

【讨论】:

【参考方案7】:

我最近处理了这个问题,发现 OpenOffice/LibreOffice 命令行工具在生产中不可靠(处理了数千个文档,同时处理了数十个文档)。

最终,我构建了一个轻量级包装器DocRipper,它速度更快,并且可以从 .doc、.docx 和 .pdf 中抓取所有文本而无需格式化。 DocRipper 利用 Antiword、grep 和 pdftotext 抓取文本并返回。

【讨论】:

以上是关于如何从 .doc 和 .docx 文件中提取纯文本? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用 C++/Qt 编写的程序中的 RTF/doc/docx 文本提取

python 解析docx文档的方法,以及提取插入的文本对象和图片

如何使用Python将某些字符串从文本文件复制到Word doc?

纯js判断文件流格式类型:pdf,doc,docx,xls,xlsx,ppt,pptx一次搞定!

Ruby:从 docx 文件中解析/提取图像和对象

如何在android中读取.doc、.docx、.xls文件[重复]