2008-10-09 32 views
30

¿Es posible leer y escribir archivos de Word (2003 y 2007) en PHP sin utilizar un objeto COM? Sé que puedo:Lectura/escritura de un archivo de MS Word en PHP

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

pero la Palabra a leer como un archivo HTML no es un archivo .doc nativa.

+0

Me parece MUCHO improbable que pueda lograr esto sin utilizar COM. –

Respuesta

27

lectura de documentos de Word binarios implicaría la creación de un programa de análisis de acuerdo con las especificaciones de formato de archivo para el Formato DOC. Creo que esta no es una solución viable real.

Puede usar el Microsoft Office XML formats para leer y escribir archivos de Word; esto es compatible con las versiones 2003 y 2007 de Word. Para leer, debe asegurarse de que los documentos de Word estén guardados en el formato correcto (se denomina documento XML de Word 2003 en Word 2007). Para escribir, solo tiene que seguir el esquema XML disponible de forma abierta. Nunca he usado este formato para escribir documentos de Office desde PHP, pero lo estoy usando para leer en una hoja de cálculo de Excel (naturalmente guardada como XML-Spreadsheet 2003) y mostrar sus datos en una página web. Como los archivos son simplemente datos XML, no hay problema para navegar dentro y descubrir cómo extraer los datos que necesita.

La otra opción, una opción solo de Word 2007 (si los formatos de archivo OpenXML no están instalados en Word 2003), sería rescatar a OpenXML. Como databyss señaló here el formato de archivo DOCX es solo un archivo ZIP con archivos XML incluidos. Hay muchos recursos en MSDN con respecto al formato de archivo OpenXML, por lo que debería poder descifrar cómo leer los datos que desea. Escribir será mucho más complicado, creo, solo depende de cuánto tiempo va a invertir.

Quizás pueda echar un vistazo a PHPExcel que es una biblioteca capaz de escribir en archivos de Excel 2007 y leer desde archivos de Excel 2007 utilizando el estándar OpenXML. Puede hacerse una idea del trabajo que implica tratar de leer y escribir documentos de OpenXML Word.

+1

Parece que las personas en PHPExcel han creado [PHPWord] (http://phpword.codeplex.com/) para crear documentos de Word. – Basic

5

No sé leer documentos nativos de Word en PHP, pero si desea escribir un documento de Word en PHP, WordprocessingML (aka WordML) podría ser una buena solución. Todo lo que tienes que hacer es crear un documento XML en el formato correcto. Creo que Word 2003 y 2007 son compatibles con WordML.

4

Lo más probable es que no pueda leer documentos de Word sin COM.

La escritura se trate en este topic

0

Office 2007 .docx debería ser posible ya que es un estándar XML. Es muy probable que Word 2003 necesite la lectura de COM, incluso con los estándares publicados por MS, ya que esos estándares son enormes. No he visto muchas bibliotecas escritas para unirlas todavía.

1

2007 puede ser un poco complicado también.

El formato .docx es un archivo zip que contiene algunas carpetas con otros archivos en ellas para formatear y otras cosas.

Cambie el nombre de un archivo .docx a .zip y verá lo que quiero decir.

Así que si puede trabajar dentro de archivos zip en PHP, debe estar en el camino correcto.

+0

+1, para la respuesta. –

0

No sé para qué lo va a usar, pero necesitaba el soporte de .doc para la indexación de búsqueda; Lo que hice fue usar una pequeña herramienta de línea de comando llamada "catdoc"; Esto transfiere el contenido del documento de Word a texto sin formato para que pueda ser indexado. Si necesita seguir formateando y cosas así, esta no es su herramienta.

17

esto funciona con vs < oficina 2007 y su PHP puro, sin basura COM, todavía tratando de averiguar 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

No lo use si desea preservar Umlaute. –

+0

Encuentro algunos caracteres especiales que no se pueden analizar en esta función. –

0

¿El formato .rtf trabajo para sus propósitos? .rtf se puede convertir fácilmente a formato .doc y desde este, pero está escrito en texto plano (con comandos de control incrustados). Así es como planeo integrar mi aplicación con documentos de Word.

+0

La circunstancia es irrelevante, la pregunta era si el clima era posible o no, pero gracias. – UnkwnTech

1

phpLiveDocx es un componente de Zend Framework y puede leer y escribir archivos DOC y DOCX en PHP en Linux, Windows y Mac.

Ver el sitio web del proyecto en:

http://www.phplivedocx.org

+0

El enlace de referencia está muerto –

8

Puede utilizar Antiword, es un lector libre de MS Word para Linux y OS más popular.

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

El problema con este tipo de solución es que se supone que uno puede instalar el software en el servidor. – UnkwnTech

+2

Mucho tiempo, pero corrígeme si estoy equivocado. 'C: \ file.doc' es un directorio de Windows y'/usr/local/bin' es un directorio Linux/Unix? –

+0

@UnkwnTech: siempre que el programa no requiera permisos elevados, la mayoría de los programas se pueden instalar en cualquier directorio en el que tenga permiso para escribir. A continuación, puede utilizar la ruta completa para referirse al programa o agregar el directorio de instalación a su variable PATH. –

2

www.phplivedocx.org es un servicio basado en SOAP que significa que siempre tiene que estar en línea para probar los archivos también no tiene suficientes ejemplos para su uso. Por extraño que sólo he encontrado después de 2 días de la descarga (requiere Zend Framework adicionalmente también) que es un programa de base de jabón (me maldijo !!!) ... Creo que sin COM es simplemente no es posible en un servidor Linux y la única idea es cambiar el archivo doc en otro archivo PHP utilizable, que puede analizar ...

0

aun estoy trabajando en el mismo tipo de proyecto [un procesador Onlinw Palabra]! Pero he elegido C# .net y ASP.net. Pero a través de la encuesta que hice; llegué a saber que

mediante el uso de Open XML SDK y VSTO [Visual Studio Tools para Office]

que puede trabajar fácilmente con un archivo de Word manipularlos e incluso convertir internamente para diferentes en varios formatos como odt, pdf, etc .. .docx

Por lo tanto, ir a msdn.microsoft.com y ser a fondo acerca de la ficha desarrollo de la oficina. ¡Es la forma más fácil de hacerlo ya que todas las funciones que necesitamos implementar ya están disponibles en .net!

Pero como u quieren hacer ur proyecto en PHP, u puede hacerlo en Visual Studio y .NET como PHP es también uno de los .net Idioma Cumple !!

0

Tengo el mismo estuche Supongo que voy a utilizar un alojamiento barato de 50 mega windows basado en dominio libre para usarlo para convertir mis archivos, para servidor PHP. Y vincularlos es fácil. Todo lo que necesita es hacer una página ASP.NET que recieves el archivo doc a través de correos y responde que a través de HTTP CURL tan simple lo haría.

+1

Parece que esta es la única forma de hacerlo después de todo. Puedes darme mas detalles ? Quiero decir, ¿se supone que debo ir a comprar un alojamiento de Windows y usarlo para ejecutar un código PHP (que usa la biblioteca COM) para crear el archivo .doc/x? – Dewan159

6

Sólo la actualización del código

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

Aunque es interesante, no se pudo encontrar el comienzo de un documento de Word97 y se cortó el documento. Descubrí que está en los números 1536 y 1996, que deberían determinarse mediante el análisis sintáctico, no mediante una codificación rígida arbitraria. Además, los caracteres especiales como comillas inteligentes, elipses, em-dash y comillas especiales especiales fueron despojados, y vi muchos signos de unión en toda la salida. Entonces, este es un comienzo interesante, pero necesita un gran refinamiento. – Volomike

+0

También le conviene hacer referencia a este tutorial sobre cómo convertir caracteres especiales de MS Word: http://www.toao.net/48-replacing-smart-quotes-and-em-dashes-in-mysql – Volomike

+0

la función produce algunos Caracteres extraños: "Œ'ÛJA † ïßaÈ} 7Û" ÒÙÞH¡w "ë" ™ Ìw̤ھ½ ... " –

1

Una forma de manipular archivos de Word con PHP que puede resultar interesante es con la ayuda de PHPDocX. Puede ver cómo funciona si echa un vistazo a su online tutorial. Puede insertar o extraer contenidos o incluso combinar varios archivos de Word en uno solo.

Cuestiones relacionadas