generar - Crear documento de Word usando PHP en Linux
php create word (10)
¿Cuáles son las soluciones disponibles para PHP
para crear documentos de Word en entorno linux
?
documentos reales de Word
Si necesita producir documentos Word "reales", necesita un servidor web basado en Windows y automatización COM. Recomiendo encarecidamente el artículo de Joel sobre este tema.
falsos encabezados HTTP para engañar a Word para que abra HTML sin formato
Una alternativa bastante común (pero no confiable) es:
header("Content-type: application/vnd.ms-word");
header("Content-Disposition: attachment; filename=document_name.doc");
echo "<html>";
echo "<meta http-equiv=/"Content-Type/" content=/"text/html; charset=Windows-1252/">";
echo "<body>";
echo "<b>Fake word document</b>";
echo "</body>";
echo "</html>"
Asegúrate de no utilizar hojas de estilo externas. Todo debería estar en el mismo archivo.
Tenga en cuenta que esto no envía un documento de Word real. Simplemente engaña a los navegadores para que lo ofrezcan como descarga y por defecto a una extensión de archivo .doc
. Las versiones anteriores de Word a menudo pueden abrir esto sin ningún mensaje de advertencia / seguridad, e importar el código HTML sin formato a Word. El envío de PHP que envía el encabezado engañoso de Content-Type
no constituye una conversión de formato de archivo real.
Con mucho, la forma más fácil de crear archivos DOC en Linux, utilizando PHP, es con el componente de Zend Framework phpLiveDocx .
Desde el sitio web del proyecto:
"phpLiveDocx permite a los desarrolladores generar documentos combinando datos estructurados de PHP con una plantilla creada en un procesador de texto. El documento resultante se puede guardar como un archivo PDF, DOCX, DOC o RTF. El concepto es el mismo que con la combinación de correspondencia "
Eche un vistazo a los documentos COM PHP (Los comentarios son útiles) http://us3.php.net/com
El proyecto Apache tiene una biblioteca llamada POI que se puede usar para generar archivos de MS Office. Es una biblioteca de Java, pero la ventaja es que puede ejecutarse en Linux sin problemas. Esta biblioteca tiene sus limitaciones, pero puede hacer el trabajo por usted, y probablemente sea más simple de usar que tratar de ejecutar Word.
Otra opción sería OpenOffice pero no puedo recomendarlo exactamente ya que nunca lo he usado.
Hay 2 opciones para crear documentos de Word de calidad. Use COM para comunicarse con word (esto requiere al menos un servidor de Windows php). Use openoffice y su API para crear y guardar documentos en formato word.
Plantillas de OpenOffice + interfaz de línea de comandos OOo.
- Cree manualmente una plantilla ODT con marcadores de posición, como [% value-to-replace%]
- Al crear una instancia de la plantilla con datos reales en PHP, descomprima el ODT de la plantilla (es un archivo XML comprimido) y ejecute contra el XML el reemplazo textual de los marcadores de posición con los valores reales.
- Zip el ODT de nuevo
- Ejecute la conversión ODT -> DOC a través de la interfaz de línea de comandos de OpenOffice.
Hay herramientas y bibliotecas disponibles para facilitar cada uno de esos pasos.
Puede ser que ayude
Siguiendo la respuesta de Ivan Krechetov, aquí hay una función que combina correspondencia (en realidad solo texto simple) para docx y odt, sin la necesidad de una biblioteca adicional.
function mailMerge($templateFile, $newFile, $row)
{
if (!copy($templateFile, $newFile)) // make a duplicate so we dont overwrite the template
return false; // could not duplicate template
$zip = new ZipArchive();
if ($zip->open($newFile, ZIPARCHIVE::CHECKCONS) !== TRUE)
return false; // probably not a docx file
$file = substr($templateFile, -4) == ''.odt'' ? ''content.xml'' : ''word/document.xml'';
$data = $zip->getFromName($file);
foreach ($row as $key => $value)
$data = str_replace($key, $value, $data);
$zip->deleteName($file);
$zip->addFromString($file, $data);
$zip->close();
return true;
}
Esto reemplazará [Nombre de la persona] con Mina y [Apellido de la persona] con Mooo:
$replacements = array(''[Person Name]'' => ''Mina'', ''[Person Last Name]'' => ''Mooo'');
$newFile = tempnam_sfx(sys_get_temp_dir(), ''.dat'');
$templateName = ''personinfo.docx'';
if (mailMerge($templateName, $newFile, $replacements))
{
header(''Content-type: application/msword'');
header(''Content-Disposition: attachment; filename='' . $templateName);
header(''Accept-Ranges: bytes'');
header(''Content-Length: ''. filesize($file));
readfile($newFile);
unlink($newFile);
}
Tenga en cuenta que esta función puede dañar el documento si la cadena que se va a reemplazar es demasiado general. Intente usar cadenas de reemplazo detallado como [Nombre de persona].
PHPWord puede generar documentos de Word en formato docx. También puede usar un archivo .docx existente como plantilla: las variables de plantilla se pueden agregar al documento en el formato $ {varname}
Tiene una licencia LGPL y los ejemplos que vinieron con el código funcionaron muy bien para mí.
OpenTBS puede crear documentos dinámicos DOCX en PHP utilizando la técnica de plantillas.
No se necesitan archivos temporales, no hay líneas de comando, todo en PHP.
Puede agregar o eliminar imágenes. El documento creado se puede producir como una descarga HTML, un archivo guardado en el servidor o como contenido binario en PHP.
También puede fusionar archivos de OpenDocument (ODT, ODS, ODF, ...)
<?php
function fWriteFile($sFileName,$sFileContent="No Data",$ROOT)
{
$word = new COM("word.application") or die("Unable to instantiate Word");
//bring it to front
$word->Visible = 1;
//open an empty document
$word->Documents->Add();
//do some weird stuff
$word->Selection->TypeText($sFileContent);
$word->Documents[1]->SaveAs($ROOT."/".$sFileName.".doc");
//closing word
$word->Quit();
//free the object
$word = null;
return $sFileName;
}
?>
<?php
$PATH_ROOT=dirname(__FILE__);
$Return ="<table>";
$Return .="<tr><td>Row[0]</td></tr>";
$Return .="<tr><td>Row[1]</td></tr>";
$sReturn .="</table>";
fWriteFile("test",$Return,$PATH_ROOT);
?>