2015-04-02 6 views
0

У меня есть две таблицы. Внешняя таблица представляет собой единую оболочку/ячейку, которую я использую для рисования градиентного фона. Затем я добавляю вложенную/дочернюю таблицу, которая является одной строкой и имеет три ячейки.Как установить цвет фона вложенной ячейки при использовании 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 втягивается в конце (не так, как строится).

Судя по моему отладку - мне кажется, что градиентная заливка окрашивается после того, как цвет фона для ячейки установлен и эффективно перезаписывает его.

Есть ли у кого-нибудь идеи о том, как это можно сделать? Может быть, я не должен использовать таблицу для этого?

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

ответ

1

Ваш фоновый цвет нарисован, к сожалению, он рисуется «под» фон градиента, поэтому вы не можете его увидеть. Пока вы только вставляете эти две таблицы, простейшим решением является, возможно, просто нарисовать ваш градиент на PdfPTable.BASECANVAS вместо PdfPTable.BACKGROUNDCANVAS.

+0

Как я и думал тогда. Я дам то, что вы предлагаете. –

+0

Не повезло. После перехода на PdfPTable.BASECANVAS градиент вообще не отображается. –

Смежные вопросы