COM オートメーションに依存しない Word ファイルからプレーン テキストを抽出する合理的な方法はありますか? (これは、Windows 以外のプラットフォームにデプロイされた Web アプリの機能です。この場合、交渉の余地はありません。)
アンチワードは合理的なオプションのように思えますが、放棄される可能性があるようです.
Python ソリューションが理想的ですが、利用できないようです。
( PythonでMSワードファイルからテキストを抽出するのと同じ答え)
今週作成したネイティブ Python docx モジュールを使用します。ドキュメントからすべてのテキストを抽出する方法は次のとおりです。
document = opendocx('Hello world.docx')
# This location is where most document content lives
docbody = document.xpath('/w:document/w:body', namespaces=wordnamespaces)[0]
# Extract all text
print getdocumenttext(document)
Python DocX サイトを参照してください
100% Python、COM なし、.net なし、Java なし、正規表現によるシリアライズされた XML の解析なし。
これには、解析が最も簡単な結果が得られるものなら何でも、catdocまたはantiwordを使用します。これをPython関数に埋め込んだので、解析システム(Pythonで記述されている)から簡単に使用できます。
import os
def doc_to_text_catdoc(filename):
(fi, fo, fe) = os.popen3('catdoc -w "%s"' % filename)
fi.close()
retval = fo.read()
erroroutput = fe.read()
fo.close()
fe.close()
if not erroroutput:
return retval
else:
raise OSError("Executing the command caused an error: %s" % erroroutput)
# similar doc_to_text_antiword()
catdocへの-wスイッチは、行の折り返しをオフにします、ところで。
Word ファイル (.docx) からテキストを抽出するだけなら、Python でのみ可能です。Guy Starbuck が書いたように、ファイルを解凍して XML を解析するだけです。に触発されてpython-docx
、これを行うための簡単な関数を作成しました。
try:
from xml.etree.cElementTree import XML
except ImportError:
from xml.etree.ElementTree import XML
import zipfile
"""
Module that extract text from MS XML Word document (.docx).
(Inspired by python-docx <https://github.com/mikemaccana/python-docx>)
"""
WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
PARA = WORD_NAMESPACE + 'p'
TEXT = WORD_NAMESPACE + 't'
def get_docx_text(path):
"""
Take the path of a docx file as argument, return the text in unicode.
"""
document = zipfile.ZipFile(path)
xml_content = document.read('word/document.xml')
document.close()
tree = XML(xml_content)
paragraphs = []
for paragraph in tree.getiterator(PARA):
texts = [node.text
for node in paragraph.getiterator(TEXT)
if node.text]
if texts:
paragraphs.append(''.join(texts))
return '\n\n'.join(paragraphs)
OpenOffice API、Python、Andrew Pitonyakの優れたオンラインマクロブックを使用して、これを行うことができました。セクション7.16.4から始めましょう。
画面をまったく必要とせずに機能させるためのもう1つのヒントは、Hiddenプロパティを使用することです。
RO = PropertyValue('ReadOnly', 0, True, 0)
Hidden = PropertyValue('Hidden', 0, True, 0)
xDoc = desktop.loadComponentFromURL( docpath,"_blank", 0, (RO, Hidden,) )
それ以外の場合は、ドキュメントを開いたときに、ドキュメントが画面上(おそらくWebサーバーコンソール上)でフリックアップします。
docxファイルについては、次のURLで入手できるPythonスクリプトdocx2txtを確認してください。
http://cobweb.ecn.purdue.edu/~kak/distMisc/docx2txt
docxドキュメントからプレーンテキストを抽出するため。
Open Office にはAPIがあります
これは、.doc と .odt でうまく機能しました。
コマンド ラインで openoffice を呼び出して、ファイルをテキストに変換します。テキストは、Python に簡単にロードできます。
(明らかに文書化されていませんが、他の形式オプションがあるようです。)
正直なところ、「 pip install tika 」は使用しないでください。これは、マルチユーザー(マルチ開発者)ではなく、モノユーザー(ラップトップで作業している1人の開発者)向けに開発されています。
コマンド ラインで Tika を使用する小さなクラス TikaWrapper.py ベローは、私たちのニーズを満たすのに十分な広さです。
このクラスを JAVA_HOME パスと Tika jar パスでインスタンス化するだけです。また、多くの形式 (例: PDF、DOCX、ODT、XLSX、PPT など) で完全に機能します。
#!/bin/python
# -*- coding: utf-8 -*-
# Class to extract metadata and text from different file types (such as PPT, XLS, and PDF)
# Developed by Philippe ROSSIGNOL
#####################
# TikaWrapper class #
#####################
class TikaWrapper:
java_home = None
tikalib_path = None
# Constructor
def __init__(self, java_home, tikalib_path):
self.java_home = java_home
self.tika_lib_path = tikalib_path
def extractMetadata(self, filePath, encoding="UTF-8", returnTuple=False):
'''
- Description:
Extract metadata from a document
- Params:
filePath: The document file path
encoding: The encoding (default = "UTF-8")
returnTuple: If True return a tuple which contains both the output and the error (default = False)
- Examples:
metadata = extractMetadata(filePath="MyDocument.docx")
metadata, error = extractMetadata(filePath="MyDocument.docx", encoding="UTF-8", returnTuple=True)
'''
cmd = self._getCmd(self._cmdExtractMetadata, filePath, encoding)
out, err = self._execute(cmd, encoding)
if (returnTuple): return out, err
return out
def extractText(self, filePath, encoding="UTF-8", returnTuple=False):
'''
- Description:
Extract text from a document
- Params:
filePath: The document file path
encoding: The encoding (default = "UTF-8")
returnTuple: If True return a tuple which contains both the output and the error (default = False)
- Examples:
text = extractText(filePath="MyDocument.docx")
text, error = extractText(filePath="MyDocument.docx", encoding="UTF-8", returnTuple=True)
'''
cmd = self._getCmd(self._cmdExtractText, filePath, encoding)
out, err = self._execute(cmd, encoding)
return out, err
# ===========
# = PRIVATE =
# ===========
_cmdExtractMetadata = "${JAVA_HOME}/bin/java -jar ${TIKALIB_PATH} --metadata ${FILE_PATH}"
_cmdExtractText = "${JAVA_HOME}/bin/java -jar ${TIKALIB_PATH} --encoding=${ENCODING} --text ${FILE_PATH}"
def _getCmd(self, cmdModel, filePath, encoding):
cmd = cmdModel.replace("${JAVA_HOME}", self.java_home)
cmd = cmd.replace("${TIKALIB_PATH}", self.tika_lib_path)
cmd = cmd.replace("${ENCODING}", encoding)
cmd = cmd.replace("${FILE_PATH}", filePath)
return cmd
def _execute(self, cmd, encoding):
import subprocess
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
out = out.decode(encoding=encoding)
err = err.decode(encoding=encoding)
return out, err