Converter HTML para PDF usando iTextSharp e Powershell

 

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.

001
002
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:

001
[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:

001
002
$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:

001
002
$Stream = [IO.File]::OpenWrite(“$env:USERPROFILE\Desktop\Test.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:

001
002
$Writer = [itextsharp.text.pdf.PdfWriter]::GetInstance($PDFDocument, $Stream)
$Writer.InitialLeading = ‘12.5’

Agora podemos acessar o documento para iniciar a escrita de fato:

001
$PDFDocument.Open()

O método ParseXHtml irá veriricar o Writer gerado, para escrever no documento e inserir o código contido no reader

001
002
$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

001
$PDFDocument.close()

Resultado final:

2014-06-11 12_54_14-Test.pdf - Adobe Reader

 

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:

2014-06-12 12_31_30-Administrator_ Windows PowerShell ISE

 

Dúvidas? Sugestões? Comente!

Até a proxima!

Anúncios
Esse post foi publicado em Powershell e marcado , , , , , . Guardar link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s