У меня есть две таблицы. Внешняя таблица представляет собой единую оболочку/ячейку, которую я использую для рисования градиентного фона. Затем я добавляю вложенную/дочернюю таблицу, которая является одной строкой и имеет три ячейки.Как установить цвет фона вложенной ячейки при использовании iTextSharp?
// set up wrapper table
var wrapperTable = new PdfPTable(1);
wrapperTable .WidthPercentage = 100;
// set up wrapper cell
var wrapperCell = new PdfPCell();
wrapperCell.CellEvent = new GradientBackgroundEvent(writer); // set gradient background
wrapperCell.Border = PdfPCell.NO_BORDER;
// setup nested table
var nestedTable = new PdfPTable(3);
nestedTable.WidthPercentage = 100;
nestedTable.SetWidths(new float[] { 15f, 70f, 15f });
var col1 = new PdfPCell(new Phrase(myText1, font));
col1.VerticalAlignment = Element.ALIGN_TOP;
col1.HorizontalAlignment = Element.ALIGN_CENTER;
col1.Border = PdfPCell.NO_BORDER;
nestedTable.AddCell(col1);
// this is the cell that I'm interested in - borders work, but no bgcolor
var col2 = new PdfPCell(new Phrase(myText2, font));
col2.VerticalAlignment = Element.ALIGN_TOP;
col2.HorizontalAlignment = Element.ALIGN_LEFT;
col2.BackgroundColor = BaseColor.WHITE;
col2.BorderColor = new BaseColor(204, 204, 204);
col2.BorderWidth = 0.2f;
nestedTable.AddCell(col2);
var col3 = new PdfPCell(new Phrase(myText3, font));
col3.VerticalAlignment = Element.ALIGN_TOP;
col3.HorizontalAlignment = Element.ALIGN_CENTER;
col3.Border = PdfPCell.NO_BORDER;
nestedTable.AddCell(col3);
// add nested table to the wrapper table
wrapperCell.AddElement(nestedTable);
Я могу установить границы для этих ячеек, и они правильно рисуют. Однако ничто из того, что я пробовал (не удаляя фон градиента), позволит мне увидеть цвет фона, который я установил в ячейке во вложенной таблице.
Вот мой код для заполнения градиента.
public class GradientBackgroundEvent : IPdfPCellEvent
{
private PdfWriter w;
public GradientBackgroundEvent(PdfWriter w)
{
this.w = w;
}
public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)
{
var c1 = new BaseColor(238, 238, 238);
var c2 = new BaseColor(221, 221, 221);
PdfShading shading = PdfShading.SimpleAxial(w, position.Left, position.Top, position.Left, position.Bottom, c1, c2);
PdfShadingPattern pattern = new PdfShadingPattern(shading);
ShadingColor color = new ShadingColor(pattern);
PdfContentByte cb = canvases[PdfPTable.BACKGROUNDCANVAS];
position.BackgroundColor = color;
// Fill the rectangle
cb.Rectangle(position);
}
}
Я попытался двигаться код вокруг и изменить порядок, в котором таблицы/ячейки добавляются, но это не делает никакой разницы, так как PDF втягивается в конце (не так, как строится).
Судя по моему отладку - мне кажется, что градиентная заливка окрашивается после того, как цвет фона для ячейки установлен и эффективно перезаписывает его.
Есть ли у кого-нибудь идеи о том, как это можно сделать? Может быть, я не должен использовать таблицу для этого?
Я видел некоторые другие сообщения, которые предлагают использовать поле формы - путь. Я бы хотел избежать этого, если это возможно, но если это единственный способ ...
Как я и думал тогда. Я дам то, что вы предлагаете. –
Не повезло. После перехода на PdfPTable.BASECANVAS градиент вообще не отображается. –