web-dev-qa-db-ja.com

PHPでのMS Wordファイルの読み取り/書き込み

COMオブジェクトを使用せずにWord(2003および2007)ファイルをPHPで読み書きできますか?

$file = fopen('c:\file.doc', 'w+');
fwrite($file, $text);
fclose();

ただし、Wordはネイティブの.docファイルではなくHTMLファイルとして読み取ります。

32
UnkwnTech

バイナリのWord文書を読むには、DOC形式の公開ファイル形式仕様に従ってパーサーを作成する必要があります。これは現実的な解決策ではないと思います。

Wordファイルの読み取りと書き込みに Microsoft Office XML形式 を使用できます。これは、Wordの2003および2007バージョンと互換性があります。読むには、Word文書が正しい形式で保存されていることを確認する必要があります(Word 2007ではWord 2003 XML-Documentと呼ばれます)。書くには、公開されているXMLスキーマに従う必要があります。 PHPからOfficeドキュメントを書き出すためにこの形式を使用したことはありませんが、Excelワークシート(XML-Spreadsheet 2003として自然に保存されている)を読み取り、そのデータをWebページに表示するために使用しています。ファイルは単純にXMLデータであるため、内部をナビゲートして、必要なデータを抽出する方法を見つけることは問題ありません。

他のオプション-Word 2007のみのオプション(OpenXMLファイル形式がWord 2003にインストールされていない場合)-は、 OpenXML に変更します。 databyss 指摘 ここ DOCXファイル形式は、XMLファイルが含まれた単なるZipアーカイブです。 OpenXMLファイル形式に関して [〜#〜] msdn [〜#〜] には多くのリソースがあるため、必要なデータの読み取り方法を理解できるはずです。執筆はもっと複雑になると思います-どれだけの時間を投資するかによって決まります。

おそらく PHPExcel を見ることができます。これは、OpenXML標準を使用してExcel 2007ファイルに書き込み、Excel 2007ファイルから読み取ることができるライブラリです。 OpenXML Word文書を読み書きしようとするときに、関連する作業のアイデアを得ることができます。

28
Stefan Gehrig

これはvs <office 2007とその純粋なPHPで動作します。

<?php



/*****************************************************************
This approach uses detection of NUL (chr(00)) and end line (chr(13))
to decide where the text is:
- divide the file contents up by chr(13)
- reject any slices containing a NUL
- stitch the rest together again
- clean up with a regular expression
*****************************************************************/

function parseWord($userDoc) 
{
    $fileHandle = fopen($userDoc, "r");
    $line = @fread($fileHandle, filesize($userDoc));   
    $lines = explode(chr(0x0D),$line);
    $outtext = "";
    foreach($lines as $thisline)
      {
        $pos = strpos($thisline, chr(0x00));
        if (($pos !== FALSE)||(strlen($thisline)==0))
          {
          } else {
            $outtext .= $thisline." ";
          }
      }
     $outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",$outtext);
    return $outtext;
} 

$userDoc = "cv.doc";

$text = parseWord($userDoc);
echo $text;


?>
18
Mac

Antiwordを使用できます。これはLinuxおよび最も一般的なOS用の無料のMS Wordリーダーです。

$document_file = 'c:\file.doc';
$text_from_doc = Shell_exec('/usr/local/bin/antiword '.$document_file);
8
Mantichora

コードを更新するだけ

<?php

/*****************************************************************
This approach uses detection of NUL (chr(00)) and end line (chr(13))
to decide where the text is:
- divide the file contents up by chr(13)
- reject any slices containing a NUL
- stitch the rest together again
- clean up with a regular expression
*****************************************************************/

function parseWord($userDoc) 
{
    $fileHandle = fopen($userDoc, "r");
    $Word_text = @fread($fileHandle, filesize($userDoc));
    $line = "";
    $tam = filesize($userDoc);
    $nulos = 0;
    $caracteres = 0;
    for($i=1536; $i<$tam; $i++)
    {
        $line .= $Word_text[$i];

        if( $Word_text[$i] == 0)
        {
            $nulos++;
        }
        else
        {
            $nulos=0;
            $caracteres++;
        }

        if( $nulos>1996)
        {   
            break;  
        }
    }

    //echo $caracteres;

    $lines = explode(chr(0x0D),$line);
    //$outtext = "<pre>";

    $outtext = "";
    foreach($lines as $thisline)
    {
        $tam = strlen($thisline);
        if( !$tam )
        {
            continue;
        }

        $new_line = ""; 
        for($i=0; $i<$tam; $i++)
        {
            $onechar = $thisline[$i];
            if( $onechar > chr(240) )
            {
                continue;
            }

            if( $onechar >= chr(0x20) )
            {
                $caracteres++;
                $new_line .= $onechar;
            }

            if( $onechar == chr(0x14) )
            {
                $new_line .= "</a>";
            }

            if( $onechar == chr(0x07) )
            {
                $new_line .= "\t";
                if( isset($thisline[$i+1]) )
                {
                    if( $thisline[$i+1] == chr(0x07) )
                    {
                        $new_line .= "\n";
                    }
                }
            }
        }
        //troca por hiperlink
        $new_line = str_replace("HYPERLINK" ,"<a href=",$new_line); 
        $new_line = str_replace("\o" ,">",$new_line); 
        $new_line .= "\n";

        //link de imagens
        $new_line = str_replace("INCLUDEPICTURE" ,"<br><img src=",$new_line); 
        $new_line = str_replace("\*" ,"><br>",$new_line); 
        $new_line = str_replace("MERGEFORMATINET" ,"",$new_line); 


        $outtext .= nl2br($new_line);
    }

 return $outtext;
} 

$userDoc = "custo.doc";
$userDoc = "Cultura.doc";
$text = parseWord($userDoc);

echo $text;


?>
6
WIlson

PHPでネイティブのWord文書を読むことについては知りませんが、PHPでWord文書を作成したい場合は、 WordprocessingML(別名WordML) が良い解決策かもしれません。必要なことは、正しい形式のXMLドキュメントを作成することだけです。 Word 2003と2007はどちらもWordMLをサポートしていると思います。

6
Joe Lencioni

おそらく、COMなしではWord文書を読むことができないでしょう。

執筆はこれでカバーされました topic

5
Sergey Kornilov

2007年も少し複雑になるかもしれません。

.docx形式は、フォーマットやその他のもの用の他のファイルを含むいくつかのフォルダーを含むZipファイルです。

.docxファイルの名前を.Zipに変更すると、意味がわかります。

したがって、PHPのZipファイル内で作業できる場合は、正しい道を歩む必要があります。

2
databyss

www.phplivedocx.orgはSOAPベースのサービスです。つまり、ファイルのテストには常にオンラインである必要がありますが、ファイルの使用例も十分ではありません。そのSOAPベースのプログラム(呪われた!!!))をダウンロードする(追加のzendフレームワークも必要)... COMなしではLinuxサーバーではまったく不可能であり、唯一のアイデアはPHP解析できる別の使用可能なファイルのドキュメントファイルを変更するには...

2
jahajee

Office 2007 .docxはXML標準であるため可能です。 Word 2003では、MSが現在公開している標準であっても、COMの読み取りが必要になる可能性が最も高くなります。私はまだそれらに一致するように書かれた多くのライブラリを見ていません。

1
acrosman

PHPを使用してWordファイルを操作する方法の1つは、PHPDocXを使用することです。PHPDocXを使用すると、 オンラインチュートリアル を参照して動作を確認できます。コンテンツを挿入または抽出したり、複数のWordファイルを1つのファイルにマージすることもできます。

1
Eduardo

何に使用するのかわかりませんが、検索インデックス作成のための.docサポートが必要でした。私がやったのは、「catdoc」と呼ばれる小さなコマンドラインツールを使用することでした。これにより、Wordドキュメントの内容がプレーンテキストに転送され、インデックスを作成できるようになります。書式設定などを保持する必要がある場合、これはあなたのツールではありません。

1
fijter

phpLiveDocxはZend Frameworkコンポーネントであり、DOCおよびDOCXファイルをPHP Linux、Windows、およびMac。

次のプロジェクトWebサイトを参照してください。

http://www.phplivedocx.org

1
Leo Bonnafe

PHPサーバー。それをリンクするのは簡単です。必要なのは、ASP.NETページを作成することです。このページでは、投稿を介してドキュメントファイルを受信し、HTTPを介して返信するので、簡単なCURLで実行できます。

0
Omer

.rtf形式は目的に合っていますか? .rtfは.doc形式との間で簡単に変換できますが、プレーンテキスト(制御コマンドが埋め込まれている)で記述されています。これが、アプリケーションをWord文書と統合する方法です。

0
Josh Smeaton

私も同じ種類のプロジェクト[Onlinwワープロ]に取り組んでいます!しかし、私はc#.netとASP.netを選択しました。しかし、調査を通して私はしました。私はそれを知った

Open XML SDKとVSTOを使用する[Visual Studio Tools For Office]

wordファイルで簡単に作業してそれらを操作し、.odt、.pdf、.docxなどのいくつかの形式に内部的に変換することもできます。

つまり、msdn.Microsoft.comに移動し、オフィス開発タブについて十分に注意してください。実装する必要があるすべての機能が既に.netで利用可能であるため、これを行う最も簡単な方法です。

ただし、PHPでurプロジェクトを行いたい場合、Visual Studioおよび.netでPHPも.net準拠言語の1つであることができます!!

0
Noddy Cha

取得元

次のクラスを直接使用してWord文書を読む

class DocxConversion{
    private $filename;

    public function __construct($filePath) {
        $this->filename = $filePath;
    }

    private function read_doc() {
        $fileHandle = fopen($this->filename, "r");
        $line = @fread($fileHandle, filesize($this->filename));   
        $lines = explode(chr(0x0D),$line);
        $outtext = "";
        foreach($lines as $thisline)
          {
            $pos = strpos($thisline, chr(0x00));
            if (($pos !== FALSE)||(strlen($thisline)==0))
              {
              } else {
                $outtext .= $thisline." ";
              }
          }
         $outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",$outtext);
        return $outtext;
    }

    private function read_docx(){

        $striped_content = '';
        $content = '';

        $Zip = Zip_open($this->filename);

        if (!$Zip || is_numeric($Zip)) return false;

        while ($Zip_entry = Zip_read($Zip)) {

            if (Zip_entry_open($Zip, $Zip_entry) == FALSE) continue;

            if (Zip_entry_name($Zip_entry) != "Word/document.xml") continue;

            $content .= Zip_entry_read($Zip_entry, Zip_entry_filesize($Zip_entry));

            Zip_entry_close($Zip_entry);
        }// end while

        Zip_close($Zip);

        $content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
        $content = str_replace('</w:r></w:p>', "\r\n", $content);
        $striped_content = strip_tags($content);

        return $striped_content;
    }

 /************************Excel sheet************************************/

function xlsx_to_text($input_file){
    $xml_filename = "xl/sharedStrings.xml"; //content file name
    $Zip_handle = new ZipArchive;
    $output_text = "";
    if(true === $Zip_handle->open($input_file)){
        if(($xml_index = $Zip_handle->locateName($xml_filename)) !== false){
            $xml_datas = $Zip_handle->getFromIndex($xml_index);
            $xml_handle = DOMDocument::loadXML($xml_datas, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
            $output_text = strip_tags($xml_handle->saveXML());
        }else{
            $output_text .="";
        }
        $Zip_handle->close();
    }else{
    $output_text .="";
    }
    return $output_text;
}

/*************************power point files*****************************/
function pptx_to_text($input_file){
    $Zip_handle = new ZipArchive;
    $output_text = "";
    if(true === $Zip_handle->open($input_file)){
        $slide_number = 1; //loop through slide files
        while(($xml_index = $Zip_handle->locateName("ppt/slides/slide".$slide_number.".xml")) !== false){
            $xml_datas = $Zip_handle->getFromIndex($xml_index);
            $xml_handle = DOMDocument::loadXML($xml_datas, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
            $output_text .= strip_tags($xml_handle->saveXML());
            $slide_number++;
        }
        if($slide_number == 1){
            $output_text .="";
        }
        $Zip_handle->close();
    }else{
    $output_text .="";
    }
    return $output_text;
}


    public function convertToText() {

        if(isset($this->filename) && !file_exists($this->filename)) {
            return "File Not exists";
        }

        $fileArray = pathinfo($this->filename);
        $file_ext  = $fileArray['extension'];
        if($file_ext == "doc" || $file_ext == "docx" || $file_ext == "xlsx" || $file_ext == "pptx")
        {
            if($file_ext == "doc") {
                return $this->read_doc();
            } elseif($file_ext == "docx") {
                return $this->read_docx();
            } elseif($file_ext == "xlsx") {
                return $this->xlsx_to_text();
            }elseif($file_ext == "pptx") {
                return $this->pptx_to_text();
            }
        } else {
            return "Invalid File Type";
        }
    }

}

$docObj = new DocxConversion("test.docx"); //replace your document name with correct extension doc or docx 
echo $docText= $docObj->convertToText();
0
Mohamed Faalil