Запись таблиц в PDF

Последнее обновление: 05.09.2012

В данной статье мы посмотрим, как сохранять таблицы, в том числе из объекта DataSet, в файл pdf. Итак, для начала создадим обычную базу данных в виде текстового файла (так как это не займет много времени), к которой мы будем затем подключаться и которую будем передавать в объект DataSet. Наша база данных будет представлять обычный текстовый файл под названием Dictionary.txt, содержащий словарь:

Слово, Перевод
Red, Красный
Orange, Оранжевый
Yellow, Желтый
Green, Зеленый
Blue, Синий
Violet, Фиолетовый

Все довольно просто: у нас два столбца, где в качестве разделителя используется запятая. Теперь создадим само приложение. Кинем на форму две кнопки - одну для открытия файла и вывода его в объект DataGridView, а другую - для сохранения в pdf. И добавим объект DataGridView для вывода БД на форму. В итоге это будет выглядеть так (после открытия БД):

Все довольно просто. Теперь самое главное - загрузим и затем добавим в референсы бесплатную библиотеку iTextSharp. Теперь перейдем к коду.

using System;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace CreateTableInPdf
{
    public partial class Form1 : Form
    {
        //Определяем объект DataSet
        DataSet MyDataSet = new DataSet();

        //Имя каталога открываемого файла БД
        string catName = "";
        //Непосредственное имя самого файла БД
        string fileName = "";

Здесь мы определили три глобальных переменных, которые нам понадобятся, и подключили необходимые пространства имен. Теперь перейдем к коду открытия базы данных, который будет содержаться в обработчике события нажатия первой кнопки:

        //Стандартный код открытия базы данных в программе и вывод таблицы в DatagridView
        private void button1_Click(object sender, EventArgs e)
        {
            //Подключение к БД
            //Определяем подключение
            OleDbConnection StrCon;
            //Строка для выборки данных
            string Select1;
            //Создание объекта Command
            OleDbCommand comand1;
            //Определяем объект Adapter для взаимодействия с источником данных
            OleDbDataAdapter adapter1;

            try
            {
                OpenFileDialog ofd =new OpenFileDialog();
                if (ofd.ShowDialog() != DialogResult.Cancel)
                {
                    if (ofd.FileName!=null)
                    {
                        catName = ofd.FileName.Remove(ofd.FileName.LastIndexOf("\"));
                        fileName = ofd.FileName.Remove(0, ofd.FileName.LastIndexOf("\") + 1);
                        Select1 = "SELECT * FROM [" + fileName + "]";
                        //Создаем подключение
                        StrCon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + catName + ";Extended Properties=text");
                        comand1 = new OleDbCommand(Select1, StrCon);
                        adapter1 = new OleDbDataAdapter(comand1);
                        //Открываем подключение
                        StrCon.Open();

                        adapter1.Fill(MyDataSet);
                        //Заполняем обект datagridview для отображения данных на форме
                        dataGridView1.DataSource = MyDataSet.Tables[0];
                        StrCon.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Возникла ошибка : " + ex.Message);
            }
        }

Здесь мы при нажатии на кнопку находим в проводнике наш файл Dictionary.txt и подключаемся к нему. Тепрерь код нажатия на вторую кнопку, где мы будем сохранять таблицу из БД в файл pdf:

	    // Само сохранение в пдф
	    private void button2_Click(object sender, EventArgs e)
        {
            //Объект документа пдф
            iTextSharp.text.Document doc =new iTextSharp.text.Document();

            //Создаем объект записи пдф-документа в файл
            PdfWriter.GetInstance(doc, new FileStream("pdfTables.pdf", FileMode.Create));

            //Открываем документ
            doc.Open();

            //Определение шрифта необходимо для сохранения кириллического текста
            //Иначе мы не увидим кириллический текст
            //Если мы работаем только с англоязычными текстами, то шрифт можно не указывать
            BaseFont baseFont = BaseFont.CreateFont("C:\Windows\Fonts\arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, iTextSharp.text.Font.DEFAULTSIZE, iTextSharp.text.Font.NORMAL);

            //Обход по всем таблицам датасета (хотя в данном случае мы можем опустить
            //Так как в нашей бд только одна таблица)
            for(int i = 0;i< MyDataSet.Tables.Count;i++)
            {
                //Создаем объект таблицы и передаем в нее число столбцов таблицы из нашего датасета
                PdfPTable table =new PdfPTable(MyDataSet.Tables[i].Columns.Count);

                //Добавим в таблицу общий заголовок
                PdfPCell cell = new PdfPCell(new Phrase("БД " + fileName + ", таблица №" + (i + 1), font));

                cell.Colspan = MyDataSet.Tables[i].Columns.Count;
                cell.HorizontalAlignment = 1;
                //Убираем границу первой ячейки, чтобы балы как заголовок
                cell.Border = 0;
                table.AddCell(cell);

                //Сначала добавляем заголовки таблицы
                for(int j = 0; j< MyDataSet.Tables[i].Columns.Count;j++)
                {
                    cell = new PdfPCell(new Phrase(new Phrase(MyDataSet.Tables[i].Columns[j].ColumnName, font)));
                    //Фоновый цвет (необязательно, просто сделаем по красивее)
                    cell.BackgroundColor = iTextSharp.text.BaseColor.LIGHT_GRAY;
                    table.AddCell(cell);
                }

                //Добавляем все остальные ячейки
                for(int j = 0; j< MyDataSet.Tables[i].Rows.Count;j++)
                {
                    for(int k = 0; k< MyDataSet.Tables[i].Columns.Count;k++)
                    {
                        table.AddCell(new Phrase(MyDataSet.Tables[i].Rows[j][k].ToString(), font));
                    }
                }
                //Добавляем таблицу в документ
                doc.Add(table);
            }
            //Закрываем документ
            doc.Close();

            MessageBox.Show("Pdf-документ сохранен");
        }

В данном случае обход таблиц был излишним, так как у нас по сути одна таблица (она же имя файла) - Dictionary. Обход таблиц сделан, чтобы показать, как сохранять все таблицы, если в БД несколько таблиц. Также обратите внимание на определение шрифта. Если у нас нет кириллических символов, нам шрифт использовать необязательно.

После сохранения вы увидите в папке приложения соданный документ pdfTables.pdf, который будет выглядеть примерно так:

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850