25

COM オートメーションに依存しない Word ファイルからプレーン テキストを抽出する合理的な方法はありますか? (これは、Windows 以外のプラットフォームにデプロイされた Web アプリの機能です。この場合、交渉の余地はありません。)

アンチワードは合理的なオプションのように思えますが、放棄される可能性があるようです.

Python ソリューションが理想的ですが、利用できないようです。

4

11 に答える 11

21

( 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 の解析なし。

于 2009-12-30T12:23:05.100 に答える
16

これには、解析が最も簡単な結果が得られるものなら何でも、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スイッチは、行の折り返しをオフにします、ところで。

于 2008-09-04T08:52:01.170 に答える
4

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)
于 2013-12-18T16:38:12.093 に答える
3

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サーバーコンソール上)でフリックアップします。

于 2008-09-04T07:45:26.247 に答える
1

docxファイルについては、次のURLで入手できるPythonスクリプトdocx2txtを確認してください。

http://cobweb.ecn.purdue.edu/~kak/distMisc/docx2txt

docxドキュメントからプレーンテキストを抽出するため。

于 2009-09-06T23:44:00.270 に答える
1

Open Office にはAPIがあります

于 2008-09-03T20:20:00.107 に答える
1

これは、.doc と .odt でうまく機能しました。

コマンド ラインで openoffice を呼び出して、ファイルをテキストに変換します。テキストは、Python に簡単にロードできます。

(明らかに文書化されていませんが、他の形式オプションがあるようです。)

于 2015-05-08T11:23:19.110 に答える
0

正直なところ、「 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
于 2020-07-18T22:34:45.380 に答える