有没有人可以推荐一些方法,以便从.doc
或.docx
中提取纯文本?
我找到了这个,想知道是否有其他建议?
如果您想要纯文本格式(我的要求),那么您所需要的只是
unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'
我在命令行玩转网站找到了这个方法。
它会解压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 McJunkin一个选项是以无界面模式运行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 - 一个得到良好支持的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>
sudo apt-get install libapache-poi-java
命令安装这些库——它们将安装在/usr/share/java
下。对于其他系统,您需要download该库并解压缩存档到一个文件夹中,您应该使用该文件夹代替/usr/share/java
。如果您使用maven/gradle(推荐选项),则应像代码片段中所示那样包含org.apache.poi dependencies。.doc
和.docx
,因为所需的转换器实现将通过检查二进制流来选择。/usr/share/java
下):javac -cp /usr/share/java/*:. WordToTextConverter.java
运行转换:
java -cp /usr/share/java/*:. WordToTextConverter doc.docx doc.txt
一个可克隆的Gradle项目,它拉取所有必要的依赖项并生成包含gradle installDist
命令的包装脚本。
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --help
。 - ccpizzabrew cask info libreoffice
指向 https://github.com/Homebrew/homebrew-cask/blob/master/Casks/libreoffice.rb 公式,你可以在那里看到它还在 /usr/local/bin/soffice
下放置了一个包装脚本。知道具体发生了什么是很有用的,以防公式被删除,或者你需要比 brew 提供的更新版本。 - ccpizza试试Apache Tika。 它使用基于Java的库(包括Apache POI)支持大多数文档格式(所有MS Office格式,OpenOffice / LibreOffice格式,PDF等)。 使用起来非常简单:
java -jar tika-app-1.4.jar --text ./my-document.doc
我最喜欢的是antiword:
还有一个类似的项目,声称支持docx:
我认为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
}
brew install wv && brew install elinks
。 - Sean Allred
pandoc
作为最佳解决方案,它甚至可以正确地转换表格。因此,我建议重新开启问题。 - Hubbitus