Как вставить таблицу в документ PDF с помощью iTextSharp?

Я хочу вставить таблицу в свой существующий документ PDF.

Я следил за сообщением о вставке изображения в PDF, но при попытке добавить таблицу получаю ошибку исключения нулевой ссылки.

Вот мой текущий код

public static byte[] InsertTable(byte[] pdf, DataTable dt, int pageNum, int x, int y, int columns, int rows, int[] columnWidths, float rowHeight)
{
    using (var inputPDF = new MemoryStream(pdf))
    using (var outputPDF = new MemoryStream())
    {
        var reader = new PdfReader(inputPDF);
        var stamper = new PdfStamper(reader, outputPDF);
        var pdfContentByte = stamper.GetOverContent(pageNum);


        Table t = new Table(columns, rows);
        t.SetWidths(columnWidths);

        foreach (DataRow dr in dt.Rows)
            foreach (object o in dr.ItemArray)
            {
                Cell c = new Cell();
                c.Add(new Chunk(o.ToString()));
                t.AddCell(c);
            }
        pdfContentByte.PdfDocument.Add(t);
        pdfContentByte.PdfDocument.Close();
        return outputPDF.ToArray();
    }
}

person Biff MaGriff    schedule 22.02.2011    source источник
comment
Null reference exception на что: pdfContentByte, pdfContentByte.PdfDocument или таблицу? Не могли бы вы опубликовать исключение (стек)?   -  person Nimrod    schedule 22.02.2011
comment
@Nimrod Исключение всплывает из вызова .Add().   -  person Biff MaGriff    schedule 22.02.2011
comment
поставьте точку останова в операторе и посмотрите, в порядке ли PdFDocument из pdfContentByte до вызова Add (я полагаю, что это так, но просто чтобы быть уверенным)   -  person Maverik    schedule 22.02.2011
comment
Да, сами объекты существуют, но всплывает нулевая ссылка. Возможно, мне стоит обновить свою библиотеку.   -  person Biff MaGriff    schedule 22.02.2011


Ответы (2)


Хотя код выглядит нормально, я немного смущен вашей строкой

Table t = new Table(columns, rows);

Вы уверены, что хотите именно этого, а не PdfPTable. Все остальное в вашем коде, кажется, использует PdfPTable, и я не смог найти простой Table в iTextSharp.

И по совпадению, я сейчас работаю над очень похожей вещью.

ИЗМЕНИТЬ измененный код

Я также очистил поля, которые больше не используются:

public static byte[] InsertTable(byte[] buffer, DataTable dt, int columns, float[] columnWidths)
    {
        using (MemoryStream inputPDF = new MemoryStream(buffer))
        using (MemoryStream outputPDF = new MemoryStream())
        {
            PdfReader reader = new PdfReader(inputPDF);
            iTextSharp.text.Document doc = new iTextSharp.text.Document();
            PdfWriter write = PdfWriter.GetInstance(doc, outputPDF);
            doc.Open();

            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                doc.NewPage();
                write.DirectContent.AddTemplate(write.GetImportedPage(reader, i), 1f, 0, 0, 1, 0, 0);
            }

            //adding my table
            PdfPTable t = new PdfPTable(columns);
            t.SetTotalWidth(columnWidths);

            foreach (DataRow dr in dt.Rows)
                foreach (object o in dr.ItemArray)
                {
                    PdfPCell c = new PdfPCell();
                    c.AddElement(new Chunk(o.ToString()));
                    t.AddCell(c);
                }

            doc.NewPage();

            doc.Add(t);
            doc.Close();
            write.Close();
            reader.Close();
            return outputPDF.ToArray();
        }
    }

Надеюсь, это решит вашу проблему. Я буду в сети следующие шесть часов и постараюсь следить за этим, пока не вернусь домой :)

person Maverik    schedule 22.02.2011
comment
Таблица, которую я использую, находится под iTextSharp.Text.Table - person Biff MaGriff; 22.02.2011
comment
Я думаю, мы используем разные версии. Я использую версию 5.0.6 dll iTextSharp, и нет пространства имен Table in Text (iTextSharp.text). - person Maverik; 22.02.2011
comment
Ха-ха, да, я использую версию 4.1.6. Я переключаюсь на класс PdfTable. Я дам вам знать, как это происходит. - person Biff MaGriff; 22.02.2011
comment
Спасибо, Маверик, я собираюсь пересмотреть это через несколько дней. Сейчас я в другом городе, работаю над другим проектом. Я хочу наложить свою таблицу, поэтому я переместил свой код построения таблицы в цикл новой страницы. Теперь мне просто нужно выяснить, как правильно его расположить. Спасибо еще раз за помощь! - person Biff MaGriff; 23.02.2011

Хорошо, я обновился до 5.0.6 И у меня вставлена ​​таблица. Однако сейчас все отображается на первой странице.

public static byte[] InsertTable(byte[] pdf, DataTable dt, int pageNum, float x, float y, int columns, int rows, float[] columnWidths, float rowHeight)
{
    using (var inputPDF = new MemoryStream(pdf))
    using (var outputPDF = new MemoryStream())
    {
        //loading existing
        var reader = new PdfReader(inputPDF);
        Document doc = new Document();
        PdfWriter write = PdfWriter.GetInstance(doc, outputPDF);
        doc.Open();
        PdfContentByte canvas = write.DirectContent;
        PdfImportedPage page;
        for (int i = 1; i <= reader.NumberOfPages; i++) {
            page = write.GetImportedPage(reader, i);
            canvas.AddTemplate(page, 1f, 0, 0, 1, 0, 0);
        }

        //adding my table
        PdfPTable t = new PdfPTable(columns);
        t.SetTotalWidth(columnWidths);

        foreach (DataRow dr in dt.Rows)
            foreach (object o in dr.ItemArray)
            {
                PdfPCell c = new PdfPCell();
                c.AddElement(new Chunk(o.ToString()));
                t.AddCell(c);
            }
        doc.Add(t);
        doc.Close();
        return outputPDF.ToArray();
    }
}
person Biff MaGriff    schedule 22.02.2011
comment
Где вы хотите разместить таблицу? В конце существующего документа я предполагаю? - person Maverik; 23.02.2011
comment
Выпил утренний кофе, и теперь я понимаю, что вы имеете в виду! Вам не хватает Doc.NewPage() (и соответствующего DirectContent), поэтому в конечном итоге вы снова и снова пишете один и тот же контент и, следовательно, результат. Я изменил ваш код и протестировал свое собственное приложение; кажется, работает сейчас. Новый код добавлен в мой исходный пост. - person Maverik; 23.02.2011
comment
На самом деле я хочу расположить его точно над существующей таблицей. - person Biff MaGriff; 23.02.2011