32

COM オブジェクトを使用せずに PHP で Word (2003 および 2007) ファイルを読み書きすることは可能ですか? 私はできることを知っています:

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

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

4

16 に答える 16

29

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

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

もう 1 つのオプション (Word 2007 のみのオプション (Word 2003 に OpenXML ファイル形式がインストールされていない場合)) は、OpenXMLに再ソートすることです。ここでdatabyssが指摘しように、DOCX ファイル形式は、XML ファイルを含む単なる ZIP アーカイブです。MSDNには OpenXML ファイル形式に関するリソースがたくさんあるので、必要なデータを読み取る方法を理解できるはずです。書くことはもっと複雑になると思います-それはあなたがどれだけの時間を投資するかにかかっています.

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

于 2008-11-05T13:04:35.333 に答える
18

これはvs < office 2007とその純粋なPHPで動作し、COMのがらくたはなく、まだ2007を計算しようとしています

<?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;


?>
于 2008-11-05T12:35:22.663 に答える
8

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

$document_file = 'c:\file.doc';
$text_from_doc = shell_exec('/usr/local/bin/antiword '.$document_file);
于 2009-05-23T00:57:12.330 に答える
6

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

于 2008-10-10T00:23:47.277 に答える
6

コードを更新するだけ

<?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;


?>
于 2011-04-04T02:43:44.457 に答える
5

おそらく、COM なしでは Word 文書を読むことはできません。

このトピックでは書き込みについて説明しました

于 2008-10-10T02:17:08.297 に答える
3

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

.docx 形式は、書式設定やその他のもののために他のファイルを含むいくつかのフォルダーを含む zip ファイルです。

.docx ファイルの名前を .zip に変更すると、私の言いたいことがわかるでしょう。

したがって、PHP の zip ファイル内で作業できる場合は、正しい道を進んでいるはずです。

于 2008-10-10T15:24:10.413 に答える
2

www.phplivedocx.org は SOAP ベースのサービスです。これは、ファイルをテストするために常にオンラインである必要があることを意味し、その使用例も十分ではありません。不思議なことに、ダウンロードしてから 2 日間 (追加の zend フレームワークも必要です)、それが SOAP ベースのプログラムであることがわかりました (呪われました!!!)... COM なしでは、Linux サーバーでは不可能だと思います。唯一のアイデアは、 PHPが解析できる別の使用可能なファイルでdocファイルを変更します...

于 2009-09-13T17:45:58.103 に答える
1

phpLiveDocxはZendFrameworkコンポーネントであり、Linux、Windows、およびMac上のPHPでDOCおよびDOCXファイルを読み書きできます。

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

http://www.phplivedocx.org

于 2009-05-14T07:03:23.423 に答える
1

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

于 2008-10-10T02:45:48.160 に答える
1

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

于 2008-10-10T15:25:06.043 に答える
1

PHP で Word ファイルを操作する興味深い方法の 1 つは、PHPDocX を使用することです。オンライン チュートリアルを見れば、その仕組みがわかります。コンテンツを挿入または抽出したり、複数の Word ファイルを 1 つのファイルに結合したりすることもできます。

于 2012-09-28T16:44:16.420 に答える
0

私は、PHPサーバー用に、無料ドメインを備えた安価な50メガウィンドウベースのホスティングを使用してファイルを変換するのと同じケースを持っています。そして、それらをリンクするのは簡単です。必要なのは、郵便でdocファイルを受け取り、HTTP経由で返信するASP.NETページを作成することだけです。これにより、単純なCURLで処理できます。

于 2010-10-11T19:12:09.240 に答える
0

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

于 2009-01-24T05:09:28.680 に答える
0

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

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

Wordファイルを簡単に操作して操作したり、.odt、.pdf、.docxなどのさまざまな形式に内部的に変換したりすることもできます.

そのため、msdn.microsoft.com にアクセスして、Office 開発タブについて徹底的に調べてください。実装する必要があるすべての関数は既に .net で利用できるため、これを行う最も簡単な方法です!!

しかし、PHP でプロジェクトを実行したい場合は、PHP も .net 準拠言語の 1 つであるため、Visual Studio と .net で実行できます。

于 2010-09-05T14:17:51.237 に答える