是否可以将渐变背景设置为pdfcell或段落?还是我必须使用图像?
最佳答案
是的,iText和iTextSharp支持渐变颜色。 PdfShading
对象具有几个静态方法,这些方法可以为您创建不同类型的PdfShading
对象。您可能最感兴趣的两个是SimpleAxial
和SimpleRadial
。我还没有探索过另外三个名为Type1
,Type2
和Type3
的东西。
一旦有了PdfShading
对象,就可以直接从它创建一个PdfShadingPattern
,一旦有了它,就可以从它创建一个ShadingColor
。 ShadingColor
最终是从BaseColor
派生的,因此无论在哪里使用,您都应该可以使用它。在您的情况下,您要将其分配给BackgroundColor
。
以下是针对iTextSharp 5.1.1.0的完整的WinForms应用程序,该应用程序显示了创建的表,该表包含两列,每列具有自己的渐变背景色。
注意:PdfShading
静态方法的(x,y)坐标是文档级别的,而不是单元级别的。这意味着您可能无法根据渐变的大小重新使用PdfShading
对象。在下面的该示例之后,我将向您展示如何使用单元事件克服此限制。
using System;
using System.Text;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//Test file name
string TestFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
//Standard iTextSharp setup
using (FileStream fs = new FileStream(TestFile, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (Document doc = new Document(PageSize.LETTER))
{
using (PdfWriter w = PdfWriter.GetInstance(doc, fs))
{
//Open the document for writing
doc.Open();
//Create a shading object. The (x,y)'s appear to be document-level instead of cell-level so they need to be played with
PdfShading shading = PdfShading.SimpleAxial(w, 0, 700, 300, 700, BaseColor.BLUE, BaseColor.RED);
//Create a pattern from our shading object
PdfShadingPattern pattern = new PdfShadingPattern(shading);
//Create a color from our patter
ShadingColor color = new ShadingColor(pattern);
//Create a standard two column table
PdfPTable t = new PdfPTable(2);
//Add a text cell setting the background color through object initialization
t.AddCell(new PdfPCell(new Phrase("Hello")) { BackgroundColor = color });
//Add another cell with everything inline. Notice that the (x,y)'s have been updated
t.AddCell(new PdfPCell(new Phrase("World")) { BackgroundColor = new ShadingColor(new PdfShadingPattern(PdfShading.SimpleAxial(w, 400, 700, 600, 700, BaseColor.PINK, BaseColor.CYAN))) });
//Add the table to the document
doc.Add(t);
//Close the document
doc.Close();
}
}
}
this.Close();
}
}
}
例子2
如上所述,以上方法使用的文档级位置通常不够好。为了克服这个问题,您需要使用单元格级别的定位,并且需要使用单元格事件,因为在呈现表格本身之前,不知道单元格的位置。要使用单元事件,您需要创建一个实现
IPdfPCellEvent
并处理CellLayout
方法的新类。以下是完成所有这些操作的更新代码:using System;
using System.Text;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//Test file name
string TestFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
//Standard iTextSharp setup
using (FileStream fs = new FileStream(TestFile, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (Document doc = new Document(PageSize.LETTER))
{
using (PdfWriter w = PdfWriter.GetInstance(doc, fs))
{
//Open the document for writing
doc.Open();
//Create a standard two column table
PdfPTable t = new PdfPTable(2);
//Create an instance of our custom cell event class, passing in our main writer which is needed by the PdfShading object
var CE = new GradientBackgroundEvent(w);
//Set the default cell's event to our handler
t.DefaultCell.CellEvent = CE;
//Add cells normally
t.AddCell("Hello");
t.AddCell("World");
//Add the table to the document
doc.Add(t);
//Close the document
doc.Close();
}
}
}
this.Close();
}
public class GradientBackgroundEvent : IPdfPCellEvent
{
//Holds pointer to main PdfWriter object
private PdfWriter w;
//Constructor
public GradientBackgroundEvent(PdfWriter w)
{
this.w = w;
}
public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)
{
//Create a shading object with cell-specific coords
PdfShading shading = PdfShading.SimpleAxial(w, position.Left, position.Bottom, position.Right, position.Top, BaseColor.BLUE, BaseColor.RED);
//Create a pattern from our shading object
PdfShadingPattern pattern = new PdfShadingPattern(shading);
//Create a color from our patter
ShadingColor color = new ShadingColor(pattern);
//Get the background canvas. NOTE, If using an older version of iTextSharp (4.x) you might need to get the canvas in a different way
PdfContentByte cb = canvases[PdfPTable.BACKGROUNDCANVAS];
//Set the background color of the given rectable to our shading pattern
position.BackgroundColor = color;
//Fill the rectangle
cb.Rectangle(position);
}
}
}
}