Como fazer um relatório em PDF, usando comandos HTML em AdvPL

No artigo de hoje, vou mostrar como fazer para gerar um HTML, abrir no navegador para que seja possível a impressão em PDF.

Existem inúmeras formas de se fazer um relatório em AdvPL, porém me perguntaram se tinha como criar um em HTML, e desse arquivo gerar um PDF.

Pois bem, até dá, com tSimpleEditor e o método SaveToPDF, porém isso acaba desconfigurando o visual do relatório.

Então o que eu recomendo, é gerar o HTML via AdvPL, e ao gerar, gravar em uma pasta temporária e já abrir pelo navegador padrão do usuário.

E aí, o usuário pode dar um Ctrl+P na página HTML e escolher a impressora padrão ou em PDF.

Abaixo um exemplo de como fazer:

// Exemplo extraído de https://www.w3schools.com/html/html_tables.asp
Static Function fTextoHtml()
    Local cTextHtml := ""
    Local cPasta := GetTempPath()
    Local cArquivo := "relatorio_" + dToS(Date()) + "_" + StrTran(Time(), ":", "-") + ".html"

    //Monta o HTML
    cTextHtml += '<!DOCTYPE html>' + CRLF
    cTextHtml += '<html>' + CRLF
    cTextHtml += '<head>' + CRLF
    cTextHtml += '<style>' + CRLF
    cTextHtml += 'table {' + CRLF
    cTextHtml += '  width:100%;' + CRLF
    cTextHtml += '}' + CRLF
    cTextHtml += 'table, th, td {' + CRLF
    cTextHtml += '  border: 1px solid black;' + CRLF
    cTextHtml += '  border-collapse: collapse;' + CRLF
    cTextHtml += '}' + CRLF
    cTextHtml += 'th, td {' + CRLF
    cTextHtml += '  padding: 15px;' + CRLF
    cTextHtml += '  text-align: left;' + CRLF
    cTextHtml += '}' + CRLF
    cTextHtml += '#t01 tr:nth-child(even) {' + CRLF
    cTextHtml += '  background-color: #eee;' + CRLF
    cTextHtml += '}' + CRLF
    cTextHtml += '#t01 tr:nth-child(odd) {' + CRLF
    cTextHtml += ' background-color: #fff;' + CRLF
    cTextHtml += '}' + CRLF
    cTextHtml += '#t01 th {' + CRLF
    cTextHtml += '  background-color: black;' + CRLF
    cTextHtml += '  color: white;' + CRLF
    cTextHtml += '}' + CRLF
    cTextHtml += '</style>' + CRLF
    cTextHtml += '</head>' + CRLF
    cTextHtml += '<body>' + CRLF
    cTextHtml += '' + CRLF
    cTextHtml += '<h2>Styling Tables</h2>' + CRLF
    cTextHtml += '' + CRLF
    cTextHtml += '<table>' + CRLF
    cTextHtml += '  <tr>' + CRLF
    cTextHtml += '    <th>Firstname</th>' + CRLF
    cTextHtml += '    <th>Lastname</th> ' + CRLF
    cTextHtml += '    <th>Age</th>' + CRLF
    cTextHtml += '  </tr>' + CRLF
    cTextHtml += '  <tr>' + CRLF
    cTextHtml += '    <td>Jill</td>' + CRLF
    cTextHtml += '    <td>Smith</td>' + CRLF
    cTextHtml += '    <td>50</td>' + CRLF
    cTextHtml += '  </tr>' + CRLF
    cTextHtml += '  <tr>' + CRLF
    cTextHtml += '    <td>Eve</td>' + CRLF
    cTextHtml += '    <td>Jackson</td>' + CRLF
    cTextHtml += '    <td>94</td>' + CRLF
    cTextHtml += '  </tr>' + CRLF
    cTextHtml += '  <tr>' + CRLF
    cTextHtml += '    <td>John</td>' + CRLF
    cTextHtml += '    <td>Doe</td>' + CRLF
    cTextHtml += '    <td>80</td>' + CRLF
    cTextHtml += '  </tr>' + CRLF
    cTextHtml += '</table>' + CRLF
    cTextHtml += '<br>' + CRLF
    cTextHtml += '' + CRLF
    cTextHtml += '<table id="t01">' + CRLF
    cTextHtml += '  <tr>' + CRLF
    cTextHtml += '    <th>Firstname</th>' + CRLF
    cTextHtml += '    <th>Lastname</th> ' + CRLF
    cTextHtml += '    <th>Age</th>' + CRLF
    cTextHtml += '  </tr>' + CRLF
    cTextHtml += '  <tr>' + CRLF
    cTextHtml += '    <td>Jill</td>' + CRLF
    cTextHtml += '    <td>Smith</td>' + CRLF
    cTextHtml += '    <td>50</td>' + CRLF
    cTextHtml += '  </tr>' + CRLF
    cTextHtml += '  <tr>' + CRLF
    cTextHtml += '    <td>Eve</td>' + CRLF
    cTextHtml += '    <td>Jackson</td>' + CRLF
    cTextHtml += '    <td>94</td>' + CRLF
    cTextHtml += '  </tr>' + CRLF
    cTextHtml += '  <tr>' + CRLF
    cTextHtml += '    <td>John</td>' + CRLF
    cTextHtml += '    <td>Doe</td>' + CRLF
    cTextHtml += '    <td>80</td>' + CRLF
    cTextHtml += '  </tr>' + CRLF
    cTextHtml += '</table>' + CRLF
    cTextHtml += '' + CRLF
    cTextHtml += '</body>' + CRLF
    cTextHtml += '</html>' + CRLF

    //Grava o arquivo HTML e abre ele
    MemoWrite(cPasta + cArquivo, cTextHtml)
    ShellExecute("OPEN", cArquivo, "", cPasta, 1)
Return

Abaixo um print do navegador aberto, após pressionar Ctrl + P para imprimir.

Exemplo do html pronto para ser impresso no Navegador

Obs.: O HTML usado como referência, foi disponibilizado pela W3 Schools – https://www.w3schools.com/html/tryit.asp?filename=tryhtml_table_id2

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta