LibreOffice Writer Wysiwyg + wkhtmltopdf (Scriptcase) 2021

Essa dica é para quem criar criar um modelo no LibreOffice Writer e depois usa-lo para
imprimir o mesmo no Scriptcase usando o comando shell wkhtmltopdf (Windows/Linux)

Somente usado em hospedagens Dedicadas ou VPS, porque tem que instalar
o wkhtmltopdf via linha de comando para que o PHP possa executar ele
com o comando shell_exec(…

Coloque o nome dos campos iniciados e finalizados com ‘x’, para podermos fazer o Replace
‘Troca’ no html pela codificação no evento do Scriptcase.

Exemplo campo Nome = xNomex

Sempre que criar um Modelo no LibreOffice Writer gravar e guardar ele
com a extensão .odt na pasta de modelos do cliente, ai vamos
exportar ele para .XHTML no Writer mesmo.

Na hora que for feita a conversão final para o .html o arquivo ficará automaticamente
em UTF8, que é o mesmo padrão que adotamos atualmente no Scriptcase.

CONVERTER HTML EM PDF


/* 

Criar Botão Scriptcase no formulário Tipo PHP com Target = Outra Janela.


Site oficial wkhtmltopdf para baixar e instalar a versão Windows 64, no Linux é instalação via linha de comando.
Windows: https://wkhtmltopdf.org/downloads.html
Linux Exemplo: https://tecadmin.net/convert-html-to-pdf-using-qtwebkit-with-php/

Modelo Original informe_vencimento_.odt LibreOffice Writer
Exportado como .XHTML e convertido em .html 

Converter o XHTML para HTML
https://products.aspose.app/words/pt/conversion/xhtml-to-html

Formatar o Html Ficar formatado bonito.
https://www.freeformatter.com/html-formatter.html

Corrigir Alinhamento para Direita Nº Faturamento ele fica em <p class="P4" align="right"><span>xFaturamentoIDx</span></p>
ai sabemos que é "P4".
Procurar:
.P4 { text-align:left
Trocar para:
.P4 { text-align:right


Caso precisar saltar a página:
Editar o .html e colocar no final Salto de Página: <div style="break-after:page">:
Procurar por:
   </head>
   <body>
      <div>

Trocar por:
   </head>
   <body>
      <div style="break-after:page">
	  

Incorporação de Html = Metódo HEREDOC EOD
$_Html_Original = <<<HTML
<html>
   <head>
   <body>
...
...
   </body>
</html>
HTML;


*/


// Colar Todo o Html entre <<<HTML e HTML;

$_Html_Original = <<<HTML
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <meta http-equiv="Content-Style-Type" content="text/css" />
      <meta name="generator" content="Aspose.Words for .NET 21.7.0" />
      <title>- no title specified</title>
      <style type="text/css">body { font-family:'Times New Roman'; font-size:12pt }h1, h2, h3, h4, h5, h6, p { margin:0pt }table { margin-top:0pt; margin-bottom:0pt }h1 { margin-top:12pt; margin-bottom:0pt; page-break-inside:avoid; page-break-after:avoid; font-family:'Times New Roman'; font-size:24pt; font-weight:bold; font-style:normal; color:#2f5496 }h2 { margin-top:2pt; margin-bottom:0pt; page-break-inside:avoid; page-break-after:avoid; font-family:'Times New Roman'; font-size:18pt; font-weight:bold; font-style:normal; color:#2f5496 }h3 { margin-top:2pt; margin-bottom:0pt; page-break-inside:avoid; page-break-after:avoid; font-family:'Times New Roman'; font-size:14pt; font-weight:bold; font-style:normal; color:#1f3763 }h4 { margin-top:2pt; margin-bottom:0pt; page-break-inside:avoid; page-break-after:avoid; font-family:'Times New Roman'; font-size:12pt; font-weight:bold; font-style:normal; color:#2f5496 }h5 { margin-top:2pt; margin-bottom:0pt; page-break-inside:avoid; page-break-after:avoid; font-family:'Times New Roman'; font-size:10pt; font-weight:bold; font-style:normal; color:#2f5496 }h6 { margin-top:2pt; margin-bottom:0pt; page-break-inside:avoid; page-break-after:avoid; font-family:'Times New Roman'; font-size:8pt; font-weight:bold; font-style:normal; color:#1f3763 }.P1 { writing-mode:lr-tb; font-family:'Liberation Serif'; font-size:12pt }.P10 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:11pt }.P11 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:11pt }.P12 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:11pt; font-weight:bold }.P13 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:10pt }.P14 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:10pt; font-weight:bold }.P2 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:11pt }.P3 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:11pt; font-weight:bold }.P4 { text-align:right; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:16pt; font-weight:bold }.P5 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:10pt }.P6 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:10pt; font-weight:bold }.P7 { text-align:center; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:12pt; font-weight:bold }.P8 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:12pt; font-weight:bold }.P9 { text-align:left; line-height:normal; writing-mode:lr-tb; font-family:Arial; font-size:20pt }span.Heading1Char { font-family:'Calibri Light'; font-size:16pt; color:#2f5496 }span.Heading2Char { font-family:'Calibri Light'; font-size:13pt; color:#2f5496 }span.Heading3Char { font-family:'Calibri Light'; font-size:12pt; color:#1f3763 }span.Heading4Char { font-family:'Calibri Light'; font-style:italic; color:#2f5496 }span.Heading5Char { font-family:'Calibri Light'; color:#2f5496 }span.Heading6Char { font-family:'Calibri Light'; color:#1f3763 }span.T1 { font-weight:bold }.Tabela1 {  }.Tabela2 {  }</style>
   </head>
   <body>
      <div style="break-after:page">
         <p class="P1" style="margin-top:12.2pt; margin-right:14.15pt; margin-left:14.15pt"><span> </span></p>
         <table cellspacing="0" cellpadding="0" class="Tabela1" style="width:561.4pt; margin-left:14.4pt; border-collapse:collapse">
            <tr>
			
			.......
			.......
			....... etc.
			
         </table>
         <p class="P1" style="margin-right:14.15pt; margin-left:14.15pt; margin-bottom:12.2pt"><span> </span></p>
      </div>
   </body>
</html>
HTML;

$_FaturamentoID = {FaturamentoID};

/* Macro sc_lookup */

$sql ="
SELECT
	fat.GraficaID AS GraficaID,
	fat.FaturamentoID AS FaturamentoID,
	fat.EmitirParaID AS EmitirParaID,
	fat.FaturarParaID AS FaturarParaID,
	fp.VencimentoData AS VencimentoData,
	fp.VencimentoValor AS VencimentoValor,
	fat.CodigoContaID AS CodigoContaID,
	fat.InformacoesUsoGrafica AS InformacoesUsoGrafica,
	fat.InformeEmissao AS InformeEmissao,
	fat.InformeEmitidoPor AS InformeEmitidoPor
FROM
	faturamento_parcelas fp
	INNER JOIN faturamento fat ON fp.FaturamentoID = fat.FaturamentoID
WHERE
	fp.FaturamentoID = $_FaturamentoID
";				


sc_lookup(chk_fat, $sql);

/* Erro no lookup */
if (FALSE === {chk_fat}) {
	echo "Ocorreu um erro no acesso ao<BR>banco de dados: $sql.<BR>";
}
elseif (empty({chk_fat})) { /* EOF */

	echo "Nenhum valor foi retornado pelo banco.<BR>";
}
else {

	/* Inclua aqui sua rotina de processamento */

	$_GraficaID = {chk_fat[0][0]};
	$_FaturamentoID = {chk_fat[0][1]};
	$_EmitirParaID = {chk_fat[0][2]};
	$_FaturarParaID = {chk_fat[0][3]};
	$_VencimentoData = DataX({chk_fat[0][4]});
	$_VencimentoValor = ValorX({chk_fat[0][5]}, 2);
	$_CodigoContaID = {chk_fat[0][6]};
	$_InformacoesUsoGrafica = {chk_fat[0][7]};
	$_InformeEmissao = DataX({chk_fat[0][8]});
	$_InformeEmitidoPor = {chk_fat[0][9]};						

}

if (empty($_FaturarParaID)) {
	$_FaturarParaID = $_EmitirParaID;
}



/* Macro sc_lookup */

$sql ="
SELECT
   Nome,
   Razao,
   CPF_CPNJ,
   DOCTO,
   NFe_InscricaoMunicipal,
   CNAE,
   LogoTipo,
   SiteEmpresa,
   NFe_Endereco,
   NFe_Numero,
   NFe_Bairro,
   NFe_Cidade,
   NFe_UF,
   NFe_CEP,
   NFe_Telefone,
   NFe_email
FROM
   graficas
WHERE
	GraficaID = $_GraficaID
";

sc_lookup(chk_graf, $sql);

/* Erro no lookup */
if (FALSE === {chk_graf}) {
	echo "Ocorreu um erro no acesso ao<BR>banco de dados: $sql.<BR>";
}
elseif (empty({chk_graf})) { /* EOF */

	// CONTINUA...
	
}
else {

	/* Inclua aqui sua rotina de processamento */

	$_Nome = {chk_graf[0][0]};
	$_Razao = {chk_graf[0][1]};
	$_CPF_CPNJ = {chk_graf[0][2]};
	$_DOCTO = {chk_graf[0][3]};
	$_NFe_InscricaoMunicipal = {chk_graf[0][4]};
	$_CNAE = {chk_graf[0][5]};
	$_LogoTipo = {chk_graf[0][6]};
	$_SiteEmpresa = {chk_graf[0][7]};
	$_NFe_Endereco = {chk_graf[0][8]};
	$_NFe_Numero = {chk_graf[0][9]};
	$_NFe_Bairro = {chk_graf[0][10]};
	$_NFe_Cidade = {chk_graf[0][11]};
	$_NFe_UF = {chk_graf[0][12]};
	$_NFe_CEP = {chk_graf[0][13]};
	$_NFe_Telefone = {chk_graf[0][14]};
	$_NFe_email = {chk_graf[0][15]};	
	
	$_Imagem = base64_encode($_LogoTipo);

	$_LogoTipo="<img border=0 src='data:image/jpeg;base64,$_Imagem'>";
	
	$_GraficaRazao = $_Razao;
	
	$_GraficaLinha01 = $_Razao . ' - CNPJ: ' . CPFX($_CPF_CPNJ) .
						' - I.E.: ' . $_DOCTO . ' - I.M.: ' . $_NFe_InscricaoMunicipal;
	
	$_GraficaLinha02 = $_NFe_Endereco . ' No. ' . $_NFe_Numero. ' - ' . $_NFe_Bairro . 
						' - ' . $_NFe_Cidade . ' - ' . $_NFe_UF .
						' - CEP ' . CEPX($_NFe_CEP);
	
	$_GraficaLinha03 = 'Telefone: ' . FoneX($_NFe_Telefone) .
		' Atendimento: de 2a a 6a-Feira - das 8h as 18h - ' . $_SiteEmpresa;

}



// TROCA CAMPOS da VARIAVEL $_Html

$_Html = $_Html_Original;

$_Html = str_replace('xLogoTipox', $_LogoTipo, $_Html);

$_Html = str_replace('xGraficaRazaox', $_GraficaRazao, $_Html);
$_Html = str_replace('xInformeEmissaox', $_InformeEmissao, $_Html);
$_Html = str_replace('xInformeEmitidoPorx', $_InformeEmitidoPor, $_Html);
$_Html = str_replace('xFaturamentoIDx', $_FaturamentoID, $_Html);

$_Html = str_replace('xClienteRazaox', $_ClienteRazao, $_Html);
$_Html = str_replace('xClienteNomex', $_ClienteNome, $_Html);
$_Html = str_replace('xEndereco01x', $_Endereco01, $_Html);
$_Html = str_replace('xEndereco02x', $_Endereco02, $_Html);

$_Html = str_replace('xTelefonex', $_Telefone, $_Html);
$_Html = str_replace('xContatox', $_Contato, $_Html);

$_Html = str_replace('xVencimentoDatax', $_VencimentoData, $_Html);
$_Html = str_replace('xVencimentoValorx', $_VencimentoValor, $_Html);
$_Html = str_replace('xCodigoConta01x', $_CodigoConta01, $_Html);
$_Html = str_replace('xCodigoConta02x', $_CodigoConta02, $_Html);
$_Html = str_replace('xInformacoesUsoGraficax', $_InformacoesUsoGrafica, $_Html);

$_Html = str_replace('xGraficaLinha01x', $_GraficaLinha01, $_Html);
$_Html = str_replace('xGraficaLinha02x', $_GraficaLinha02, $_Html);
$_Html = str_replace('xGraficaLinha03x', $_GraficaLinha03, $_Html);


$_Arquivo_Gerar = 'informe_vencimento_'.$_FaturamentoID;

if (strpos(strtolower(php_uname()), 'windows') === 0) {
	// WINDOWS
	$_Arquivo_Nome_Html = 'C:\\IMPRESSOS\\'.$_Arquivo_Gerar.'.html';
	$_Arquivo_Nome_PDF = 'C:\\IMPRESSOS\\'.$_Arquivo_Gerar.'.pdf';
} else {
	// LINUX	
	$_Arquivo_Nome_Html = $this->Ini->path_doc.'/'.$_Arquivo_Gerar.'.html';
	$_Arquivo_Nome_PDF = $this->Ini->path_doc.'/'.$_Arquivo_Gerar.'.pdf';
}

$_Arquivo = fopen($_Arquivo_Nome_Html, "wb");
fwrite($_Arquivo, $_Html);
fclose($_Arquivo);

if (strpos(strtolower(php_uname()), 'windows') === 0) {
    $_executar = '"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe" -T 10 -R 0 -B 0 -L 0 --orientation Portrait --page-size A4 --disable-smart-shrinking '.$_Arquivo_Nome_Html.' '.$_Arquivo_Nome_PDF;
} else {
    $_executar = '/usr/local/bin/wkhtmltopdf -T 10 -R 0 -B 0 -L 4.5 --zoom 0.92 --orientation Portrait --page-size A4 '.
                 $_Arquivo_Nome_Html.' '.$_Arquivo_Nome_PDF;
}

$_resultado = shell_exec($_executar);
// echo "<pre>$_resultado</pre>";

$_Arquivo_Nome_PDF = $_Arquivo_Gerar.'.pdf';

$_link='https://www.seu_site.com/file/doc/'.$_Arquivo_Nome_PDF;

sc_redir($_link, '', "_self");

Resultado após clicar no Botão Imprimir no formulário, censurei os dados sensíveis do cliente.

6 Curtidas

Valeu Jailton. O Libreoffice qualquer um pode ter.

3 Curtidas

Olá, Essas dicas são realmente incríveis, e estou fazendo um projeto no qual tenho que criar um template, espero que suas dicas me ajudem com isso. Eu estava lendo sobre verificador de plágio onde os alunos podem conferir suas redações para plágio em https://olatcc.com.br/detector_de_plagio, e espero com a ajuda isso ajude a fazer minha redação dentro do prazo.