如何从 .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/<\/w:p>/\n/g; s/<[^>]\1,\>//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 && 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?