Hashy Hashy  • 26.10.17 19:17

Transformando arquivos ODS ou XLS para PDF Empty Transformando arquivos ODS ou XLS para PDF 26.10.17 19:17

Esse artigo necessita que o Calc do OpenOffice.org esteja instalando, estou utilizando a versão 2.2 nesse artigo, para fazer o download do OpenOffice.org acesse esse endereço: http://www.openoffice.org

Esse script funciona graças as APIs que o OpenOffice.org possui e esse exemplo funciona apenas em servidores Windows.

Vamos fazer a coisa acontecer, crie um arquivo chamado: xls2pdf.class.php , esse será o arquivo da classe, que realizará toda transformação do arquivo em pdf, adicione o seguinte conteúdo ao arquivo:

Código:
<?php
class Xls2Pdf
{
    // Atributos.
    private $template_file;
    private $xls_file_tmp;
    private $xls_tmp;
    private $pdf_file_name;
    private $dir_files;
    private $value_col_row;

    // Métodos sets e gets.
    function setTemplateFile($template_file)
    {
        $this->template_file = $template_file;
    }

    function getTemplateFile()
    {
        return $this->template_file;
    }

    function setPdfFileName($pdf_file_name)
    {
        $this->pdf_file_name = $pdf_file_name;
    }

    function getPdfFileName()
    {
        return $this->pdf_file_name;
    }
    
    function setDirFiles($dir_files)
    {
        $this->dir_files = $dir_files;
    }
    
    function getDirFiles()
    {
        return $this->dir_files;
    }
    
    // Método construtor.
    function Xls2Pdf()
    {
        set_time_limit(0);
    }
    
    // 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 criação do arquivo pdf.
    function makePdf()
    {
        if (file_exists($this->getDirFiles() . $this->getTemplateFile())) {
            // Conecta com o OpenOffice.org
            $objServiceManager = new COM("com.sun.star.ServiceManager")
                    or die("O OpenOffice.org não está instalado.");
            // Cria a instância para trabalhar com as API´s do OpenOffice.org
            $objDesktop = $objServiceManager->createInstance("com.sun.star.frame.Desktop");
            // Carrega o OpenOffice.org na memória em modo invisível
            $args = array($this->makePropertyValue("Hidden", true, $objServiceManager));
            // Carrega o arquivo de template para dentro OpenOffice.org
            $objDocument = $objDesktop->loadComponentFromURL("file:///" . $this->getDirFiles() .
                    $this->getTemplateFile(), "_black", 0, $args);
            // Seleciona a primeira planilha do documento
            $activeSheet = $objDocument->getSheets->getByIndex(0);
            // Define o filtro calc_pdf_Export, esse filtro que converte o arquivo template em pdf
            $export_args = array(
                $this->makePropertyValue("FilterName", "calc_pdf_Export", $objServiceManager)
            );
            // Define o local onde será gravado o arquivo pdf gerado no computador
            $objDocument->storeToURL("file:///" . $this->getDirFiles() .
                    $this->getPdfFileName(), $export_args);
            // Descarrega o OpenOffice.org e fecha a conexão com as API´s
            $objDocument->dispose();
            $objDocument->close(true);
            // Retorna um vetor com o nome do pdf, o diretório dos arquivos e o nome do template
            return array($this->getPdfFileName(), $this->getDirFiles(), $this->getTemplateFile());
        } else {
            // Exibe uma mensagem de erro caso não exista o arquivo
            die("O arquivo de template especificado não existe.");
        }
    }
}
?>

Acabamos de montar o arquivo da classe, agora precisamos criar um arquivo que irá definir o nome do arquivo template, o diretório dos arquivos e o nome do arquivo pdf que você deseja que seja gerado.

Crie um arquivo chamado: criar_pdf.php, e insira o seguinte conteúdo:

Código:
<?php
// Insere o arquivo da classe
include("xls2pdf.class.php");

// Instância a classe
$xls2pdf = new Xls2Pdf();

// Seta o nome do arquivo de template
$xls2pdf->setTemplateFile("exemplo.ods");

// Seta o diretório onde está o arquivo de template
$xls2pdf->setDirFiles("C:/VertrigoServ/www/test/xls/");

// Seta o nome do arquivo pdf que deve ser gerado
$xls2pdf->setPdfFileName("meu_pdf.pdf");

// Converte o arquivo template em pdf
$result = $xls2pdf->makePdf();

// Exibe a mensagem de sucesso
echo $result[0] . " criado com sucesso em " . $result[1] . ".";
?>

O arquivo criar_pdf.php irá instanciar a classe e passar todos os parâmetros para ela, retornando uma mensagem de sucesso quando o arquivo pdf for gerado. Na primeira execução o script pode demorar um pouco, pois o OpenOffice.org está sendo carregado na memória, nas chamadas seguintes do arquivo criar_pdf.php vai ser mais rápido, pois o OpenOffice.org já irá estar carregado na memória do servidor.

A idéia desse script e você criar um arquivo de template ou qualquer documento e transformar ele em um pdf.

No código existe comentários em cada ponto, que explicam como funciona cada parte do código.

Você pode fazer o download desse script nesse endereço: www.patrickespake.com/pe_scripts/xls2pdf.zip

Espero que esse script facilite a vida de muita gente.

"O conhecimento só pode evoluir quando é compartilhado."

Créditos:
Gerenciamento: Patrick Espake
adaptação e utilização: Hashy

b3ta b3ta  • 26.10.17 20:33

Transformando arquivos ODS ou XLS para PDF Empty Re: Transformando arquivos ODS ou XLS para PDF 26.10.17 20:33

Muito bom, parabéns pelo conteúdo e obrigado por compartilhar!
Permissões neste sub-fórum
Não podes responder a tópicos

BH Servers

Recomendamos a BH Servers com proteção DDOS gratuita em Cloud Server de alta performance. Entrega imediata.