Gerando Documentos OpenOffice Dinamicamente
Abra o OpenOffice e crie um documento com a tabela, como a seguir, salvando-o com o nome tab1.odt.

(Uma imagem alternativa pode ser encontrada em http://www.floridia.net/OpenDocumentFormat/Artigo/html/fig3.gif)
Como pode ser percebido, já estamos preparando o arquivo para o uso de templates, marcados pelas chaves {}. Crie uma pasta OpenDocumentFormat em algum lugar do seu htdocs e descompacte o arquivo, criando uma nova pasta tab1 (costumo fazer uma cópia do arquivo, mudando a extensão de odt para zip).
Há algumas rotinas para zipar um arquivo, a minha eleita foi a ziplib.php do phpwiki versão 1.3.11.p1. São necessárias 3 mudanças muito simples no arquivo. Uma versão modificada pode ser encontrara <a href="http://floridia.net/OpenDocumentFormat/FacaVoceMesmo_OpenDocumentFormat.zip">aqui</a>.
O SmartTemplate é uma ferramenta leve e rápida. Incialmente devemos colocar os arquivos class.smarttemplate.php, class.smarttemplateparser.php e class.smarttemplatedebugger.php no include_path ou no diretório atual para pode utilizar a biblioteca.
Criamos uma cópia de content.xml chamada content2.xml, dentro da pasta tab1. Incluímos as duas linhas, conforme a seguir.
Note a presença dos marcadores de bloco BEGIN / END users e as tags {NAME} e {GROUP}.
Substituímos a primeira linha
pelo marcador {XMLHEADER}.
Salvemos o arquivo content2.xml. O motivo da mudança é que na primeira linha existem caracteres especiais que geram um erro quando o OpenOffice tenta abrir o arquivo gerado.
O programa que deve processá-lo é o que segue.
Vale notar o que é possível atribuir a uma variável uma tabela inteira, evitando a execução do loop: a matriz $x['users'] é substituída em uma linha! Veja, também, que não necessário incluir muitos marcadores no template, o que será importante para a facilidade de criação e manutenção dos documentos-modelo.
Apesar de lermos o arquivo content2.xml, o compactamos com o nome content.xml. Assim, podemos utilizar diversos esqueletos de arquivo, caso estilos e outros detalhes inscritos nos outros arquivos não mudem. Não esqueça de comentar o arquivo content.xml do vetor $ooofiles.
Ainda deve ser notado que as linhas que possuem caracteres especiais devem passar por uma codificação UTF8, senão aparecerão erros no arquivo. É claro que o procedimento correto é codificar todos os campos, este é apenas um exemplo didático.
Caso haja algum problema, descomente as linhas a seguir para enviar o resultado para a tela.
(Uma imagem alternativa pode ser encontrada em http://www.floridia.net/OpenDocumentFormat/Artigo/html/fig3.gif)
Como pode ser percebido, já estamos preparando o arquivo para o uso de templates, marcados pelas chaves {}. Crie uma pasta OpenDocumentFormat em algum lugar do seu htdocs e descompacte o arquivo, criando uma nova pasta tab1 (costumo fazer uma cópia do arquivo, mudando a extensão de odt para zip).
Há algumas rotinas para zipar um arquivo, a minha eleita foi a ziplib.php do phpwiki versão 1.3.11.p1. São necessárias 3 mudanças muito simples no arquivo. Uma versão modificada pode ser encontrara <a href="http://floridia.net/OpenDocumentFormat/FacaVoceMesmo_OpenDocumentFormat.zip">aqui</a>.
O SmartTemplate é uma ferramenta leve e rápida. Incialmente devemos colocar os arquivos class.smarttemplate.php, class.smarttemplateparser.php e class.smarttemplatedebugger.php no include_path ou no diretório atual para pode utilizar a biblioteca.
Criamos uma cópia de content.xml chamada content2.xml, dentro da pasta tab1. Incluímos as duas linhas, conforme a seguir.
(...)
</table:table-row>
</table:table-header-rows>
<!-- BEGIN users -->
<table:table-row>
<table:table-cell table:style-name="Tabela1.A2" office:value-type="string">
<text:p text:style-name="P3">{NAME}</text:p>
</table:table-cell>
<table:table-cell table:style-name="Tabela1.B2" office:value-type="string">
<text:p text:style-name="P3">{GROUP}</text:p>
</table:table-cell>
</table:table-row>
<!-- END users -->
<table:table-row>
(...)
Note a presença dos marcadores de bloco BEGIN / END users e as tags {NAME} e {GROUP}.
Substituímos a primeira linha
<?xml version="1.0" encoding="UTF-8"?>
pelo marcador {XMLHEADER}.
Salvemos o arquivo content2.xml. O motivo da mudança é que na primeira linha existem caracteres especiais que geram um erro quando o OpenOffice tenta abrir o arquivo gerado.
O programa que deve processá-lo é o que segue.
<?php
require_once ("ziplib.php");
require_once "class.smarttemplate.php";
$base="tab1";
$x['users'][0]['NAME']='Giovanni';
$x['users'][0]['GROUP']='Admin';
$x['users'][1]['NAME']='Leonardo';
$x['users'][1]['GROUP']=utf8_encode('Operações');
$x['users'][2]['NAME']='Orfeu';
$x['users'][2]['GROUP']='Desenvolvimento';
$x['users'][3]['NAME']='Isa';
$x['users'][3]['GROUP']='Vendas';
$content = new SmartTemplate("$base/content2.xml");
$content->assign($x);
$content->assign('XMLHEADER', '<?xml version="1.0" encoding="UTF-8"?>');
// $content->output();
// exit;
$zipfile = new ZipWriter("Comentario", $base."_generated.odt", "application/vnd.oasis.opendocument.text");
$ooofiles = array(
"mimetype",
// "content.xml", // Note que está comentada!
"styles.xml",
"meta.xml",
"settings.xml",
// "Configurations2/",
"META-INF/manifest.xml",
// "Pictures/",
// "Thumbnails/thumnail.png"
);
foreach ($ooofiles as $file) {
$handle = fopen("$base/$file","rb");
$filedata = fread($handle , filesize("$base/$file"));
$zipfile -> AddRegularFile($file, $filedata);
}
$zipfile->addRegularFile('content.xml', $content->result() );
echo $zipfile -> finish();
?>
Vale notar o que é possível atribuir a uma variável uma tabela inteira, evitando a execução do loop: a matriz $x['users'] é substituída em uma linha! Veja, também, que não necessário incluir muitos marcadores no template, o que será importante para a facilidade de criação e manutenção dos documentos-modelo.
Apesar de lermos o arquivo content2.xml, o compactamos com o nome content.xml. Assim, podemos utilizar diversos esqueletos de arquivo, caso estilos e outros detalhes inscritos nos outros arquivos não mudem. Não esqueça de comentar o arquivo content.xml do vetor $ooofiles.
Ainda deve ser notado que as linhas que possuem caracteres especiais devem passar por uma codificação UTF8, senão aparecerão erros no arquivo. É claro que o procedimento correto é codificar todos os campos, este é apenas um exemplo didático.
Caso haja algum problema, descomente as linhas a seguir para enviar o resultado para a tela.
// $content->output();
// exit;
Pessoal,
Como é minha primeira publicação, acabei deixando html demais. O código estava ilegível...
Dei uma limpada nos códigos, que tinham html demais, que acabou não sendo interpretado. Acho que agora a terceira parte está mais clara.
[]'s
Giovanni
Como é minha primeira publicação, acabei deixando html demais. O código estava ilegível...
Dei uma limpada nos códigos, que tinham html demais, que acabou não sendo interpretado. Acho que agora a terceira parte está mais clara.
[]'s
Giovanni
26/01/2006 8:54am
(~19 anos atrás)
Obrigado, Paulo.
A documentação do PDF é importante para aplicações mais complexas, inclusie para contribuir com o próprio phpdocwiter, que eu não conhecia.
Valem duas ressalvas. Primeiro, a abordagem do projeto é de gerar o documento codificando - similar ao uso de libs para criar pdf e outros formatos. Aqui utiliza-se o próprio OpenOffice para montar, de um jeito quase-WYSIWYG, o documento. É mais simples, mas pode-se deixar xml-lixo no documento.
Segundo, esta abordagem não é só para Writer, mas para planilhas eletrônicas Calc ou qualquer outro documento da suíte OpenOffice. Na realidade, é mais geral ainda - pode-se criar figura ou animações sgv, em pricípio. No site http://www.floridia.net/OpenDocumentFormat tenho um exemplo de planilha.
Abraços,
Giovanni
A documentação do PDF é importante para aplicações mais complexas, inclusie para contribuir com o próprio phpdocwiter, que eu não conhecia.
Valem duas ressalvas. Primeiro, a abordagem do projeto é de gerar o documento codificando - similar ao uso de libs para criar pdf e outros formatos. Aqui utiliza-se o próprio OpenOffice para montar, de um jeito quase-WYSIWYG, o documento. É mais simples, mas pode-se deixar xml-lixo no documento.
Segundo, esta abordagem não é só para Writer, mas para planilhas eletrônicas Calc ou qualquer outro documento da suíte OpenOffice. Na realidade, é mais geral ainda - pode-se criar figura ou animações sgv, em pricípio. No site http://www.floridia.net/OpenDocumentFormat tenho um exemplo de planilha.
Abraços,
Giovanni
26/01/2006 8:52am
(~19 anos atrás)
Existe um projeto chamado PHP DocWriter (http://phpdocwriter.sf.net) que utiliza classes do PHP para gerar todo o arquivo OpenOffice. Ele já faz o trabalho de geração de tabelas, propriedades da página, formatação de caracteres, imagens etc. Há muitos recursos ainda não implementados, mas, para projetos que demandem poucos recursos esta é uma excelente classe para geração de relatórios.
Gostei muito do artigo por ter abordado a coisa prática ao invés da teórica. De qualquer forma, para a utilização de recursos avançados, é fundamental a leitura do PDF sobre OpenDocument.
Parabéns!
Gostei muito do artigo por ter abordado a coisa prática ao invés da teórica. De qualquer forma, para a utilização de recursos avançados, é fundamental a leitura do PDF sobre OpenDocument.
Parabéns!
26/01/2006 6:11am
(~19 anos atrás)
Valeu!
Adriano