Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

berkowitz

gerar um arquivo .doc com PHP

Recommended Posts

Pessoal, olá.Tenho um site que é todo dinâmico (em php). Agora preciso criar um esquema pra gerar uma versão WORD desse site. Alguém faz idéia de como faz isso pra poder me ajudar por favor?Encontrei um CLASS na net, mas ele só gera 1 página por vez e só gera DOC a partir de uma página HTML. Quando a página é PHP não da certo......Valew!!!!!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O CLASS que eu tenho é o seguinte:

 

<?php	/**	 * Convert HTML to MS Word file	 * @author Harish Chauhan	 * @version 1.0.0	 * @name HTML_TO_DOC	 */		class HTML_TO_DOC	{		var $docFile="";		var $title="";		var $htmlHead="";		var $htmlBody="";						/**		 * Constructor		 *		 * @return void		 */		function HTML_TO_DOC()		{			$this->title="Untitled Document";			$this->htmlHead="";			$this->htmlBody="";		}				/**		 * Set the document file name		 *		 * @param String $docfile 		 */				function setDocFileName($docfile)		{			$this->docFile=$docfile;			if(!preg_match("/\.doc$/i",$this->docFile))				$this->docFile.=".doc";			return;				}				function setTitle($title)		{			$this->title=$title;		}				/**		 * Return header of MS Doc		 *		 * @return String		 */		function getHeader()		{			$return  = <<<EOH			 <html xmlns:v="urn:schemas-microsoft-com:vml"			xmlns:o="urn:schemas-microsoft-com:office:office"			xmlns:w="urn:schemas-microsoft-com:office:word"			xmlns="http://www.w3.org/TR/REC-html40">						<head>			<meta http-equiv=Content-Type content="text/html; charset=utf-8">			<meta name=ProgId content=Word.Document>			<meta name=Generator content="Microsoft Word 9">			<meta name=Originator content="Microsoft Word 9">			<!--[if !mso]>			<style>			v\:* {behavior:url(#default#VML);}			o\:* {behavior:url(#default#VML);}			w\:* {behavior:url(#default#VML);}			.shape {behavior:url(#default#VML);}			</style>			<![endif]-->			<title>$this->title</title>			<!--[if gte mso 9]><xml>			 <w:WordDocument>			  <w:View>Print</w:View>			  <w:DoNotHyphenateCaps/>			  <w:PunctuationKerning/>			  <w:DrawingGridHorizontalSpacing>9.35 pt</w:DrawingGridHorizontalSpacing>			  <w:DrawingGridVerticalSpacing>9.35 pt</w:DrawingGridVerticalSpacing>			 </w:WordDocument>			</xml><![endif]-->			<style>			<!--			 /* Font Definitions */			@font-face				{font-family:Verdana;				panose-1:2 11 6 4 3 5 4 4 2 4;				mso-font-charset:0;				mso-generic-font-family:swiss;				mso-font-pitch:variable;				mso-font-signature:536871559 0 0 0 415 0;}			 /* Style Definitions */			p.MsoNormal, li.MsoNormal, div.MsoNormal				{mso-style-parent:"";				margin:0in;				margin-bottom:.0001pt;				mso-pagination:widow-orphan;				font-size:7.5pt;					mso-bidi-font-size:8.0pt;				font-family:"Verdana";				mso-fareast-font-family:"Verdana";}			p.small				{mso-style-parent:"";				margin:0in;				margin-bottom:.0001pt;				mso-pagination:widow-orphan;				font-size:1.0pt;					mso-bidi-font-size:1.0pt;				font-family:"Verdana";				mso-fareast-font-family:"Verdana";}			@page Section1				{size:8.5in 11.0in;				margin:1.0in 1.25in 1.0in 1.25in;				mso-header-margin:.5in;				mso-footer-margin:.5in;				mso-paper-source:0;}			div.Section1				{page:Section1;}			-->			</style>			<!--[if gte mso 9]><xml>			 <o:shapedefaults v:ext="edit" spidmax="1032">			  <o:colormenu v:ext="edit" strokecolor="none"/>			 </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml>			 <o:shapelayout v:ext="edit">			  <o:idmap v:ext="edit" data="1"/>			 </o:shapelayout></xml><![endif]-->			 $this->htmlHead			</head>			<body>EOH;		return $return;		}				/**		 * Return Document footer		 *		 * @return String		 */		function getFotter()		{			return "</body></html>";		}				/**		 * Create The MS Word Document from given HTML		 *		 * @param String $html :: URL Name like http://www.example.com		 * @param String $file :: Document File Name		 * @param Boolean $download :: Wheather to download the file or save the file		 * @return boolean 		 */				function createDocFromURL($url,$file,$download=false)		{			if(!preg_match("/^http:/",$url))				$url="http://".$url;			$html=@file_get_contents($url);			return $this->createDoc($html,$file,$download);			}		/**		 * Create The MS Word Document from given HTML		 *		 * @param String $html :: HTML Content or HTML File Name like path/to/html/file.html		 * @param String $file :: Document File Name		 * @param Boolean $download :: Wheather to download the file or save the file		 * @return boolean 		 */				function createDoc($html,$file,$download=false)		{			if(is_file($html))				$html=@file_get_contents($html);						$this->_parseHtml($html);			$this->setDocFileName($file);			$doc=$this->getHeader();			$doc.=$this->htmlBody;			$doc.=$this->getFotter();										if($download)			{				@header("Cache-Control: ");// leave blank to avoid IE errors				@header("Pragma: ");// leave blank to avoid IE errors				@header("Content-type: application/octet-stream");				@header("Content-Disposition: attachment; filename=\"$this->docFile\"");				echo $doc;				return true;			}			else 			{				return $this->write_file($this->docFile,$doc);			}		}				/**		 * Parse the html and remove <head></head> part if present into html		 *		 * @param String $html		 * @return void		 * @access Private		 */				function _parseHtml($html)		{			$html=preg_replace("/<!DOCTYPE((.|\n)*?)>/ims","",$html);			$html=preg_replace("/<script((.|\n)*?)>((.|\n)*?)<\/script>/ims","",$html);			preg_match("/<head>((.|\n)*?)<\/head>/ims",$html,$matches);			$head=$matches[1];			preg_match("/<title>((.|\n)*?)<\/title>/ims",$head,$matches);			$this->title = $matches[1];			$html=preg_replace("/<head>((.|\n)*?)<\/head>/ims","",$html);			$head=preg_replace("/<title>((.|\n)*?)<\/title>/ims","",$head);			$head=preg_replace("/<\/?head>/ims","",$head);			$html=preg_replace("/<\/?body((.|\n)*?)>/ims","",$html);			$this->htmlHead=$head;			$this->htmlBody=$html;			return;		}				/**		 * Write the content int file		 *		 * @param String $file :: File name to be save		 * @param String $content :: Content to be write		 * @param [Optional] String $mode :: Write Mode		 * @return void		 * @access boolean True on success else false		 */				function write_file($file,$content,$mode="w")		{			$fp=@fopen($file,$mode);			if(!is_resource($fp))				return false;			fwrite($fp,$content);			fclose($fp);			return true;		}	}?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você precisa fazer uma mala direta ou algum tipo de documento no qual você só precisa substituir variáveis, existe um jeito um pouco mais simples.1. Crie um documento no Word;2. Coloque algumas variáveis, tipo <<NOME>> <<ENDEREÇO>>, etc..;3. Salve como RTF (o formato RTF é um texto formatado mas em plain text);4. Abra o RTF e substitua as variáveis usando o PHP (fopen e strtr);5. Salve o arquivo;6. Dê 3 pulinhos com o dedo indicador no topo da cabeça;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi galera, graças a 6ª regra! huaahuHUAHUAUHAA....Agora uma coisa importante:O site inteiro vai virar um documento do Word, mas não para mala direta. Esse documento vai ficar no link EDIÇÕES ANTERIORES, para download. Com esse exemplo que vocês me indicaram ele transforma o site inteiro?Valew galera! E viva a 6ª regra! uhaAUHahuuha...Pessoal, só mais uma coisa:O site não tem nenhum dado que venha de algum banco, nem variáveis para o conteúdo. O conteúdo está na própria página. Esse é o problema, entenderam? Aí que to rachando o coco!Valew!

Compartilhar este post


Link para o post
Compartilhar em outros sites

estou com um pouco de sono, acabei de voltar da facul, pode ser que isso tenha atrapalhado meu entedimento da sua ultima dúvida.

 

mas, para contribuir, tente fazer assim:

header( "Content-type: application/msword" );header( "Content-Disposition: inline, filename=$file");$file="teste.rtf";print file_get_contents($file);

não sei se é esse o resultado que você deseja obter ... qq é só postar ...

 

fuiiiiiiiiiiiiii!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A geração de arquivos rtf está funcionando muito bem.Minha dúvida é em relação aos parágrafos.Como adicionar espaços entre parágrafos no arquivo do word exatamente como o usuário digitou ??? Se fosse um arquivo html bastaria usar a função nl2br. Mas nesse caso não sei como proceder porque trata-se de um arquivo do Word em formato rtf.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Substitua \n por \parNo RTF \par indica uma nova linha.Acho q você não seguiu todos os passos. Atente à 6ª regra!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Afinal, é possível inserir quebras de linha em arquivos rtf e doc ????

 

Como citei antes, a função nl2br não funciona nesse caso.

 

Tentei desta forma:

$texto = wordwrap($texto, 20, "\par");

e também não funcionou.

 

Alguém tem alguma idéia ????

 

:o

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi o q você está querendo fazer, mas imagino q você tenha um textarea e quer colocar o conteúdo desse textarea em um RTF mantendo as quebras de linha.

Se for isso, faça assim:

str_replace($textarea,"\\n","\\par");
Não testei, mas acho q precisa escapar a "\", por isso coloquei "\\". Abra o arquivo RTF gerado em um editor de texto (aka notepad) e verifique se os "\n" foram substituídos por \par.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado ignorante.

Sua ajuda foi muito útil p/ eu terminar o script.

 

Fiz assim:

$texto = nl2br($_POST["texto"]);$texto = str_replace("<br />","\\par",$texto);
Funcionou legal !!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom saber q fui útil. Mas você precisa ser um pouco mais paciente, sem ficar floodando o topico. E não me olha com essa cara....

Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal, quando eu inicio uma sessão ele da erro no internet explorerveja o exemplo:<? header( "Content-type: application/msword" );header( "Content-Disposition: inline, filename=teste");require("include/class.carrinho.php");session_start();$arquivo = "teste.rtf";$fp = fopen ( $arquivo, "r" );$output = fread( $fp, filesize( $arquivo ) );fclose ( $fp );$nome = $_SESSION['CARRINHO']->Cliente['NOME'];$data = "teste01";$end = "teste02";$output = str_replace( "<nome>", $nome, $output );$output = str_replace( "<data>", $data, $output );$output = str_replace( "<end>", $end, $output );echo $output;?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

resolvi o meu problema usando o seguinte headerheader("Pragma: public");header("Expires: 0");header("Cache-Control: must-revalidate, post-check=0, pre-check=0");header("Cache-Control: public", false);header("Content-Description: File Transfer");header( "Content-type: application/msword" );header("Content-Disposition: attachment; filename=\"orcamento.doc\";");vou deixar aqui para caso alguem tenha o mesmo problemaabraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.