VB .NET - Criando documentos PDF (PDFSharp + Migradoc) - IV
Hoje eu volto ao assunto de como gerar documentos PDF usando a linguagem VB .NET. Neste artigo eu vou mostrar como imprimir arquivos PDF usando o PDFSharp e Migradoc. |
Chegou o Curso ASP .NET MVC 5 Vídeo Aulas (C#)
Continuando o artigo anterior vamos concluir essa série de artigos sobre a geração de arquivos PDF usando PDFSharp + Migradoc mostrando duas opções de impressão dos arquivos PDF gerados.
Recursos usados :
Visual Studio Community 2013 (A versão 2015 já esta disponível na versão RC)
Abrindo a solução no VS Community 2013
Abra a solução VBNET_Gerando_PDF criado na primeira parte do artigo e onde criamos o projeto 1_PDF_WF_Simples que estendido na segunda parte do artigo.
Vamos abrir o projeto 1_PDF_WF_Simples onde temos as opções para gerar arquivos PDFs usando as bibliotecas PDFSharp e Migradoc.
Agora vamos incluir dois botões de comando no formulário form1.vb acima a partir da ToolBox:
1 Button - btnImpressaoPdfSharp
1 Button - btnImpressaoMigradoc
Disponha os controles no formulário conforme o leiaute da figura abaixo:
Imprimindo com PdfFilePrinter (PDFSharp)
Vamos definir o código no evento Click do botão de comando Imprimir com PDFSharp usando o componente PdfFilePrinter da biblioteca PDFSharp que usa o Adobe Acrobat reader para imprimir um documento PDF :
Private Sub btnImpressaoPDFSharp_Click(sender As Object, e As EventArgs) Handles btnImpressaoPDFSharp.Click
'verifica se o arquivo de PDF existe
If File.Exists(txtDestino.Text) Then
'define o caminho do Adobe Reader
PdfFilePrinter.AdobeReaderPath = "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe"
' Apresenta o dialog de configuração da impressora
' de forma que o usuário possa selecionar a impressora
Dim settings As PrinterSettings = New PrinterSettings()
settings.Collate = False
'Cria um objeto PrindDialog
Dim printerDialog As PrintDialog = New PrintDialog
printerDialog.AllowSomePages = False
printerDialog.ShowHelp = False
printerDialog.PrinterSettings = settings
printerDialog.AllowPrintToFile = True
printerDialog.PrinterSettings.PrintToFile = True
'apresenta a janela
Dim resultado As DialogResult = printerDialog.ShowDialog
'verifica a seleção do usuário
If resultado = DialogResult.OK Then
' imprime o documento na impressora selecionada
Dim printer As New PdfFilePrinter(txtDestino.Text, settings.PrinterName)
Try
printer.Print()
Catch ex As Exception
'captura erros
MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
Else
MessageBox.Show("Informe o arquivo PDF não existe.", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
|
O código acima define o caminho do Adobe Acrobat Reader da minha máquina local e a seguir usa os componentes PrinterSettings e PrintDialog() para exibir uma janela de diálogo para que o usuário selecione uma impressora.
Neste exemplo após apresentar a janela de diálogo da impressora ao usuário usamos o PdfFilePrinter para imprimir o documento.
Nessa abordagem de impressão o PdfFilePrinter invoca o Adobe Acrobat reader e isso tem um efeito colateral de abrir o arquivo PDF na janela durante a impressão. Contornar esse problema parece que atualmente não é uma tarefa simples e assim vamos apresentar a segunda abordagem de impressão usando o Migradoc.
Imprimindo com MigraDoc.Rendering.Printing.MigraDocPrintDocument (Migradoc)
A
classe
MigraDocPrintDocument
fornece um processo de impressão simplificado de documentos PDF e
fundamentalmente, integra-se com as disposições de impressão da
plataforma .NET, renderizando uma pagina PDF de cada vez em um objeto
Graphics.
Isso é possível porque o PDFSharp tem uma característica particularmente
útil: a capacidade de encapsular um objeto Graphics GDI+ (como
o usado pelo framework .NET). Isto significa que você pode
renderizar componentes PDF para um arquivo PDF, uma impressora ou até
mesmo para a tela (por exemplo, para criar um 'preview').
Há duas etapas para imprimir um documento PDF usando essa abordagem. O
primeiro passo consiste em obter as configurações da impressora alvo.
Isto pode ser feito usando um PrintDialog como mostrado
anteriormente. No entanto, a principal diferença a partir da abordagem
anterior é que agora podemos utilizar um objeto PrintDocument em
vez de um PdfFilePrinter.
Inclua o código abaixo no evento Click do botão de comando - Imprimir com Migradoc :
Private Sub btnImpressaoMigradoc_Click(sender As Object, e As EventArgs) Handles btnImpressaoMigradoc.Click
Dim settings As PrinterSettings = New PrinterSettings()
settings.Collate = False
Dim printerDialog As New PrintDialog()
printerDialog.AllowSomePages = True
printerDialog.ShowHelp = False
printerDialog.PrinterSettings = settings
printerDialog.AllowPrintToFile = True
printerDialog.PrinterSettings.PrintToFile = True
Dim result As DialogResult = printerDialog.ShowDialog()
If result = DialogResult.OK Then
Dim printDoc = New PrintDocument()
AddHandler printDoc.PrintPage, AddressOf printDoc_PrintPage
printDoc.PrinterSettings = printerDialog.PrinterSettings
printDoc.Print()
End If
End Sub
|
Neste código a única novidade seria o código que relaciona o objeto PrintDocument com o evento printDoc_PrintPage:
AddHandler printDoc.PrintPage, AddressOf printDoc_PrintPage
Aqui estamos usando a declaração AddHandler e o operador AddressOf .
Neste caso estou associando o procedimento printDoc_PrintPage ao evento printDoc.PrintPage , ou seja , no procedimento printDoc_PrintPage iremos definir o código que realizar a impressão do arquivo PDF.
Antes de definir o código neste método precisamos declarar as seguintes constantes e função conforme a seguir no início do formulário:
<
DllImport("gdi32.dll")> _Private Shared Function GetDeviceCaps(hdc As IntPtr, capability As Integer) As Integer
End Function' Area fisica de impressao x
Private Const PHYSICALOFFSETY As Integer = 113' Area fisica de impressa y
Agora no mo evento evento printDoc_PrintPage temos o código que realiza a impressão:
Private Sub printDoc_PrintPage(sender As Object, e As PrintPageEventArgs)
' Obtem um objeto XGraphics para a pagina
Dim graphics As Graphics = e.Graphics
Dim hdc As IntPtr = graphics.GetHdc()
Dim xOffset As Integer = GetDeviceCaps(hdc, PHYSICALOFFSETX)
Dim yOffset As Integer = GetDeviceCaps(hdc, PHYSICALOFFSETY)
graphics.ReleaseHdc(hdc)
Dim hardMarginX As Single = xOffset * 100 / graphics.DpiX
Dim hardMarginY As Single = yOffset * 100 / graphics.DpiY
graphics.TranslateTransform(-hardMarginX, -hardMarginY)
' Define a largura e altura
Dim pageSize As New XSize(e.PageSettings.Bounds.Width / 100.0 * 72, e.PageSettings.Bounds.Height / 100.0 * 72)
Dim scale As Single = 100.0F / 72.0F
graphics.ScaleTransform(scale, scale)
Dim gfx As XGraphics = XGraphics.FromGraphics(graphics, pageSize)
End Sub
|
Minha opinião pessoal é que esse processo é muito complexo e sujeito a erros, embora eu esteja apresentando o código não incentivo o seu uso.
Assim, creio que usando o PDFSharp a forma mais simples de imprimir é usar a opção de impressão do Adobe Acrobat Reader quando o documento PDF for exibido.
Pegue o projeto completo aqui: VBNET_Gerando_PDF4.zip (sem as referências)
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
VB .NET - Um leitor de arquivos no formato PDF - Macoratti ...