すべての費用でテキスト:DOCXおよびODT

最近、さまざまなワークフロー形式(Microsoft WordまたはPDF文書)からクリーンテキストを取得するという問題が発生しました。 可能性のある入力データのリストが少し広くても、タスクは完了しました。 したがって、この記事では、DOC、DOCX、RTF、ODT、およびPDF-サードパーティのユーティリティを使用せずにPHPを使用するファイルタイプからのテキストの読み取りに関する出版物のリストを開きます。



まず、完全に合理的な質問に答えます。「 なぜこれが実際に必要なのですか? »そうです、たとえば、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です。 それらからテキストデータを読み取るには、簡単なコードを記述します。



  1. 関数 odt2text $ filename {
  2. return getTextFromZippedXML $ filename " content.xml " ;
  3. }
  4. 関数 docx2text $ filename {
  5. return getTextFromZippedXML $ filename "word / document.xml" ;
  6. }
  7. 関数 getTextFromZippedXML $ archiveFile $ contentFile {
  8. // zipアーカイブの「生まれ変わり」を作成します...
  9. $ zip = 新しい ZipArchive ;
  10. //そして、転送されたzipファイルを開こうとします
  11. if $ zip- > open $ archiveFile {
  12. //成功した場合、アーカイブ内のデータファイルを探します
  13. if $ index = $ zip- > LocateName $ contentFile !== false {
  14. //見つかったら、一行で読む
  15. $ content = $ zip- > getFromIndex $ index ;
  16. // zipアーカイブを閉じます。もう必要ありません
  17. $ zip- > close ;
  18. //その後、すべてのエンティティを読み込み、可能であれば他のファイルをインクルードします
  19. //エラーと警告を飲み込む
  20. $ xml = DOMDocument :: loadXML $ content LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING ;
  21. //次に、XMLフォーマットタグなしでデータを返します
  22. return strip_tags $ xml- > saveXML ;
  23. }
  24. $ zip- > close ;
  25. }
  26. //何か問題が発生した場合、空の文字列を返します
  27. return "" ;
  28. }
わずか30行で、ファイルからテキストデータを取得します。 コードはPHP 5.2以降で実行され、Windowsではphp_zip.dll



、Linuxでは--enable-zip



キーが必要php_zip.dll



ZipArchive



(古いバージョンのPHPまたはライブラリの欠如)を使用する可能性がない場合、システム内の適切なツールなしでzipファイルの読み取りを実装するPclZipライブラリが適合します。



このコードは、テキストの読み取りの問題を解決するための空白にすぎないことに注意してください。 「すべてのコストでのテキスト」というスローガンの下の一連の記事の後、書式付きテキストの読み取りの原則と実装について説明しようとします。



トピックについて: 次回は、xpdfを使用せずにPDFからテキストを読み取る方法について説明します。 より複雑ですが、PHPタスクには非常に適しています。



All Articles