2008-10-09 5 views
30

Ist es möglich, Word (2003 und 2007) -Dateien in PHP zu lesen und zu schreiben, ohne ein COM-Objekt zu verwenden? Ich weiß, dass ich kann:Lesen/Schreiben einer MS Word-Datei in PHP

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

aber Word wird es als HTML-Datei nicht eine native .doc-Datei lesen.

+0

Ich finde es sehr unwahrscheinlich, dass Sie dies ohne COM erreichen könnten. –

Antwort

27

Lesen binären Word-Dokumente in Abbildung würde einen Parser zu schaffen für die gemäß den veröffentlichten Dateiformatspezifikationen DOC-Format Ich denke, das ist keine wirklich machbare Lösung.

Sie könnten die Microsoft Office XML formats zum Lesen und Schreiben von Word-Dateien verwenden - das ist kompatibel mit den 2003 und 2007 Word-Version. Zum Lesen müssen Sie sicherstellen, dass die Word-Dokumente im richtigen Format gespeichert sind (Word 2003 XML-Dokument in Word 2007). Zum Schreiben müssen Sie nur dem frei verfügbaren XML-Schema folgen. Ich habe dieses Format noch nie zum Schreiben von Office-Dokumenten aus PHP verwendet, aber ich benutze es zum Einlesen in ein Excel-Arbeitsblatt (natürlich als XML-Spreadsheet 2003 gespeichert) und zum Anzeigen seiner Daten auf einer Webseite. Da es sich bei den Dateien einfach um XML-Daten handelt, ist es kein Problem, sich darin zu bewegen und herauszufinden, wie Sie die benötigten Daten extrahieren können.

Die andere Option - eine Word 2007 nur -Option (wenn die OpenXML-Dateiformate nicht in Word 2003 installiert sind) - wäre, zu OpenXML zu referenzieren. Als databyss hingewiesen here das DOCX-Dateiformat ist nur ein ZIP-Archiv mit XML-Dateien enthalten. Es gibt eine Menge von Ressourcen auf MSDN in Bezug auf das OpenXML-Dateiformat, so sollten Sie in der Lage sein, herauszufinden, wie Sie die gewünschten Daten lesen. Schreiben wird viel komplizierter, denke ich - es hängt nur davon ab, wie viel Zeit Sie investieren werden.

Vielleicht können Sie einen Blick auf PHPExcel werfen, die eine Bibliothek ist, die in Excel 2007-Dateien schreiben und aus Excel 2007-Dateien mit dem OpenXML-Standard lesen kann. Sie können sich ein Bild von der Arbeit machen, wenn Sie versuchen, OpenXML Word-Dokumente zu lesen und zu schreiben.

+1

Es scheint, dass die PPL bei PHPExcel [PHPWord] (http://phpword.codeplex.com/) erstellt haben, um Word-Dokumente zu erstellen. – Basic

5

Ich weiß nicht über das Lesen von nativen Word-Dokumenten in PHP, aber wenn Sie ein Word-Dokument in PHP schreiben möchten, WordprocessingML (aka WordML) könnte eine gute Lösung sein. Alles, was Sie tun müssen, ist ein XML-Dokument im richtigen Format zu erstellen. Ich glaube, Word 2003 und 2007 unterstützen beide WordML.

4

Höchstwahrscheinlich können Sie Word-Dokumente nicht ohne COM lesen.

Schreiben wurden in diesem topic

0

Office 2007 .docx sollte möglich sein, da es ein XML-Standard abgedeckt. Word 2003 erfordert höchstwahrscheinlich COM zu lesen, sogar mit den Standards, die jetzt von MS veröffentlicht werden, da diese Standards riesig sind. Ich habe noch nicht viele Bibliotheken gesehen, die so geschrieben sind, dass sie zu ihnen passen.

1

2007 könnte auch ein bisschen kompliziert sein.

Das DOCX-Format ist eine Zip-Datei, die einige Ordner mit anderen Dateien zum Formatieren und andere Dinge enthält.

Benennen Sie eine .docx-Datei in .zip um und Sie werden sehen, was ich meine.

Also, wenn Sie innerhalb von Zip-Dateien in PHP arbeiten können, sollten Sie auf dem richtigen Weg sein.

+0

+1, für die Antwort. –

0

Ich weiß nicht, wofür Sie es verwenden werden, aber ich brauchte .doc-Unterstützung für die Suchindizierung; Was ich getan habe, war ein kleines Kommandozeilenwerkzeug namens "catdoc"; Dadurch wird der Inhalt des Word-Dokuments in einfachen Text übertragen, sodass es indiziert werden kann. Wenn Sie die Formatierung und das Zeug halten müssen, ist das nicht Ihr Werkzeug.

17

dies mit vs < office 2007 und seiner reinen PHP arbeitet versucht, ohne COM Mist, noch 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\[email protected]\/\_\(\)]/","",$outtext); 
    return $outtext; 
} 

$userDoc = "cv.doc"; 

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


?> 
+1

Verwenden Sie dies nicht, wenn Umlaute erhalten bleiben soll. –

+0

Ich finde einige Sonderzeichen, die in dieser Funktion nicht geparst werden können. –

0

Würde das .rtf-Format für Ihre Zwecke funktionieren? .rtf kann einfach in und aus dem .doc-Format konvertiert werden, aber es wird im Klartext geschrieben (mit eingebetteten Steuerbefehlen). So plane ich meine Anwendung in Word-Dokumente zu integrieren.

+0

Die Umstände sind irrelivent die Frage war Wetter oder nicht, es war möglich, aber danke. – UnkwnTech

1

phpLiveDocx ist eine Zend Framework Komponente und kann DOC und DOCX Dateien in PHP auf Linux, Windows und Mac lesen und schreiben.

finden Sie in der Projekt-Website unter:

http://www.phplivedocx.org

+0

Reference Link ist tot –

8

Sie Antiword verwenden können, ist es eine kostenlose MS Word-Reader für Linux und beliebtesten Betriebssystem ist.

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

Das Problem mit dieser Art von Lösung ist, dass es davon ausgeht, dass man Software auf dem Server installieren kann. – UnkwnTech

+2

Bisschen lange, aber korrigieren Sie mich, wenn ich falsch liege. 'C: \ file.doc' ist ein Windows-Verzeichnis und'/usr/local/bin' ist ein Linux/Unix-Verzeichnis? –

+0

@UnkwnTech: Solange das Programm keine erhöhte Berechtigung erfordert, können die meisten Programme in jedem Verzeichnis installiert werden, zu dem Sie schreiben dürfen. Sie können dann den vollständigen Pfad verwenden, um auf das Programm zu verweisen, oder das Installationsverzeichnis zu Ihrer PATH-Variablen hinzufügen. –

2

www.phplivedocx.org ist ein SOAP-basierter Dienst, der bedeutet, dass Sie immer für die Prüfung der Dateien im Internet sein müssen auch genügend Beispiele für seine Verwendung nicht verfügt. Seltsamerweise fand ich erst nach 2 Tagen Download (benötigt zusätzlich auch Framework) dass es ein SOAP-basiertes Programm ist (verflucht mich !!!) ... ich denke ohne COM ist es auf einem Linux-Server einfach nicht möglich und die einzige Idee ist es Ändern Sie die doc-Datei in eine andere verwendbare Datei, die PHP analysieren kann ...

0

sogar ich arbeite an der gleichen Art von Projekt [An Onlinw Word Processor]! Aber ich habe C# .net und ASP.net gewählt. Aber durch die Umfrage habe ich getan; Ich habe zu wissen, dass

Durch die Verwendung von Open XML SDK und VSTO [Visual Studio Tools für Office]

wir leicht mit einer Word-Datei arbeiten kann sie manipulieren und sogar intern auf andere in mehrere Formate konvertieren wie ODT, .pdf, .docx etc ..

so, gehe msdn.microsoft.com und über die Büroentwicklung Tab gründlich. Es ist der einfachste Weg, dies zu tun, da alle Funktionen, die wir implementieren müssen, bereits in .net verfügbar sind !!

Aber wie u ur-Projekt in PHP tun will, u es in Visual Studio und .NET als PHP eine die ist auch .net-konform Sprache tun !!

0

Ich habe den gleichen Fall Ich denke, ich werde eine billige 50 Mega Windows-basierten Hosting mit kostenlosen Domain verwenden, um es zu verwenden, um meine Dateien auf PHP-Server zu konvertieren. Und sie zu verbinden ist einfach. Alles, was Sie brauchen, ist eine ASP.NET-Seite, die die doc-Datei per Post erhält und über HTTP so einfach CURL würde es tun.

+1

Scheint, als ob dies der einzige Weg ist, es zu tun. Können Sie mehr Details angeben? Ich meine, soll ich ein Windows-Hosting kaufen und es verwenden, um einen PHP-Code (der die COM-Bibliothek verwendet) auszuführen, um die .doc/x-Datei zu erstellen? – Dewan159

6

einfach den Code zu aktualisieren

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


?> 
+0

Obwohl interessant, konnte dieses den Anfang eines Word97-Dokuments nicht finden und das Dokument ausschneiden. Ich fand es in den Nummern 1536 und 1996, die durch Parsing bestimmt werden sollten, nicht willkürliche Hardcoding. Außerdem wurden die speziellen Zeichen wie intelligente Anführungszeichen, Ellipsen, em-Strich und spezielle einfache Anführungszeichen entfernt, und ich sah viele Et-Zeichen in der gesamten Ausgabe. Also, das ist ein interessanter Anfang, aber es braucht viel Raffinesse. – Volomike

+0

Sie können auch auf dieses Tutorial beziehen, wie Sie spezielle MS Word-Zeichen konvertieren können: http://www.toao.net/48-replacing-smart-quotes-and-em-dashes-in-mysql – Volomike

+0

die Funktion produziert einige seltsame Zeichen: "Œ'ÛJA † ïaaÈ} 7Û" ÒÙÞH¡w "ë" Ìw̤ھ½ ... " –

1

Eine Möglichkeit, Word-Dateien mit PHP zu manipulieren, die Sie interessant ist, mit Hilfe von PHPDocX finden. Sie können sehen, wie es funktioniert, einen Blick auf seine online tutorial. Sie können Inhalte einfügen oder extrahieren oder sogar mehrere Word-Dateien in einem einzigen zusammenführen.