Управление шириной и высотой строк и ячеек в iTextSharp

1

Я использовал следующий код для заполнения PdfPTable:

  public PdfPTable GetTable(List<hsp_Narudzbe_IzdavanjeFakture4_Result> proizvodi)
    {
        PdfPTable table = new PdfPTable(5);
        table.WidthPercentage = 100F;
        table.DefaultCell.UseAscender = true;
        table.DefaultCell.UseDescender = true;
        Font f = new Font(Font.FontFamily.HELVETICA, 13);
        f.Color = BaseColor.WHITE;
        PdfPCell cell = new PdfPCell(new Phrase("Stavke narudžbe: ", f));
        cell.BackgroundColor = BaseColor.BLACK;
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        cell.Colspan = 5;
        table.AddCell(cell);
        for (int i = 0; i < 2; i++)
        {
            table.AddCell("Redni broj");
            table.AddCell("Proizvod");
            table.AddCell("Cijena");
            table.AddCell("Šifra proizvoda");
            table.AddCell("Kolicina");
        }
        table.DefaultCell.BackgroundColor = BaseColor.LIGHT_GRAY;
        table.HeaderRows = 3;
        table.FooterRows = 1;
        int broj = 0;
        table.DeleteLastRow();


        foreach (hsp_Narudzbe_IzdavanjeFakture4_Result p in proizvodi)
        {
            broj++;
            table.AddCell(broj.ToString());
            table.AddCell(p.Naziv);
            table.AddCell(p.Cijena);
            table.AddCell(p.Sifra);
            table.AddCell(p.Kolicina.ToString());
        }
        float[] widths = { 15.00F, 15.00F,15.00F,15.00F};
        table.GetRow(1).SetWidths(widths);


        return table;
    }

Маленькое объяснение кода:

broj++; представляет номер строки, которая увеличивается при каждом добавлении новой строки. Таким образом, я получаю номер для каждой строки.

Теперь мой вопрос: как я могу манипулировать шириной первого столбца (который представляет номер строки). Я пробовал следующий код:

float[] widths = { 15.00F, 15.00F,15.00F,15.00F};
table.GetRow(1).SetWidths(widths);

Может ли кто-нибудь помочь мне с этим?

  • 0
    Ширина столбцов определяется для всей таблицы . Вы не можете и не должны изменять ширину столбца на уровне одной строки. Пожалуйста, перефразируйте ваш вопрос, чтобы мы лучше поняли природу вашего вопроса. Чего ты хочешь достичь? Может быть, вы хотите вложить таблицу в ячейку, которая охватывает все столбцы ...
  • 0
    Ну, во-первых, я бы хотел, чтобы текст в ячейках был в центре ячеек, а не на левой стороне, как сейчас. Во-вторых, я хотел бы, чтобы первая строка имела самую низкую ширину, потому что каждая ячейка в ней содержит только число (1,2,3,4 ...), остальные ячейки в 2,3,4 и 5-й строке содержат текст (и они должен иметь большую ширину). Я надеюсь, что перефразировал вопрос, чтобы вы могли понять его сейчас. PS Я не могу отблагодарить вас за вчерашний ответ на мой вопрос, вы, сэр, гений :)!
Показать ещё 3 комментария
Теги:
width
height
itextsharp

2 ответа

4
Лучший ответ

Объединив ваш оригинальный пост и ваш комментарий, я вижу два вопроса:

  1. Вы хотите создать таблицу, в которой первый столбец не так широк, как другие столбцы.
  2. Вы хотите, чтобы содержимое этих столбцов выравнивалось по центру.

Я написал небольшой образец с именем ColumnWidthExample, который должен привести к такому PDF:

Изображение 174551

Это код Java, который создает этот PDF файл:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document(PageSize.A4.rotate());
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    float[] columnWidths = {1, 5, 5};
    PdfPTable table = new PdfPTable(columnWidths);
    table.setWidthPercentage(100);
    table.getDefaultCell().setUseAscender(true);
    table.getDefaultCell().setUseDescender(true);
    Font f = new Font(FontFamily.HELVETICA, 13, Font.NORMAL, GrayColor.GRAYWHITE);
    PdfPCell cell = new PdfPCell(new Phrase("This is a header", f));
    cell.setBackgroundColor(GrayColor.GRAYBLACK);
    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
    cell.setColspan(3);
    table.addCell(cell);
    table.getDefaultCell().setBackgroundColor(new GrayColor(0.75f));
    for (int i = 0; i < 2; i++) {
        table.addCell("#");
        table.addCell("Key");
        table.addCell("Value");
    }
    table.setHeaderRows(3);
    table.setFooterRows(1);
    table.getDefaultCell().setBackgroundColor(GrayColor.GRAYWHITE);
    table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
    for (int counter = 1; counter < 101; counter++) {
        table.addCell(String.valueOf(counter));
        table.addCell("key " + counter);
        table.addCell("value " + counter);
    }
    document.add(table);
    document.close();
}

Достаточно просто адаптировать этот код к С#.

Первая проблема решена путем определения ширины столбцов на уровне таблицы. Например, как это (есть другие способы получить тот же результат):

float[] columnWidths = {1, 5, 5};
PdfPTable table = new PdfPTable(columnWidths);

Значения 1, 5 и 5 не являются абсолютной шириной. Поскольку мы определяем ширину таблицы как 100% доступной ширины в пределах поля страницы, iText будет разделять доступную ширину на 11 (1 + 5 + 5), а первая колонка будет измерять 1 раз это значение, тогда как столбец два и три будут измерять в 5 раз больше этого значения.

Ваша вторая проблема может быть решена путем изменения горизонтального выравнивания. Если вы работаете с явным объектом PdfPCell, вам нужно изменить значение на уровне ячейки, как это делается в следующей строке:

cell.setHorizontalAlignment(Element.ALIGN_CENTER);

Если вы оставите его в iText для создания объекта PdfPCell, вам необходимо изменить выравнивание на уровне ячейки по умолчанию:

table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);

Обратите внимание, что свойства ячейки по умолчанию не применяются при добавлении объекта PdfPCell в таблицу. В этом случае используются свойства этого PdfPCell.

  • 0
    Спасибо, спасибо, спасибо, сэр! : D Работает отлично <3: D
  • 0
    Спасибо, что приняли мой ответ!
Показать ещё 1 комментарий
0

Хорошо, поэтому мне удалось центрировать текст ячейки в каждом столбце, теперь я просто не могу понять, как сделать первую строку наименьшей шириной...

Вот код

public PdfPTable GetTable(List<hsp_Narudzbe_IzdavanjeFakture4_Result> proizvodi)
    {
        PdfPTable table = new PdfPTable(5);
        table.WidthPercentage = 100F;
        table.DefaultCell.UseAscender = true;
        table.DefaultCell.UseDescender = true;
        Font f = new Font(Font.FontFamily.HELVETICA, 13);
        f.Color = BaseColor.WHITE;
        PdfPCell cell = new PdfPCell(new Phrase("Stavke narudžbe: ", f));
        cell.BackgroundColor = BaseColor.BLACK;
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        cell.Colspan = 5;
        table.AddCell(cell);
        for (int i = 0; i < 2; i++)
        {
            table.AddCell(new PdfPCell(new Phrase("Redni broj"))
                {
                    VerticalAlignment = Element.ALIGN_MIDDLE,
                    HorizontalAlignment = Element.ALIGN_CENTER,
                    BackgroundColor = BaseColor.LIGHT_GRAY
                });
            table.AddCell(new PdfPCell(new Phrase("Proizvod"))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER,
                BackgroundColor = BaseColor.LIGHT_GRAY
            });
            table.AddCell(new PdfPCell(new Phrase("Cijena"))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER,
                BackgroundColor = BaseColor.LIGHT_GRAY
            });
            table.AddCell(new PdfPCell(new Phrase("Šifra"))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER,
                BackgroundColor = BaseColor.LIGHT_GRAY
            });
            table.AddCell(new PdfPCell(new Phrase("Kolicina"))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER,
                BackgroundColor = BaseColor.LIGHT_GRAY
            });
        }
        table.DefaultCell.BackgroundColor = BaseColor.LIGHT_GRAY;
        table.HeaderRows = 3;
        table.FooterRows = 1;
        int broj = 0;
        table.DeleteLastRow();
        foreach (hsp_Narudzbe_IzdavanjeFakture4_Result p in proizvodi)
        {
            broj++;
            table.AddCell(new PdfPCell(new Phrase(broj.ToString()))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER

            });
            table.AddCell(new PdfPCell(new Phrase(p.Naziv))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER
            });
            table.AddCell(new PdfPCell(new Phrase(p.Cijena))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER
            });
            table.AddCell(new PdfPCell(new Phrase(p.Sifra))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER
            });
            table.AddCell(new PdfPCell(new Phrase(p.Kolicina.ToString()))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER
            });
        }



        return table;
    }

Может ли кто-нибудь помочь мне разобраться, как установить ширину каждой строки в нестандартный размер?

Благодаря !

  • 0
    Вы перестарались ;-) Пожалуйста, посмотрите на мой пример. Если вы позволите iText создать PdfPCell , вы можете установить выравнивание и цвет для ячейки по умолчанию.
  • 0
    Я сэр, я принял ваш ответ :). Еще раз спасибо!! : D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню