Добавить данные из базы данных в PDF на С#

Базы данных почти везде используются для хранения и управления данными. Программисты обычно извлекают данные из баз данных и загружают их в приложения. При программном создании файлов PDF может потребоваться заполнить документ данными из базы данных. Чтобы добиться этого в приложениях .NET, в этой статье показано, как добавлять данные из базы данных в файлы PDF на C#.

С# .NET API для добавления данных из базы данных в PDF

Мы будем использовать Aspose.PDF для .NET для добавления данных из базы данных в файлы PDF. Это популярный API для создания и обработки PDF-файлов, который позволяет легко создавать PDF-файлы с простыми и сложными макетами. Вы можете либо скачать бинарные файлы API, либо установить его с помощью NuGet.

PM> Install-Package Aspose.PDF

Добавить данные из базы данных в PDF на С#

В большинстве случаев данные извлекаются из таблицы базы данных в DataTable или DataView. Поэтому для демонстрации мы будем использовать DataTable для добавления данных в файл PDF. Для простоты мы создадим и заполним DataTable программно, без использования базы данных. Ниже приведены шаги для добавления данных в файл PDF из базы данных на C#.

  • Загрузите данные в DataTable из базы данных.
  • Создайте новый PDF-файл или загрузите существующий, используя класс Document.
  • Создайте экземпляр класса Table и задайте его свойства, т.е. ширину столбца, границы и т. д.
  • Импортируйте данные из базы данных в таблицу PDF с помощью метода Table.ImportDataTable().
  • Добавьте таблицу на страницу методом Document.Pages[index].Paragraphs.Add(Table).
  • Сохраните файл PDF, используя метод Document.Save(string).

В следующем примере кода показано, как импортировать данные из базы данных в PDF на C#.

// Получить данные из базы данных в 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));

// Добавить 2 строки в объект DataTable программно
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);

// Создать экземпляр документа
Document doc = new Document();
doc.Pages.Add();

// Инициализирует новый экземпляр таблицы
Aspose.Pdf.Table table = new Aspose.Pdf.Table();

// Установить ширину столбцов таблицы
table.ColumnWidths = "40 100 100 100";

// Установите цвет границы таблицы как LightGray
table.Border = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, .5f, Aspose.Pdf.Color.FromRgb(System.Drawing.Color.LightGray));

// Установите границу для ячеек таблицы
table.DefaultCellBorder = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, .5f, Aspose.Pdf.Color.FromRgb(System.Drawing.Color.LightGray));

// Импорт данных
table.ImportDataTable(dt, true, 0, 1, 3, 3);

// Добавить табличный объект на первую страницу входного документа
doc.Pages[1].Paragraphs.Add(table);

// Сохранить обновленный документ, содержащий табличный объект
doc.Save("output.pdf");

Ниже приведен вывод приведенного выше примера кода.

Добавить данные из базы данных в PDF на С#

Добавить данные из базы данных в PDF в Entity Framework

В наши дни Entity Framework (EF) широко используется разработчиками. Поэтому было бы удобно расширить класс Table для заполнения документов PDF списками или сгруппированными данными в EF. Ниже приведена реализация того, как заполнить таблицу PDF с помощью списка и сгруппированных данных. В обоих методах таблица и данные передаются в качестве аргументов метода.

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)
        {
            // Добавить строку в таблицу
            var row = table.Rows.Add();
            // Добавить ячейки таблицы
            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)
        {
            // Добавить строку группы в таблицу
            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)
            {
                // Добавить строку данных в таблицу
                var dataRow = table.Rows.Add();
                // Добавить ячейки
                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;
}

Получить бесплатную лицензию

Вы можете получить бесплатную временную лицензию, чтобы использовать Aspose.PDF для .NET без ограничений на пробную версию.

Вывод

В этой статье вы узнали, как добавлять данные из базы данных в файлы PDF на C#. Вы видели, как импортировать данные из DataTable в таблицу в файле PDF. Кроме того, мы рассмотрели реализацию импорта данных в PDF с помощью Entity Framework. Кроме того, вы можете узнать больше о C# PDF API, используя документацию. Если у вас возникнут какие-либо вопросы или вопросы, вы можете связаться с нами через наш форум.

Смотрите также