当前位置: 首页 > 面试题库 >

Java:Apache POI:我可以从MS Word(.doc)文件中获取纯文本吗?

江建明
2023-03-14
问题内容

使用Apache POI时,我(以编程方式)从MS Word文件获取的字符串与使用MS Word打开文件时看到的文本不同。

使用以下代码时:

File someFile = new File("some\\path\\MSWFile.doc");
InputStream inputStrm = new FileInputStream(someFile);
HWPFDocument wordDoc = new HWPFDocument(inputStrm);
System.out.println(wordDoc.getText());

输出是一行,其中包含许多“无效”字符(是,“框”)和许多不需要的字符串,例如“ FORMTEXT”,“ HYPERLINK \l "_Toc##########"”(“#”为数字),“ PAGEREF _Toc########## \h 4”等。

以下代码“修复”了单行问题,但保留了所有无效字符和不需要的文本:

File someFile = new File("some\\path\\MSWFile.doc");
InputStream inputStrm = new FileInputStream(someFile);
WordExtractor wordExtractor = new WordExtractor(inputStrm);
for(String paragraph:wordExtractor.getParagraphText()){
  System.out.println(paragraph);
}

我不知道我是否使用错误的方法来提取文本,但这就是我在查看POI快速指南时想到的。如果我是,正确的方法是什么?

如果输出正确,是否有消除多余文本的标准方法,还是我必须编写自己的过滤器?


问题答案:

有两种选择,一种直接在Apache POI中提供,另一种通过Apache Tika(内部使用Apache POI)提供。

第一种选择是使用WordExtractor,但是stripFields(String)在调用它时将其包装到。这将删除包含在文本中的基于文本的字段,例如您所看到的HYPERLINK。您的代码将变为:

NPOIFSFileSystem fs = new NPOIFSFileSytem(file);
WordExtractor extractor = new WordExtractor(fs.getRoot());

for(String rawText : extractor.getParagraphText()) {
String text = extractor.stripFields(rawText);
System.out.println(text);
}

另一种选择是使用Apache
Tika
。Tika为多种文件提供文本提取和元数据,因此相同的代码也适用于.doc,.docx,.pdf和许多其他文件。为了获得Word文档的纯净纯文本(如果愿意,您还可以获取XHTML),您可以执行以下操作:

TikaConfig tika = TikaConfig.getDefaultConfig();
TikaInputStream stream = TikaInputStream.get(file);
ContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
tika.getParser().parse(input, handler, metadata, new ParseContext());
String text = handler.toString();


 类似资料:
  • 当我打印响应文本(使用alert)时,它会打印包含所有HTML信息的消息。实际消息以粗体突出显示 响应消息 HTML>标题>标题>Apache Tomcat/5.0.28-错误报告/标题>样式>!--{font-family:Tahoma,Arial,Sans-serif;color:white;background-color:#525d76;font-size:22px;}H2{font-fa

  • 我有这个Spring Rest APIendpoint: XML模型。 但没有任何内容打印到控制台中。知道我错在哪里吗?可能这个组件没有注册?

  • 我有一个Spark程序(在Scala中)和一个。我正在用的编写一些文件。在我的本地机器上,我可以使用本地文件路径,它与本地文件系统一起工作。在我的集群上,它与HDFS一起工作。 我还想写其他任意文件作为处理的结果。我在本地计算机上将它们作为常规文件编写,但希望它们进入集群上的HDFS。 似乎有一些与文件相关的方法,但它们似乎都是输入而不是输出。 我该怎么做?

  • 问题内容: 我需要获取RESTful服务的WADL文件。我知道如果使用运动衫,它可以作为提供。但是我使用RESTeasy。 我可以在框架案例中做同样的事情吗? 问题答案: 引用第49章。RESTEasy WADL支持 : Chapter 49. RESTEasy WADL支持 49.1。RESTEasy WADL支持Servlet容器 49.2。对Sun JDK HTTP Server 49.3的

  • 问题内容: 我的服务器中有一个包含此信息的文本文件: 如何使用PHP从文本文件中逐行读取所有信息? 问题答案: 这将使您逐行阅读..阅读php.net/fgets上有关Mac的行尾问题的注释。

  • 问题内容: 在某些情况下,我们可能需要从Word文档中获取文本以供将来在用户上传的文档中搜索字符串,例如在cv / resumes中进行搜索,并出现一个常见的问题,即如何获取文本,打开并阅读用户上载Word文档时,有一些有用的链接,但不能解决整个问题。我们需要在上载时获取文本并将文本保存在数据库中,以便在数据库中轻松搜索。 问题答案: class DocxConversion{ private $