Adicionar dados do banco de dados ao PDF em C#

Os bancos de dados estão em quase todos os lugares para armazenar e gerenciar os dados. É uma prática comum dos programadores recuperar os dados dos bancos de dados e carregá-los nos aplicativos. Ao gerar arquivos PDF programaticamente, pode ser necessário preencher o documento com os dados do banco de dados. Para fazer isso em aplicativos .NET, este artigo mostra como adicionar dados do banco de dados a arquivos PDF em C#.

API C# .NET para adicionar dados do banco de dados ao PDF

Usaremos Aspose.PDF for .NET para adicionar dados do banco de dados aos arquivos PDF. É uma API popular de geração e manipulação de PDF que permite criar arquivos PDF de layouts simples e complexos sem problemas. Você pode baixar os binários da API ou instalá-la usando NuGet.

PM> Install-Package Aspose.PDF

Adicionar dados do banco de dados ao PDF em C#

Na maioria dos casos, os dados são buscados de uma tabela de banco de dados em um DataTable ou DataView. Portanto, para demonstração, usaremos uma DataTable para adicionar dados a um arquivo PDF. Para manter as coisas mais simples, vamos criar e preencher o DataTable programaticamente sem usar um banco de dados. A seguir estão as etapas para adicionar dados a um arquivo PDF do banco de dados em C#.

O exemplo de código a seguir mostra como importar dados do banco de dados para PDF em C#.

// Obter dados do banco de dados para DataTable
DataTable dt = new DataTable("Employee");
dt.Columns.Add("Employee_ID", typeof(Int32));
dt.Columns.Add("Employee_Name", typeof(string));
dt.Columns.Add("Gender", typeof(string));

// Adicione 2 linhas ao objeto DataTable programaticamente
DataRow dr = dt.NewRow();
dr[0] = 1;
dr[1] = "John Smith";
dr[2] = "Male";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 2;
dr[1] = "Mary Miller";
dr[2] = "Female";
dt.Rows.Add(dr);

// Criar instância de documento
Document doc = new Document();
doc.Pages.Add();

// Inicializa uma nova instância da Tabela
Aspose.Pdf.Table table = new Aspose.Pdf.Table();

// Definir larguras de coluna da tabela
table.ColumnWidths = "40 100 100 100";

// Defina a cor da borda da tabela como LightGray
table.Border = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, .5f, Aspose.Pdf.Color.FromRgb(System.Drawing.Color.LightGray));

// Definir a borda das células da tabela
table.DefaultCellBorder = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, .5f, Aspose.Pdf.Color.FromRgb(System.Drawing.Color.LightGray));

// Importar dados
table.ImportDataTable(dt, true, 0, 1, 3, 3);

// Adicionar objeto de tabela à primeira página do documento de entrada
doc.Pages[1].Paragraphs.Add(table);

// Salvar documento atualizado contendo objeto de tabela
doc.Save("output.pdf");

A seguir está a saída do exemplo de código acima.

Adicionar dados do banco de dados ao PDF em C#

Adicionar dados do banco de dados ao PDF no Entity Framework

Atualmente, o Entity Framework (EF) está sendo comumente usado pelos desenvolvedores. Portanto, seria útil estender a classe Table para preencher documentos PDF com listas ou dados agrupados no EF. Veja a seguir a implementação de como preencher uma tabela PDF usando uma lista e dados agrupados. Em ambos os métodos, a Tabela e os dados são passados como argumentos do método.

public static class PdfHelper
{
    public static void ImportEntityList<TSource>(this Pdf.Table table, IList<TSource> data)
    {
        var headRow = table.Rows.Add();

        var props = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var prop in props)
        {
            headRow.Cells.Add(prop.GetCustomAttribute(typeof(DisplayAttribute)) is DisplayAttribute dd ? dd.Name : prop.Name);
        }

        foreach (var item in data)
        {
            // Adicionar linha à tabela
            var row = table.Rows.Add();
            // Adicionar células de tabela
            foreach (var t in props)
            {
                var dataItem = t.GetValue(item, null);
                if (t.GetCustomAttribute(typeof(DataTypeAttribute)) is DataTypeAttribute dataType)
                    switch (dataType.DataType)
                    {

                        case DataType.Currency:
                            row.Cells.Add(string.Format("{0:C}", dataItem));
                            break;
                        case DataType.Date:
                            var dateTime = (DateTime)dataItem;
                            if (t.GetCustomAttribute(typeof(DisplayFormatAttribute)) is DisplayFormatAttribute df)
                            {
                                row.Cells.Add(string.IsNullOrEmpty(df.DataFormatString)
                                    ? dateTime.ToShortDateString()
                                    : string.Format(df.DataFormatString, dateTime));
                            }
                            break;
                        default:
                            row.Cells.Add(dataItem.ToString());
                            break;
                    }
                else
                {
                    row.Cells.Add(dataItem.ToString());
                }
            }
        }
    }
    public static void ImportGroupedData<TKey,TValue>(this Pdf.Table table, IEnumerable<Models.GroupViewModel<TKey, TValue>> groupedData)
    {
        var headRow = table.Rows.Add();           
        var props = typeof(TValue).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var prop in props)
        {
           headRow.Cells.Add(prop.GetCustomAttribute(typeof(DisplayAttribute)) is DisplayAttribute dd ? dd.Name : prop.Name);               
        }

        foreach (var group in groupedData)
        {
            // Adicionar linha de grupo à tabela
            var row = table.Rows.Add();
            var cell = row.Cells.Add(group.Key.ToString());
            cell.ColSpan = props.Length;
            cell.BackgroundColor = Pdf.Color.DarkGray;
            cell.DefaultCellTextState.ForegroundColor = Pdf.Color.White;

            foreach (var item in group.Values)
            {
                // Adicionar linha de dados à tabela
                var dataRow = table.Rows.Add();
                // Adicionar células
                foreach (var t in props)
                {
                    var dataItem = t.GetValue(item, null);

                    if (t.GetCustomAttribute(typeof(DataTypeAttribute)) is DataTypeAttribute dataType)
                        switch (dataType.DataType)
                        {
                            case DataType.Currency:
                                dataRow.Cells.Add(string.Format("{0:C}", dataItem));
                                break;
                            case DataType.Date:
                                var dateTime = (DateTime)dataItem;
                                if (t.GetCustomAttribute(typeof(DisplayFormatAttribute)) is DisplayFormatAttribute df)
                                {
                                    dataRow.Cells.Add(string.IsNullOrEmpty(df.DataFormatString)
                                        ? dateTime.ToShortDateString()
                                        : string.Format(df.DataFormatString, dateTime));
                                }
                                break;
                            default:
                                dataRow.Cells.Add(dataItem.ToString());
                                break;
                        }
                    else
                    {
                        dataRow.Cells.Add(dataItem.ToString());
                    }
                }
            }
        }
    }
}
public class GroupViewModel<K,T>
{
    public K Key;
    public IEnumerable<T> Values;
}

Obtenha uma licença gratuita

Você pode obter uma licença temporária gratuita para usar o Aspose.PDF para .NET sem limitações de avaliação.

Conclusão

Neste artigo, você aprendeu como adicionar dados do banco de dados em arquivos PDF em C#. Você viu como importar dados de um DataTable para uma tabela em arquivo PDF. Além disso, abordamos a implementação da importação de dados em PDF usando o Entity Framework. Além disso, você pode explorar mais sobre a API C# PDF usando a documentação. Caso você tenha alguma dúvida ou pergunta, você pode entrar em contato conosco através do nosso fórum.

Veja também