Transformando documentos DOC, ODT ou RTF para PDF
por Patrick Espake

Uma necessidade que está surgindo é a criação de arquivos doc, odt (formato de texto do OpenOffice - Writer) ou rtf para pdf. O PHP não possui nenhuma engine que realiza essa transformação, desta forma é necessário usar alguns métodos para realizar essa tarefa.
O processo descrito aqui funciona para servidores Windows rodando o Apache e o PHP, até gostaria de pedir ajuda para transpor esse código para servidores Linux, mas no final do artigo conversamos mais a respeito do Linux.



Como o PHP não possui engines para transformação de documentos de texto para pdf é necessário instalar o OpenOffice.org, pois através dele que iremos realizar a criação dos arquivos de texto em pdf.

O primeiro passo é instalar o OpenOffice.org, para isso basta acessar: http://www.openoffice.org e fazer o download do OpenOffice, nesse artigo usei o Open Office versão 2.2.

Após fazer o download do Open Office realize a sua instalação, se quiser basta instalar somente o Writer e o Calc (em um próximo artigo explicarei como converter arquivos XLS ou ODS para PDF).

Agora vamos criar um arquivo novo em PHP, esse arquivo será a nossa classe de criação de arquivos DOC, ODT ou RTF para PDF.

Digite o texto o abaixo e salve o arquivo como: doc2pdf.class.php.


<?php
/****************************************************************/
/* CLASSE RESPONSÁVEL PELA CRIAÇÃO DE ARQUIVOS TEMPLATES EM PDF */
/* CRIADO POR: PATRICK ESPAKE ***********************************/
/* E-mail: patrickespake@gmail.com ******************************/
/****************************************************************/

class Doc2Pdf
{
    
// Atributos.
    
private $template_file;
    
private $doc_file;
    
private $pdf_file_name;
    
private $pdf_file;
    
private $dir_files;
    
    
// Métodos sets e gets.
    
function setTemplateFile($template_file) { $this->template_file $template_file; }
    function 
getTemplateFile() { return $this->template_file; }
    
    function 
setDocFile($doc_file) { $this->doc_file $doc_file; }
    function 
getDocFile() { return $this->doc_file; }
    
    function 
setPdfFileName($pdf_file_name) { $this->pdf_file_name $pdf_file_name; }
    function 
getPdfFileName() { return $this->pdf_file_name; }
    
    function 
setPdfFile($pdf_file) { $this->pdf_file $pdf_file; }
    function 
getPdfFile() { return $this->pdf_file; }
    
    function 
setDirFiles($dir_files) { $this->dir_files $dir_files; }
    function 
getDirFiles() { return $this->dir_files; }
    
    
// Método construtor.
    
function Doc2Pdf()
    {
        
set_time_limit(0);
    }
    
    
// Método de criação do arquivo pdf.
    
function makePdf()
    {
        if(
file_exists($this->getDirFiles() . $this->getTemplateFile()))
        {
            
$doc_file "file:///" $this->getDirFiles() . $this->getTemplateFile();
            
$pdf_file "file:///" $this->getDirFiles() . $this->getPdfFileName();
            
$this->setDocFile($doc_file);
            
$this->setPdfFile($pdf_file);
            if(
$this->word2pdf())
                return array(
$this->getPdfFileName(), $this->getDirFiles(), $this->getTemplateFile());
            else
                die(
"<strong>Não foi possível geral o arquivo pdf, tente novamente.</strong>");
        }
        else
            die(
"<strong>O arquivo de template especificado não existe.</strong>");
    }
    
    
// Método de criação das propriedades do OpenOffice.org
    
function makePropertyValue($name$value$osm)
    {
        
$oStruct $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
        
$oStruct->Name $name;
        
$oStruct->Value $value;
        return 
$oStruct;
    }
    
    
// Método de transformação do arquivo doc, odt ou rtf para arquivo pdf.
    
function word2pdf()
    {
        
$doc_url $this->getDocFile();
        
$output_url $this->getPdfFile();
        
$osm = new COM("com.sun.star.ServiceManager") or die("<strong>O OpenOffice.org não está instalado.</strong>");
        
$args = array($this->makePropertyValue("Hidden"true$osm));
        
$oDesktop $osm->createInstance("com.sun.star.frame.Desktop");
        
$oWriterDoc $oDesktop->loadComponentFromURL($doc_url"_blank"0$args);
        
$export_args = array($this->makePropertyValue("FilterName""writer_pdf_Export"$osm));
        
$oWriterDoc->storeToURL($output_url,$export_args);
        
$oWriterDoc->close(true);
        return 
true;
    }
}
?>




Agora vamos criar um arquivo PHP chamando criar_pdf.php, esse arquivo deverá ter o seguinte conteúdo:


<?php
// Inclui o arquivo da classe.
include("doc2pdf.class.php");
    
// Cria o objeto.
$doc2pdf = new Doc2Pdf();
    
// Nome do arquivo do doc, odt ou rtf.
$doc2pdf->setTemplateFile("meu_arquivo.doc");
    
// Nome do arquivo do pdf que será gerado.
$doc2pdf->setPdfFileName("meu_pdf.pdf");
    
// Diretório onde os arquivos estão localizados, é necessário usar o caminho completo.
$doc2pdf->setDirFiles("C:/apache/www/pdf/");
    
// Cria o arquivo pdf.
$doc2pdf->makePdf();
?>


Para gerar o PDF é só rodar o arquivo criar_pdf.php e o PDF será gerado na pasta definida no $doc2pdf->setDirFiles("C:/apache/www/pdf/"), no nosso caso na pasta C:\apache\www\pdf\.

A linha $doc2pdf->makePdf() retorna um array com as informações do nome do PDF, o diretório e o nome do arquivo de template. Essas informações podem ser usadas depois para redirecionar o browser para mostrar o PDF, após ser gerado.

Como foi comentado no começo desse artigo, esse código roda perfeitamente no ambiente Windows, no ambiente Linux não consegui descobrir uma solução, caso alguém saiba como fazer, favor avisar. Como a maioria dos servidores roda Linux, a solução em Linux vai ser bem mais interessante.

Espero que possa ter ajudado!

Abraços,
Patrick Espake