まず、完全に合理的な質問に答えます。「 なぜこれが実際に必要なのですか? »そうです、たとえば、Word文書から取得したきれいなテキストは、かなり複雑です。 しかし、この「混乱」は、たとえば、オフィス文書の広範なリポジトリを検索するためのインデックスを構築するのに十分です。
別の非常に妥当な質問は、「 アンチワードやxpdfなどのサードパーティのユーティリティ、または極端な場合はWindowsのOLEを使用してはいけない 」 というものです。これらは設定条件であり、この技術。
今日、「種」として、タスクに十分なシンプルなフォーマットについてお話します。これは、MicrosoftのDOCXおよびODF AlianceのODTとも呼ばれるOpenDocument Formatとして知られているOffice Open XMLです。
最初に、いくつかのファイルの内部を見て、文字通り次のものを見てみましょう(docxの後ろ、front odt):

ここで最も重要なことは、データの先頭にある
PK
最初の2文字です。 これは、両方のファイルが.docx / .odtに名前変更されたzipアーカイブであることを意味します。 たとえば、Total Commanderで
Ctrl+PageDown
を開いて、非常に許容可能な構造(左側のodt、右側のdocx)を確認します。

したがって、必要なデータファイルはODTのcontent.xmlとDOCXのword / document.xmlです。 それらからテキストデータを読み取るには、簡単なコードを記述します。
わずか30行で、ファイルからテキストデータを取得します。 コードはPHP 5.2以降で実行され、Windowsでは
- 関数 odt2text ( $ filename ) {
- return getTextFromZippedXML ( $ filename 、 " content.xml " ) ;
- }
- 関数 docx2text ( $ filename ) {
- return getTextFromZippedXML ( $ filename 、 "word / document.xml" ) ;
- }
- 関数 getTextFromZippedXML ( $ archiveFile 、 $ contentFile ) {
- // zipアーカイブの「生まれ変わり」を作成します...
- $ zip = 新しい ZipArchive ;
- //そして、転送されたzipファイルを開こうとします
- if ( $ zip- > open ( $ archiveFile ) ) {
- //成功した場合、アーカイブ内のデータファイルを探します
- if ( ( $ index = $ zip- > LocateName ( $ contentFile ) ) !== false ) {
- //見つかったら、一行で読む
- $ content = $ zip- > getFromIndex ( $ index ) ;
- // zipアーカイブを閉じます。もう必要ありません
- $ zip- > close ( ) ;
- //その後、すべてのエンティティを読み込み、可能であれば他のファイルをインクルードします
- //エラーと警告を飲み込む
- $ xml = DOMDocument :: loadXML ( $ content 、 LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING ) ;
- //次に、XMLフォーマットタグなしでデータを返します
- return strip_tags ( $ xml- > saveXML ( ) ) ;
- }
- $ zip- > close ( ) ;
- }
- //何か問題が発生した場合、空の文字列を返します
- return "" ;
- }
php_zip.dll
、Linuxでは
--enable-zip
キーが必要
php_zip.dll
。
ZipArchive
(古いバージョンのPHPまたはライブラリの欠如)を使用する可能性がない場合、システム内の適切なツールなしでzipファイルの読み取りを実装するPclZipライブラリが適合します。
このコードは、テキストの読み取りの問題を解決するための空白にすぎないことに注意してください。 「すべてのコストでのテキスト」というスローガンの下の一連の記事の後、書式付きテキストの読み取りの原則と実装について説明しようとします。
トピックについて: 次回は、xpdfを使用せずにPDFからテキストを読み取る方法について説明します。 より複雑ですが、PHPタスクには非常に適しています。