Olá a todos!
Recentemente precisei desenvolver uma interface com powershell para consulta de relatorios, porém ela deveria, dentre outras funcionalidades, salvar os relatórios em PDF. Após pesquisar muito encontrei o projeto iTextSharp, que é uma implementação .NET do projeto iText original, feito em Java.
Pois bem, após muitos testes pude perceber que esta biblioteca atenderia minhas necessidades. Neste post irei demostrar como podemos converter codigo HTML para PDF usando esta biblioteca.
Iremos precisar de 2 arquivos do projeto para esta tarefa, o iTextSharp.dll e o iTextSharp.XMLworker.dll. A versão utilizada é a 5.5.1, a mais recente até a data desta postagem.
Primeiro vamos carregar os assemblies para poder utilizar as classes e metodos necessários. Não se esqueçam de desbloquear os arquivos antes, caso contrario eles nao irão carregar corretamente.
Add-Type -Path '.\bin\itextsharp.dll'
Add-Type -Path '.\bin\itextsharp.xmlworker.dll'
Caregados os assemblies vamos definir o cogido HTML a ser exportado, neste exemplo, um simples filtro de serviços do windows:
[String]$HTMLCode = Get-Process | select Name, WS, CPU | ConvertTo-Html -As Table
Caso o conteúdo nao seja forçado em formato String, ele automaticamente será criado como uma array, o que irá gerar um erro durante o processo.
Agora iremos criar o documento e definir o tamanho da página para A4:
$PDFDocument = New-Object iTextSharp.text.Document
$PDFDocument.SetPageSize([iTextSharp.text.PageSize]::A4)
Agora para inicializar a escrita no arquivo, primeiro é necessario criar o Stream de escrita e definir usando o StringReader para ler a string HTML que geramos anteriormente, lembre se que no Stream fica o caminho no qual será salvo o arquivo:
$Stream = [IO.File]::OpenWrite("$env:USERPROFILEDesktopTest.pdf")
$reader = New-Object System.IO.StringReader($HTMLCode)
Agora iremos criar a instancia do writer para poder iniciar de fato a conversão, com um pequeno ajuste no InitialLeading, que tem um bug, quando nao definido, fica em 0, o que de forma intermitente, gera erro durante criação do PDF:
$Writer = [itextsharp.text.pdf.PdfWriter]::GetInstance($PDFDocument, $Stream)
$Writer.InitialLeading = '12.5'
Agora podemos acessar o documento para iniciar a escrita de fato:
$PDFDocument.Open()
O método ParseXHtml irá veriricar o Writer gerado, para escrever no documento e inserir o código contido no reader
$WorkerHelper = [iTextSharp.tool.xml.XMLWorkerHelper]::GetInstance()
$WorkerHelper.ParseXHtml($writer,$PDFDocument,$reader)
Após a conclusão do processo acima, bastainvocar o método close para finalizar a escrita no arquivo:
$PDFDocument.close()
Resultado final:
Feito isso esta concluído o processo para gerar o arquivo PDF, abaixo esta a URL da função que escrevi baseada neste post publicada no Technet.
TechNet Gallery: Convertfrom-PDFtoHTML
Execução da função em modo verbose:
Dúvidas? Sugestões? Comente!
Até a proxima!