Динамический макет строки PDF

#c# #asp.net #pdf #itextsharp #dynamicpdf

#c# #asp.net #PDF #itextsharp #dynamicpdf

Вопрос:

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

Я динамически генерирую PDF-файл в asp.net с помощью c #, и прямо сейчас я просто создаю для него основу. Одна из вещей, которые он генерирует, — это таблица, в которой должно быть отображено содержимое корзины (да, я говорю о счете-фактуре), и я пытаюсь придать таблице некоторый макет, но макет для верхней строки будет отличаться от остальных. (заголовок, в котором определены столбцы (количество, Название, цена за единицу, скидка и итого)

Вот некоторый код (я делаю это впервые, так что не кричите на меня xD)

 PdfPCell Quantity = new PdfPCell(new Phrase("Quantity"));
PdfPCell Title = new PdfPCell(new Phrase("Title"));
PdfPCell UniPr = new PdfPCell(new Phrase("Unit Price"));
PdfPCell Disc = new PdfPCell(new Phrase("Discount"));
PdfPCell Total = new PdfPCell(new Phrase("Total"));
PdfPCell[] cartheaderc = { Quantity, Title, UniPr, Disc, Total };
PdfPRow cartheader = new PdfPRow(cartheaderc);
  

Итак, я попробовал это так, а затем сказал:

 PdfPRow.BackgroundColor = new BaseColor(255,0,0);
  

Поскольку это работает для ячеек, я подумал, что это может иметь смысл, но, видимо, это не так. Я, вероятно, смогу это сделать, когда разберу каждую ячейку на части, но должен быть более простой способ, верно?

Это одна проблема, но, к сожалению, у меня есть еще одна (хотя в 10 раз глупее и в 10 раз проще). Цвет, который я хочу использовать, #c5c5c5, но он не хочет распознавать цветовой код.

Вот список систем для iTextSharp, которые я использую (это помимо стандартных систем из Visual Studio и SQLServer, и нет, я скорее не хочу добавлять больше систем, если это возможно):

 using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
  

Ответ №1:

У вас есть два вопроса:

  1. Вы используете PdfPRow , но вы не должны этого делать. PdfPRow Класс предназначен только для внутреннего использования. Вы должны работать на PdfPCell уровне. Если вы хотите раскрасить полные строки, вы можете сделать это с помощью PdfPTableEvent . Посмотрите, например, цветные строки в alternating.pdf. Они были окрашены в событии AlternatingBackground table.
  2. У вас возникли трудности с созданием цвета #c5c5c5 . Шестнадцатеричное значение C5 равно 197, следовательно, вы хотите создать следующий цветной объект: new BaseColor(197, 197, 197);

Ваша главная ошибка заключается в том, что вы создаете a PdfPRow , добавляя массив PdfPCell объектов. Где вы черпали вдохновение для этого? Если вы найдете кого-то, кто написал такой пример, пожалуйста, дайте мне знать, и если он рядом, я лично отшлепаю его 😉

Таблицы создаются следующим образом:

 PdfPTable table = new PdfPTable(5);
PdfPCell Quantity = new PdfPCell(new Phrase("Quantity"));
table.AddCell(Quantity);
PdfPCell Title = new PdfPCell(new Phrase("Title"));
table.AddCell(Title);
PdfPCell UniPr = new PdfPCell(new Phrase("Unit Price"));
table.AddCell(UniPr);
PdfPCell Disc = new PdfPCell(new Phrase("Discount"));
table.AddCell(Disc);
PdfPCell Total = new PdfPCell(new Phrase("Total"));
table.AddCell(Total);
  

Есть еще более простой способ сделать это. Этот более простой способ также позволяет определить цвет фона для каждой ячейки:

 PdfPTable table = new PdfPTable(5);
table.DefaultCell.BackgroundColor = new BaseColor(197, 197, 197);
table.AddCell("Quantity");
table.AddCell("Title");
table.AddCell("Unit Price");
table.AddCell("Discount");
table.AddCell("Total");
  

AddCell() Метод обернет строки внутри a Phrase . Создайте a PdfPCell с помощью этого Phrase и примените все свойства, которые вы определили для DefaultCell этой ячейки. Таким образом, вы можете убедиться, что все ячейки имеют одинаковый цвет фона (или границы, или …). Очевидно, что свойства DefaultCell будут игнорироваться, если вы создаете PdfPCell экземпляры самостоятельно.