Crear word rtf con php

En algunos de los proyectos que he realizado se ha presentado el caso de exportar información de una base de datos a un documento word, usando una plantilla predeterminada. Se puede realizar mediante la clase PHPDOCX, tiene dos versiones libre y de pago, le versión libre no tiene todas las funcionalidades como para resolver el problema que indico, asi que tuve que exportar los datos en un archivo .rtf dado que desde word se puede abrir, editar este tipo de archivos. Buscando en la web encontre algunos ejemplos, pero yo le di un poco de mi cosecha, la clase se llama ToRtf.
Primero deberan crear una plantilla de nombre plantilla.rtf con el diseño predeterminado.
crear word rtf con php

Luego crean el archivo ToRtf.php y copian el código

<?php
class ToRtf
{
	public $fichero;//-- fichero de origen
	public $fsalida;//-- nombre del nuevo fichero
	public $dirsalida;//-- directorio del nuevo fichero
	public $retorno;//-- fichero (retorna el fichero modo descarga)| nombre (retorna el nombre del fichero)
	public $prefijo;//-- prefijo del nuevo fichero
	public $valores;//-- valores a reemplazar
	public $error;//-- retorna los errores
	function __construct ()
	{//-- CARGAMOS VALORES POR DEFECTO
		$this->fichero ='plantilla.rtf';
		$this->fsalida ='new.rtf';
		$this->dirsalida ='';
		$this->retorno = 'fichero'; 
		$this->prefijo = date('dmYHis');
		$this->valores = array();
		$this->error = '';		
	}
	function leerArchivo()
	{//-- CARGAMOS EL FICHERO EN UNA VARIABLE
		if(is_file($this->fichero)){
			$texto = file($this->fichero);
			$ntexto = sizeof($texto);
			$todo ='';
			for($n=0;$n<$ntexto;$n++)
			{
				$todo = $todo.$texto[$n];
			}
			return $todo;
		}else{
			$this->error = 'Archivo de Origen no existe';
			return false;
		}
	}
	function rtf(){		
		$this->fsalida = $this->prefijo.$this->fsalida;//-- DEFINIMOS EL NOMBRE DEL NUEVO FICHERO
		if($txtplantilla = $this->leerArchivo()){//-- COMPROBAMOS SI SE CARGO BIEN EL FICHERO
			$punt = fopen($this->dirsalida.$this->fsalida,"w");//-- CREAMOS EL NUEVO FICHERO
			if(is_array($this->valores) and count($this->valores)>0){				
				foreach($this->valores as $k=>$v){//-- REEMPLAZAMOS LAS VARIABLES					
					$v = utf8_decode($v);
					$txtplantilla = str_replace($k,$v,$txtplantilla);
				}
			}
			fputs($punt,$txtplantilla);//-- AGREGAMOS EL CONTENIDO AL NUEVO FICHERO
			fclose($punt);//- CERRAMOS LA CONEXION DEL FICHERO
			if($this->retorno=="fichero"){//-- RETORNA EN MODO DE DESCARGA
				header ("Content-Disposition: attachment; filename=".$this->fsalida."\n\n"); 
				header ("Content-Type: application/octet-stream");
				readfile($this->dirsalida.$this->fsalida);
			}elseif($this->retorno=="nombre"){//-- RETORNA EL NOMBRE DEL FICHERO
				return $this->fsalida;
			}
		}
	}
}
?>

Lo ejecutamos

<?php
require('ToRtf.php');
$f = new ToRtf();
$f->fichero = 'plantilla.rtf';
$f->fsalida = 'nuevo.rtf';
$f->dirsalida = '';
$f->retorno = 'fichero';
$f->prefijo = 'pre_';
$f->valores = array(
	'#*DIRECCION*#' => "Av. Los Alamos 150",
	'#*CIUDAD*#' => "Lima",
	'#*NOMBRE*#' => "El Guille",
	'#*NOMBREDESTINO*#' => "A TI",
	'#*FECHA*#' => date('d/m/Y'),
	'#*EMPRESA*#' => "SOLUCIONES S.A.C.",
	'#*PUESTO*#' => "Administrador",
	'#*DIRECCIONDESTINO*#' => "Av. Los Nogales 200",
	'#*CIUDADDESTINO*#' => "Callao",
	);
$f->rtf();
?>

Como verán #*NOMBRE*# funciona como un marcador que se buscara y se reemplazara por el valor que se le asigne, esto es a través de un arreglo que lo pueden crear después de hacer una consulta a la base de datos y devolviendo la información que desean exportar.

Bueno eso es todo por hoy, me voy a dormir, si tienen dudas no dejen de comentar.

Repositorio en GitHub

Pueden visitar el repositorio en GitHub.

Descargarlo directamente DESCARGAR AQUÍ.

Actualizado 12 Setiembre 2016.

(Visited 2.455 times, 1 visits today)
Puedes saltar al final y dejar una respuesta. Hacer ping no está permitido actualmente.
  • Charly

    hola! pregunta: como hago para ejecutar el script? porque lo prueba y no pasa nada. soy nuevo en esto de aplicar clases.

    • admin

      Primero tienes que crear tu plantilla asi como aparce en la imagen y lo guardas como plantilla.rtf, luego creas un archivo y lo llamas ToRtf.php, estos dos archivos deben encontrarse en el mismo directorio del servidor, luego en el archivo ToRtf.php pegas los dos trozos de códigos. Y finalmente lo ejecutas, debe descargarse un nuevo archivo con los datos cambiados.
      Para ejecutar una clase, primero tienes que instanciarla, como esta en la primera linea del segundo código, luego las demas son para actualizar las variables y la última linea genera el archivo, y devuelve el nombre del nuevo archivo.
      Espero haber resuelto tus dudas. Saludos.

      • Charly

        excelente info!
        lo probé y me funciona pero solo me toma el primer marcador… el resto no me salen los datos, que pensas que puede estar pasando? yo tome la información de una base de datos.
        te paso mi código a ver si me podes ayudar.

  • Charly

    no se copio todo… te paso el codigo por aca: http://carloschirinos.com.ar/codigo.txt

    • admin

      Borre el código porque se veia mal, he revisado el código que me enviaste, habia un error, que era al final: $domiclio debe ser $domicilio.
      Pero ademas no se porque cuando modificas en la plantilla el valor #*valor*# y luego prueba no lo reemplaza, pero cuando borras todo #*valor*# y luego vuelves a escribir #*valor*# ahi si funciona.

  • Charly

    tenes razón, ahí me funciono. gracias!
    pero ahora tengo un problema… cuando en un formulario escribo palabras con acento en el word sale símbolos raros… ejemplo: publicación => p?cion
    tenes idea cual seria la solución?

    • admin

      Eso es por el tipo de codificación del texto, prueba antes de hacer el reemplazo al word, usa la función utf8_decode ó utf8_encode , con esto debe verse bien las tildes o eñes.

  • Charly

    es que suspuestamente ese reemplazo ya esta:
    if(is_array($this->valores) and count($this->valores)>0){
    foreach($this->valores as $k=>$v){//– REEMPLAZAMOS LAS VARIABLES
    $v = utf8_decode($v);
    $txtplantilla = str_replace($k,$v,$txtplantilla);
    }
    }

    pero aun asi no pasa naranja. yo sigo buscando y probando…. si se te ocurre algo avisame. gracias!

    • admin

      bueno entonces intenta de 3 modos, con utf8_decode, utf8_encode o sin ninguno de ellos es decir comenta la linea $v = utf8_decode($v);
      Una de ellas debe funcionar.

  • coheta

    hola, excelente trabajo.

    Podrías poner un ejemplo de como sacar los datos de una BD MySQL
    o directamente de un formulario?

    Tengo un formulario hecho en breezingforms pero no consigo enlazar los datos introducidos en los campos del formulario para que aparezcan en este archivo.

    Un saludo.

  • Si queréis más flexibilidad para generar documentos de Word con PHP podéis probar PHPDocX.

  • janette gutierrez

    Hola buenas tardes yo tengo un sistema que genera documentos apartir de un rtf, pero el problema que tengo es que en word no visualizo las tablas que genera, en la vista preliminar que es pdf si aparecen las tablas pero al generar el word no me genera la tabla solo visualiza el contendio de la misma pero lo pone en lineas de texto, como puedo hacer que me permita ver las tablas, de ante mano agradezco mucho tu ayuda.

    • admin

      Hola Janette, para ayudarte tendria que ver algo de código de como se genera el rtf. Saludos.

      • janette gutierrez

        Te comento que lo direcciono a una plantilla y este es parte del codigo ya que genero oficios, memorandum, notas informativas y circulares.
        //$plantilla=”Plantillas/plantillaCircular.rtf”;
        $cont_ = stripslashes($array[“9”]);
        $cont_ = str_replace(”, ”, $cont_);
        $cont_ = str_replace(”, ”, $cont_);
        $cont_ = str_replace(”, ”, $cont_);
        $plantilla =’

        ‘.$array[“0”].”.$array[“1”].’CIRCULAR NÚM. “’.$siglasHeredadas.$array[“2”].’”ASUNTO: ‘.$array[“4”].”.$array[“5”].’

        ‘.$array[“6”].’

        ‘;
        if($Titulo_ != “”)
        {
        $plantilla = $plantilla.’‘.$Titulo_.’ ‘.$array[“7”].’‘;
        }
        else
        {
        $plantilla = $plantilla.’‘.$array[“7”].’‘;
        }
        $plantilla = $plantilla.’
        ‘.$array[“8”].’
        PRESENTES
        ‘.$cont_.’

        ATENTAMENTE

        ‘.$Titulo_rem.’ ‘.$array[“12”].’
        ‘.$array[“11”].’

        ‘.$array[“13”].”.$array[“14”].’

        ‘.$array[“15”].’/’.$array[“16”].’/’.$array[“17”].’.

        ‘;

        $TipoDoc = “La circular “;

        if($borrador == “on”)
        {
        $si_borrador_nompdf = “_Borrador”.$Consecu_borrador;
        }
        else
        {
        $si_borrador_nompdf = “”;
        }

        $dpdf = new HTML2FPDF(); // Instanciamos la Clase
        $dpdf->AddPage(); // Le Entregamos la Variable
        $dpdf->WriteHTML($plantilla); // Mandamos el Fichero
        $fsalida = “../Documentos$Anio/$siglasUA/$DirTipoDoc/$NombreArchivo”.$si_borrador_nompdf.”.pdf”;
        $dpdf->Output($fsalida);
        //echo $fsalida;

        }

        Genera dos archivos en pdf si visualizo la tabla pero en word lo pone como texto sin formato

        Muchas gracias

        • admin

          Hola Janette, he reducido el código para crear tabla con en rtf:
          {\rtf1\ansi\ansicpg1252\deff0\deflang3082{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fswiss\fprq2\fcharset0 Calibri;}{\f2\fnil\fcharset0 Calibri;}}
          \trowd \brdrs \brdrs \brdrs
          \clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx1620\clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx3349\clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx5078\clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx8536\pard COLUMNA 1\cell COLUMNA 2\cell COLUMNA 3\cell COLUMNA 4\cell
          \row
          \trowd \brdrs \brdrs \brdrs
          \clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx1620\clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx3349\clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx5078\clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx8536\pard COLUMNA 1\cell COLUMNA 2\cell COLUMNA 3\cell COLUMNA 4\cell
          \row
          }

          Con este código podrias generar tus tablas, si lo habres con word se ve los bordes de las tablas. Inicio y fin de una fila (\trowd … \row), \brdrs es para el borde.
          Más información de los códigos lo encuentras aquí

          • janette gutierrez

            Muchas gracias por el codigo, estoy checandolo ya que lo inserte y no visulizo nada aun.

          • admin

            te recomiendo que lo pruebes con un script separado y luego ya lo agregas a tu proyecto.

  • Luis

    Buenos Días,

    He probado tu ejemplo, y al ver el documento generado veo el código RTF, pero no el documento RTF en si mismo:

    Notice: Undefined variable: todo in C:\xampp\htdocs\tasa\ToRtf.php on line 29

    • admin

      Hola Luis, si habia un pequeño error que ya ha sido corregida.

  • janette gutierrez

    Te comento que lo direcciono a una plantilla y este es parte del codigo ya que genero oficios, memorandum, notas informativas y circulares.
    //$plantilla=”Plantillas/plantillaCircular.rtf”;
    $cont_ = stripslashes($array[“9″]);
    $cont_ = str_replace(”, ”, $cont_);
    $cont_ = str_replace(”, ”, $cont_);
    $cont_ = str_replace(”, ”, $cont_);
    $plantilla =’

     
    ‘.$array[“0″].”.$array[“1”].’CIRCULAR NÚM. "’.$siglasHeredadas.$array[“2”].’"ASUNTO: ‘.$array[“4″].”.$array[“5”].’

     

    ‘.$array[“6”].’

    ‘;
    if($Titulo_ != “”)
    {
    $plantilla = $plantilla.’‘.$Titulo_.’ ‘.$array[“7”].’‘;
    }
    else
    {
    $plantilla = $plantilla.’‘.$array[“7”].’‘;
    }
    $plantilla = $plantilla.’
    ‘.$array[“8”].’
    PRESENTES
    ‘.$cont_.’

    ATENTAMENTE

    ‘.$Titulo_rem.’ ‘.$array[“12”].’
    ‘.$array[“11”].’

    ‘.$array[“13″].”.$array[“14”].’

    ‘.$array[“15”].’/’.$array[“16”].’/’.$array[“17”].’.

    ‘;

    $TipoDoc = “La circular “;

    if($borrador == “on”)
    {
    $si_borrador_nompdf = “_Borrador”.$Consecu_borrador;
    }
    else
    {
    $si_borrador_nompdf = “”;
    }

    $dpdf = new HTML2FPDF(); // Instanciamos la Clase
    $dpdf->AddPage(); // Le Entregamos la Variable
    $dpdf->WriteHTML($plantilla); // Mandamos el Fichero
    $fsalida = “../Documentos$Anio/$siglasUA/$DirTipoDoc/$NombreArchivo”.$si_borrador_nompdf.”.pdf”;
    $dpdf->Output($fsalida);
    //echo $fsalida;

    }

    Genera dos archivos en pdf si visualizo la tabla pero en word lo pone como texto sin formato

    Muchas gracias

  • janette gutierrez

    /* //– FUNCIONES PARA CREACION DE DOCUMENTO RTF */

    function leef($fichero)
    {
    $texto= file($fichero);
    $tamleef = sizeof($texto);
    for ($n=0; $n’, $contenido);
    $contenido=str_replace(‘<‘,'<', $contenido);
    $contenido=str_replace('µ','µ', $contenido);
    $contenido=str_replace('·','•', $contenido);
    $contenido=str_replace('¶','¶', $contenido);
    $contenido=str_replace('±','±', $contenido);
    $contenido=str_replace('€','€', $contenido);
    $contenido=str_replace('£','£', $contenido);
    $contenido=str_replace('®','®', $contenido);
    $contenido=str_replace('§','§', $contenido);
    $contenido=str_replace('¥','¥', $contenido);
    $contenido=str_replace('á','á', $contenido);
    $contenido=str_replace('Á','Á', $contenido);
    $contenido=str_replace('à','à', $contenido);
    $contenido=str_replace('À','À', $contenido);
    $contenido=str_replace('â','â', $contenido);
    $contenido=str_replace('Â','Â', $contenido);
    $contenido=str_replace('å','å', $contenido);
    $contenido=str_replace('Å','Å', $contenido);
    $contenido=str_replace('ã','ã', $contenido);
    $contenido=str_replace('Ã','Ã', $contenido);
    $contenido=str_replace('ä','ä', $contenido);
    $contenido=str_replace('Ä','Ä', $contenido);
    $contenido=str_replace('æ','æ', $contenido);
    $contenido=str_replace('Æ','Æ', $contenido);
    $contenido=str_replace('ç','ç', $contenido);
    $contenido=str_replace('Ç','Ç', $contenido);
    $contenido=str_replace('é','é', $contenido);
    $contenido=str_replace('É','É', $contenido);
    $contenido=str_replace('è','è', $contenido);
    $contenido=str_replace('È','È', $contenido);
    $contenido=str_replace('ê','ê', $contenido);
    $contenido=str_replace('Ê','Ê', $contenido);
    $contenido=str_replace('ë','ë', $contenido);
    $contenido=str_replace('Ë','Ë', $contenido);
    $contenido=str_replace('í','í', $contenido);
    $contenido=str_replace('Í','Í', $contenido);
    $contenido=str_replace('ì','ì', $contenido);
    $contenido=str_replace('Ì','Ì', $contenido);
    $contenido=str_replace('î','î', $contenido);
    $contenido=str_replace('Î','Î', $contenido);
    $contenido=str_replace('ï','ï', $contenido);
    $contenido=str_replace('Ï','Ï', $contenido);
    $contenido=str_replace('ñ','ñ', $contenido);
    $contenido=str_replace('Ñ','Ñ', $contenido);
    $contenido=str_replace('ó','ó', $contenido);
    $contenido=str_replace('Ó','Ó', $contenido);
    $contenido=str_replace('ò','ò', $contenido);
    $contenido=str_replace('Ò','Ò', $contenido);
    $contenido=str_replace('ô','ô', $contenido);
    $contenido=str_replace('Ô','Ô', $contenido);
    $contenido=str_replace('ø','ø', $contenido);
    $contenido=str_replace('Ø','Ø', $contenido);
    $contenido=str_replace('õ','õ', $contenido);
    $contenido=str_replace('Õ','Õ', $contenido);
    $contenido=str_replace('ö','ö', $contenido);
    $contenido=str_replace('Ö','Ö', $contenido);
    $contenido=str_replace('ß','ß', $contenido);
    $contenido=str_replace('ú','ú', $contenido);
    $contenido=str_replace('Ú','Ú', $contenido);
    $contenido=str_replace('ù','ù', $contenido);
    $contenido=str_replace('Ù','Ù', $contenido);
    $contenido=str_replace('û','û', $contenido);
    $contenido=str_replace('Û','Û', $contenido);
    $contenido=str_replace('ü','ü', $contenido);
    $contenido=str_replace('Ü','Ü', $contenido);
    $contenido=str_replace('ÿ','ÿ', $contenido);
    $contenido=str_replace('°','°', $contenido);

    return $contenido;
    }

    /*

  • Miguel Arce

    espero que les sirva A mi me salia un error a la hora de guardar el documento, abría el documento descargado y me salia un montón de letras y el error con la variable $todo … de inicializacion, lo que hice es mas arriba al empezar la función es esto: $todo=””, en otras palabras iniciarla y me funciono xD

    pequeño aporte pero es para que no estén dando vueltas… 🙂

    • admin

      Hola Miguel el pequeño error ya lo he corregido, gracias por el dato.
      Saludos.

      • Miguel Arce

        xD tengo otro dato 🙂 necesitan hacer una tabla en el rtf que generan, para evitarles la travesía que hice yo xD la solución es crear el codio de la tabla en rtf y alojarlo en una variable, por cierto a esta variable que crean tambien deben inicializarla por seacaso, y luego la pasan a la clase como si fuera otro dato a reemplazar.

        Espero que les sirva, espero haberlos ayudado 🙂

        • admin

          Haber si compartes el código de crear tabla en rtf, ya he separado el código de la tabla en rtf, bueno son las primaeras pruebas:
          {\rtf1\ansi\ansicpg1252\deff0\deflang3082{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fswiss\fprq2\fcharset0 Calibri;}{\f2\fnil\fcharset0 Calibri;}}
          \trowd \brdrs \brdrs \brdrs
          \clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx1620\clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx3349\clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx5078\clcbpat2\clbrdrl\brdrs\clbrdrt\brdrs\clbrdrr\brdrs\clbrdrb\brdrs
          \cellx8536\pard COLUMNA 1\cell COLUMNA 2\cell COLUMNA 3\cell COLUMNA 4\cell
          \row
          }

  • Cristian reyes

    Muchas gracias por la clase me sirvió muchisimo

  • Muchas gracias por compartir!!

  • Alejandro Venezuela

    Gracias por el datos esta muy bueno tu aporte, una pregunta, como haria para que el documento que genera, pueda descargarlo pero que no se guarde en el directorio web

    • admin

      Pues tienes que agregarle esta opción
      $f->retorno = 'fichero';

  • Cristian Cuervo

    Buenos dias.. quisiera saber si hay forma de evitar que se descargue el archivo generado o siempre se descargara ?

    • admin

      Si pones $f->retorno = 'nombre'; retornará solo el nombre del archivo creado.

  • Jonathan Giovanni

    Hola quisiera saber como puedo hacer un SALTO DE PÁGINA el archivo rtf

    • admin

      Abriendo un archivo .rtf con un editor de texto como sublime text y agregando las lineas:

      \par \page
      texto a ingresar

      Pero si deseas algo más avanzado podrías utilizar https://github.com/PHPOffice/PHPWord

  • anibal

    Buen dia. muchisimas gracias por el aporte, muy bueno. pero tu podrias ayudarme a insertar valores en rtf a partir de datos guardados en una base de datos, te lo agradeceria infinitamente

  • anibal

    muchas gracias por el link

  • Hola quisiera que me ayuden como haría para insertar una imagen dentro de este documento

  • Pedro

    Buenas tardes, ante todo gracias por tu tutorial. El problema que me surge es que al ejecutar el script me descarga el archivo y al abrirlo me sale la venta de la codificación y me salen caracteres raros. Un saludo, espero tu contestación y gracias de antemano

    • Guillermo

      Muestra el error o el código que sale.

      • Pedro

        Gracias por contestar! No es un error. Es decir ejecuto el script, se descarga el archivo y al abrir el pre_nuevo.rtf se me abre el word pero me sale la ventana de “Seleccione la codificación con la que se puede leer el documento. Codificación texto: Windows(predeterminado) ms-dos, Otra codificacion….” etc
        No se si con esta explicación sabes de que ventana hablo.

        • Guillermo

          Si envias una captura de pantalla de esa ventana?

  • juan

    Hola, muy excelente su aporte. Mi inquietud es sobre la generacion del archivo: copié exactamente tanto la plantilla rtf como el archivo php, pero cuando ya quiero generar me sale una cantidad de codigos de error que empieza asi:

    Warning: date(): It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone ‘UTC’ for now, but please set date.timezone to select your timezone. in C:\AppServ\www\-FORMATO CONSEC\ToRtf.php on line 18

    Warning: date(): It is not safe to rely on the system’s timezone ………..

    Y siguen y siguen. ¿Acaso me hizo falta agregar algo o quitar algo más?¿Me podrías colaborar?
    De antemano gracias

    • Guillermo

      Ese error es porque no has configurado la zona horaria en el php.ini, agrega al inicio del archivo la función y cambia la ciudad a la que perteneces.
      date_default_timezone_set('America/Los_Angeles');
      Más información
      Otra opción es modificar el php.ini
      date.timezone = "America/Los_Angeles"
      Y reinicia el apache.

      • juan

        Eres un genio jajaja. Muchas Gracias

  • juan

    Ahora surgió otro inconveniente. Cuando quiero descargar el documento me salen 2 copias, pero al enlace que quiero direccionar la descarga me sale con caracteres extraños, mientras que la plantilla correcta se guarda en la carpeta donde estan los archivos php para crear dichos archivos. No se si me hice entender, pero alguien que entienda este problema o haya pasado por lo mismo me puede ayudar por favor.
    Gracias

    • Guillermo

      Tendría que ver el código o el error para poder ayudarte.

  • Patricia

    Hola, gracias por compartir tu informacion. Tengo un pregunta. Sucede que intento modificar online los datos a llenar en la plantilla pero aunque ya diseñe el formulario, cuando se descarga el archivo .docx, al intentar abrirlo, si se han llenado los datos, pero mesale el error de archivo dañado; reitero que si salen los datos llenos, pero tengo q pasar por este odioso mensaje de error.
    Hay alguna posibilidad de que se omita este error?
    gracias

    • Guillermo

      Muestra el error.

  • Salva

    Hola Guillermo:

    He copiado tal cual tienes el codigo en mi servidor “ya que es justo lo que necesito, pero primero lo pruebo y luego lo modifico”. En la carpeta del servidor tengo ToRtf.php, userToRtf.php y plantilla.rtf, tal cual me lo he descargado de Github. Cuando ejecuto userToRtf.php en el navegador, me descarga el documento pre_nuevo.rtf, no me genera ningun error, pero al abrir el documento, este esta en blanco. Los codigos aunque son exactos son:

    ToRtf.php:

    fichero =’plantilla.rtf’;
    $this->fsalida =’new.rtf’;
    $this->dirsalida =”;
    $this->retorno = ‘fichero’;
    $this->prefijo = date(‘dmYHis’);
    $this->valores = array();
    $this->error = ”;
    }
    function leerArchivo()
    {//– CARGAMOS EL FICHERO EN UNA VARIABLE
    if(is_file($this->fichero)){
    $texto = file($this->fichero);
    $ntexto = sizeof($texto);
    $todo =”;
    for($n=0;$nerror = ‘Archivo de Origen no existe’;
    return false;
    }
    }
    function rtf(){
    $this->fsalida = $this->prefijo.$this->fsalida;//– DEFINIMOS EL NOMBRE DEL NUEVO FICHERO
    if($txtplantilla = $this->leerArchivo()){//– COMPROBAMOS SI SE CARGO BIEN EL FICHERO
    $punt = fopen($this->dirsalida.$this->fsalida,”w”);//– CREAMOS EL NUEVO FICHERO
    if(is_array($this->valores) and count($this->valores)>0){
    foreach($this->valores as $k=>$v){//– REEMPLAZAMOS LAS VARIABLES
    $v = utf8_decode($v);
    $txtplantilla = str_replace($k,$v,$txtplantilla);
    }
    }
    fputs($punt,$txtplantilla);//– AGREGAMOS EL CONTENIDO AL NUEVO FICHERO
    fclose($punt);//- CERRAMOS LA CONEXION DEL FICHERO
    if($this->retorno==”fichero”){//– RETORNA EN MODO DE DESCARGA
    header (“Content-Disposition: attachment; filename=”.$this->fsalida.”\n\n”);
    header (“Content-Type: application/octet-stream”);
    readfile($this->dirsalida.$this->fsalida);
    }elseif($this->retorno==”nombre”){//– RETORNA EL NOMBRE DEL FICHERO
    return $this->fsalida;
    }
    }
    }
    }
    ?>

    userToRtf.php:

    fichero = ‘plantilla.rtf’;
    $f->fsalida = ‘nuevo.rtf’;
    $f->dirsalida = ”;
    $f->retorno = ‘fichero’;
    $f->prefijo = ‘pre_’;
    $f->valores = array(
    ‘#*DIRECCION*#’ => “Av. Los Alamos 150”,
    ‘#*CIUDAD*#’ => “Lima”,
    ‘#*NOMBRE*#’ => “El Guille”,
    ‘#*NOMBREDESTINO*#’ => “A TI”,
    ‘#*FECHA*#’ => date(‘d/m/Y’),
    ‘#*EMPRESA*#’ => “SOLUCIONES S.A.C.”,
    ‘#*PUESTO*#’ => “Administrador”,
    ‘#*DIRECCIONDESTINO*#’ => “Av. Los Nogales 200”,
    ‘#*CIUDADDESTINO*#’ => “Callao”,
    );
    $f->rtf();
    ?>

    y en el directorio del servidor solo están esos tres archivos.

    Cual puede ser el problema?

    Muchas gracias por el aporte y sobre todo por tu atencion.

    • Guillermo

      Revisa que las variables esten escrito correctamente en un editor de texto.
      word php rtf revision
      Habilita los errores del php

      ini_set("display_errors", "1");
      ini_set("memory_limit", "-1");
      ini_set('max_execution_time', 0);
      error_reporting(E_ALL);
  • Rene

    Hola alguien podría ayudarme por favor!!

    ¿como agrego una imagen al la plantilla?

    • Guillermo

      Si vas usar imagen creo que lo más fácil es usar PHPRtfLite

  • Salva

    Ok. Muchas gracias guillermo. Hoy habilito los mensaje de error, lo pruebo y te comento.

    Mil gracias por tu ayuda y perdona por contestar tarde.

    Un saludo

  • Salva

    Comprobado. Ese ha sido mi error.

    Mil gracias por tu ayuda, te debo una.

    Un saludo

  • Ferden

    Hola, tengo un problema, no me cambia todos los marcadores, y los tengo exactamente iguales en el código y en la plantilla.rtf:

    $f->valores = array(
    ‘#*lineap*#’ => $r1,
    ‘#*LINEAS*#’ => $r2,
    ‘#*LINEAT*#’ => $r3,
    ‘#*DIRECCION*#’ => $row[“direccion”],
    ‘#*CIUDAD*#’ => “Lima”,
    ‘#*HAS*#’ => $row[“predio”],
    ‘#*NOMBRE*#’ => $row[‘nombrecompleto’],
    ‘#*FECHA*#’ => date(“d/m/Y”),
    ‘#*contrato*#’ => “X1X2X3”,
    ‘#*ENGANCHE*#’ => $enganche,
    ‘#*EIMPOLET*#’ => $LengancheL,
    ‘#*colindancias*#’ => $row[“colindancias”],
    ‘#*IMPORTE*#’ => number_format($row[“prestamo”],2),
    ‘#*IMPORTELETRA*#’ => $numeroL,
    ‘#*MENS*#’ => $numMens,

    );

    En mis pruebas, algunos los saco de una tabla de MySQL, lo cual hace bien, pero por ejemplo, el marcador #*LINEAT*# el cual también tengo en mi plantilla.rtf no lo cambia, lo deja tal cual, y pasa en uno o dos casos…

    Gracias de antemano.

    Ernesto.