Agregar datos de la base de datos a PDF en C#

Las bases de datos están en casi todas partes para almacenar y administrar los datos. Es una práctica común de los programadores recuperar los datos de las bases de datos y cargarlos en las aplicaciones. Al generar archivos PDF mediante programación, es posible que sea necesario completar el documento con los datos de la base de datos. Para lograr eso en las aplicaciones .NET, este artículo muestra cómo agregar datos de la base de datos a archivos PDF en C#.

C# .NET API para agregar datos de la base de datos a PDF

Usaremos Aspose.PDF for .NET para agregar datos de la base de datos a archivos PDF. Es una popular API de generación y manipulación de PDF que le permite crear archivos PDF de diseños simples y complejos sin problemas. Puede descargar los archivos binarios de la API o instalarlos mediante NuGet.

PM> Install-Package Aspose.PDF

Agregar datos de la base de datos a PDF en C#

En la mayoría de los casos, los datos se obtienen de una tabla de base de datos en un DataTable o DataView. Por lo tanto, para demostración, usaremos un DataTable para agregar datos a un archivo PDF. Para simplificar las cosas, crearemos y completaremos DataTable mediante programación sin usar una base de datos. Los siguientes son los pasos para agregar datos a un archivo PDF desde la base de datos en C#.

El siguiente ejemplo de código muestra cómo importar datos de la base de datos a PDF en C#.

// Obtener datos de la base de datos a 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));

// Agregue 2 filas en el objeto DataTable mediante programación
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);

// Crear instancia de documento
Document doc = new Document();
doc.Pages.Add();

// Inicializa una nueva instancia de la tabla.
Aspose.Pdf.Table table = new Aspose.Pdf.Table();

// Establecer anchos de columna de la tabla
table.ColumnWidths = "40 100 100 100";

// Establezca el color del borde de la tabla como LightGray
table.Border = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, .5f, Aspose.Pdf.Color.FromRgb(System.Drawing.Color.LightGray));

// Establecer el borde de las celdas de la tabla
table.DefaultCellBorder = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, .5f, Aspose.Pdf.Color.FromRgb(System.Drawing.Color.LightGray));

// Datos de importacion
table.ImportDataTable(dt, true, 0, 1, 3, 3);

// Agregar objeto de tabla a la primera página del documento de entrada
doc.Pages[1].Paragraphs.Add(table);

// Guardar documento actualizado que contiene objeto de tabla
doc.Save("output.pdf");

El siguiente es el resultado del ejemplo de código anterior.

Agregar datos de la base de datos a PDF en C#

Agregar datos de la base de datos a PDF en Entity Framework

En estos días, los desarrolladores utilizan comúnmente Entity Framework (EF). Por lo tanto, sería útil ampliar la clase Table para completar documentos PDF con listas o datos agrupados en EF. La siguiente es la implementación de cómo llenar una tabla PDF usando una lista y datos agrupados. En ambos métodos, la tabla y los datos se pasan como argumentos del 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)
        {
            // Agregar fila a la tabla
            var row = table.Rows.Add();
            // Agregar celdas de tabla
            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)
        {
            // Agregar fila de grupo a la tabla
            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)
            {
                // Agregar fila de datos a la tabla
                var dataRow = table.Rows.Add();
                // Agregar celdas
                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;
}

Obtenga una licencia gratis

Puede obtener una licencia temporal gratuita para usar Aspose.PDF for .NET sin limitaciones de evaluación.

Conclusión

En este artículo, aprendió cómo agregar datos de la base de datos a archivos PDF en C#. Ha visto cómo importar datos de un DataTable a una tabla en un archivo PDF. Además, hemos cubierto la implementación de la importación de datos en PDF utilizando Entity Framework. Además, puede explorar más sobre la API de PDF de C# utilizando la documentación. En caso de que tenga alguna pregunta o consulta, puede contactarnos a través de nuestro foro.

Ver también