Personalização de pdf com iTextShap
Estou utilizando o iTextSharp para exportar os relatórios para pdf. Porém estou com uma dúvida quanto a definição da largura das colunas. Acontece que todas as colunas estão sendo geradas com o tamanho automático, porém gostaria de personalizar pois tem um campo que necessita ter uma largura um pouco maior que as outras.
Este é o meu código:
Public Shared Sub ExportToPDF(ByVal dt As DataTable, ByVal dtFilters As DataTable, ByVal NomeDoc As String)
Dim Response As System.Web.HttpResponse _
= System.Web.HttpContext.Current.Response
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment;filename=" + DataName + NomeDoc + ".pdf")
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Dim CaminhoImagens = System.Configuration.ConfigurationManager.AppSettings("Imagens")
Dim pdfDoc As New Document(PageSize.A4.Rotate(), 30, 30, 30, 30)
Dim imgHeader As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(CaminhoImagens + "/header_report.jpg")
Dim table As New PdfPTable(dt.Columns.Count)
Dim tableFilter As New PdfPTable(2)
Dim cellCol As New PdfPCell()
Dim cellRow As New PdfPCell()
Dim cellFilter As New PdfPCell()
Dim fontColor As New Font
table.WidthPercentage = 100
tableFilter.WidthPercentage = 100
For Each row As DataRow In dtFilters.Rows
For Each Col As DataColumn In dtFilters.Columns
cellFilter.Phrase = New Phrase(Col.ToString + ": " + row.Item(Col).ToString)
cellFilter.Border = 0
tableFilter.AddCell(cellFilter)
Next
Next
For Each col As DataColumn In dt.Columns
fontColor.Color = BaseColor.WHITE
cellCol.Phrase = New Phrase(col.ToString, New Font(fontColor))
cellCol.BackgroundColor = New BaseColor(127, 127, 127)
table.AddCell(cellCol)
Next
For Each row As DataRow In dt.Rows
For Each strCol As DataColumn In dt.Columns
cellRow.Phrase = New Phrase(row.Item(strCol).ToString)
cellRow.Top = 0
cellRow.Border = 1
table.AddCell(cellRow)
Next
Next
PdfWriter.GetInstance(pdfDoc, Response.OutputStream)
pdfDoc.Open()
pdfDoc.Add(imgHeader)
pdfDoc.Add(tableFilter)
pdfDoc.Add(New Phrase(Environment.NewLine))
pdfDoc.Add(table)
pdfDoc.Close()
End Sub
Alguém tem idéia de como posso fazer isso? Já defini as tabelas com largura de 100% com o comando "WidthPercentage = 100", mas preciso que a coluna "Action" seja um pouco mais larga como mostro na imagem: http://img217.imageshack.us/i/imagepost.jpg/
agradeço a atenção,
Bruno
Este é o meu código:
Public Shared Sub ExportToPDF(ByVal dt As DataTable, ByVal dtFilters As DataTable, ByVal NomeDoc As String)
Dim Response As System.Web.HttpResponse _
= System.Web.HttpContext.Current.Response
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment;filename=" + DataName + NomeDoc + ".pdf")
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Dim CaminhoImagens = System.Configuration.ConfigurationManager.AppSettings("Imagens")
Dim pdfDoc As New Document(PageSize.A4.Rotate(), 30, 30, 30, 30)
Dim imgHeader As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(CaminhoImagens + "/header_report.jpg")
Dim table As New PdfPTable(dt.Columns.Count)
Dim tableFilter As New PdfPTable(2)
Dim cellCol As New PdfPCell()
Dim cellRow As New PdfPCell()
Dim cellFilter As New PdfPCell()
Dim fontColor As New Font
table.WidthPercentage = 100
tableFilter.WidthPercentage = 100
For Each row As DataRow In dtFilters.Rows
For Each Col As DataColumn In dtFilters.Columns
cellFilter.Phrase = New Phrase(Col.ToString + ": " + row.Item(Col).ToString)
cellFilter.Border = 0
tableFilter.AddCell(cellFilter)
Next
Next
For Each col As DataColumn In dt.Columns
fontColor.Color = BaseColor.WHITE
cellCol.Phrase = New Phrase(col.ToString, New Font(fontColor))
cellCol.BackgroundColor = New BaseColor(127, 127, 127)
table.AddCell(cellCol)
Next
For Each row As DataRow In dt.Rows
For Each strCol As DataColumn In dt.Columns
cellRow.Phrase = New Phrase(row.Item(strCol).ToString)
cellRow.Top = 0
cellRow.Border = 1
table.AddCell(cellRow)
Next
Next
PdfWriter.GetInstance(pdfDoc, Response.OutputStream)
pdfDoc.Open()
pdfDoc.Add(imgHeader)
pdfDoc.Add(tableFilter)
pdfDoc.Add(New Phrase(Environment.NewLine))
pdfDoc.Add(table)
pdfDoc.Close()
End Sub
Alguém tem idéia de como posso fazer isso? Já defini as tabelas com largura de 100% com o comando "WidthPercentage = 100", mas preciso que a coluna "Action" seja um pouco mais larga como mostro na imagem: http://img217.imageshack.us/i/imagepost.jpg/
agradeço a atenção,
Bruno
Soeusei62
Curtidas 0
Respostas
Diego Barcelos
29/04/2011
Não sei como é em VB.NET, mas o itextsharp no C# eu utilizei num boleto bancario em PDF
PdfPCell cell = new PdfPCell();
//Altura Fixa da Célulacell.FixedHeight = 72f;
//Mesclar celulas cell.Colspan = 5;
//Largura da célula
acho que deve sercell.FixedWidth = 72f;
Existe um livro que me ajudou muito que é específico desta biblioteca.
iTextSharp in Action.
Espero ter ajudado, qualquer coisa só entrar em contato.
PdfPCell cell = new PdfPCell();
//Altura Fixa da Célulacell.FixedHeight = 72f;
//Mesclar celulas cell.Colspan = 5;
//Largura da célula
acho que deve sercell.FixedWidth = 72f;
Existe um livro que me ajudou muito que é específico desta biblioteca.
iTextSharp in Action.
Espero ter ajudado, qualquer coisa só entrar em contato.
GOSTEI 0
Soeusei62
29/04/2011
A propriedade cell.FixedHeight existe mas o cell.FixedWidth não.
GOSTEI 0
Welington Borges
29/04/2011
Boa tarde! sei que seu post é antigo mais tive o mesmo problema com o tamanho das colunas
quando exportava o datagrid para pdf
criei um método para resolver da seguinte maneira
Primeiramente importe para classe:
Imports System.IO
Imports iTextSharp.text.pdf
Imports iTextSharp.text
Imports iTextSharp.text.BaseColor
Em seguida declare o Método:
'Metodo que exporta o DataGrid para Arquivo PDF recebe como parametros o datagrid a se exportado e o local onde o mesmo será armazenado
Public Shared Sub ExportaPDF(ByVal DataGridView As DataGridView, ByVal LocalArquivo As String)
'Criando iTextSharp tabela a partir dos dados DataTable
Dim pdfTable As New PdfPTable(DataGridView.ColumnCount)
'Define algumas propriedades para a tabela
pdfTable.DefaultCell.Padding = 3
pdfTable.HorizontalAlignment = Element.ALIGN_LEFT
pdfTable.DefaultCell.BorderWidth = 1
'Verificando total de colunas ( obs o -1 foi para ajutas a qtd de colunas da grid )
Dim TotalColunas = DataGridView.ColumnCount - 1
'Declarando um vetor para armazenasr o tamanho das colunas
Dim DimensaoWidth(TotalColunas) As Integer
'Adicionando linha de cabeçalho
For Each column As DataGridViewColumn In DataGridView.Columns
Dim cell As New PdfPCell(New Phrase(column.HeaderText))
cell.BackgroundColor = New iTextSharp.text.BaseColor(240, 240, 240)
pdfTable.AddCell(cell)
'Variável recebe a posicao da coluna
Dim Posicao = column.Index
'Vetor que armazena a posição juntamente com o tamanho daquela coluna (obs o + 5 foi para ajustar to tamanho)
DimensaoWidth(Posicao) = (column.Width + 5)
Next
' Adicionando as informaçoes da linha
For Each row As DataGridViewRow In DataGridView.Rows
For Each cell As DataGridViewCell In row.Cells
pdfTable.AddCell(cell.Value.ToString())
Next
Next
'Neste momento é definido as dimensões para cada coluna
pdfTable.SetWidths(DimensaoWidth)
'Exporting to PDF
Dim folderPath As String = LocalArquivo
'If Not Directory.Exists(folderPath) Then
'Directory.CreateDirectory(folderPath)
'End If
Using stream As New FileStream(folderPath, FileMode.Create)
Dim pdfDoc As New Document(PageSize.A2, 10.0F, 10.0F, 10.0F, 0.0F)
PdfWriter.GetInstance(pdfDoc, stream)
pdfDoc.Open()
pdfDoc.Add(pdfTable)
pdfDoc.Close()
stream.Close()
End Using
Dim RespostaPergunta = MessageBox.Show("Exportado com sucesso!" + vbCrLf + vbCrLf + "Deseja abrir o local do arquivo??", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
If RespostaPergunta = Windows.Forms.DialogResult.Yes Then
Dim Local = System.AppDomain.CurrentDomain.BaseDirectory() + "ArqPDF"
Process.Start(Local)
End If
End Sub
quando exportava o datagrid para pdf
criei um método para resolver da seguinte maneira
Primeiramente importe para classe:
Imports System.IO
Imports iTextSharp.text.pdf
Imports iTextSharp.text
Imports iTextSharp.text.BaseColor
Em seguida declare o Método:
'Metodo que exporta o DataGrid para Arquivo PDF recebe como parametros o datagrid a se exportado e o local onde o mesmo será armazenado
Public Shared Sub ExportaPDF(ByVal DataGridView As DataGridView, ByVal LocalArquivo As String)
'Criando iTextSharp tabela a partir dos dados DataTable
Dim pdfTable As New PdfPTable(DataGridView.ColumnCount)
'Define algumas propriedades para a tabela
pdfTable.DefaultCell.Padding = 3
pdfTable.HorizontalAlignment = Element.ALIGN_LEFT
pdfTable.DefaultCell.BorderWidth = 1
'Verificando total de colunas ( obs o -1 foi para ajutas a qtd de colunas da grid )
Dim TotalColunas = DataGridView.ColumnCount - 1
'Declarando um vetor para armazenasr o tamanho das colunas
Dim DimensaoWidth(TotalColunas) As Integer
'Adicionando linha de cabeçalho
For Each column As DataGridViewColumn In DataGridView.Columns
Dim cell As New PdfPCell(New Phrase(column.HeaderText))
cell.BackgroundColor = New iTextSharp.text.BaseColor(240, 240, 240)
pdfTable.AddCell(cell)
'Variável recebe a posicao da coluna
Dim Posicao = column.Index
'Vetor que armazena a posição juntamente com o tamanho daquela coluna (obs o + 5 foi para ajustar to tamanho)
DimensaoWidth(Posicao) = (column.Width + 5)
Next
' Adicionando as informaçoes da linha
For Each row As DataGridViewRow In DataGridView.Rows
For Each cell As DataGridViewCell In row.Cells
pdfTable.AddCell(cell.Value.ToString())
Next
Next
'Neste momento é definido as dimensões para cada coluna
pdfTable.SetWidths(DimensaoWidth)
'Exporting to PDF
Dim folderPath As String = LocalArquivo
'If Not Directory.Exists(folderPath) Then
'Directory.CreateDirectory(folderPath)
'End If
Using stream As New FileStream(folderPath, FileMode.Create)
Dim pdfDoc As New Document(PageSize.A2, 10.0F, 10.0F, 10.0F, 0.0F)
PdfWriter.GetInstance(pdfDoc, stream)
pdfDoc.Open()
pdfDoc.Add(pdfTable)
pdfDoc.Close()
stream.Close()
End Using
Dim RespostaPergunta = MessageBox.Show("Exportado com sucesso!" + vbCrLf + vbCrLf + "Deseja abrir o local do arquivo??", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
If RespostaPergunta = Windows.Forms.DialogResult.Yes Then
Dim Local = System.AppDomain.CurrentDomain.BaseDirectory() + "ArqPDF"
Process.Start(Local)
End If
End Sub
GOSTEI 0