首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Itextsharp锐化渐变背景

Itextsharp锐化渐变背景
EN

Stack Overflow用户
提问于 2011-10-07 14:58:33
回答 2查看 10.7K关注 0票数 2

有没有办法将渐变背景设置为pdfcell或段落?或者我必须使用image?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-07 22:51:56

可以,iText和iTextSharp支持渐变颜色。PdfShading对象有几个静态方法,可以为您创建不同类型的PdfShading对象。您最感兴趣的两个可能是SimpleAxialSimpleRadial。还有另外三个名字是Type1Type2Type3,我还没有探索过。

一旦有了PdfShading对象,就可以直接从它创建一个PdfShadingPattern,一旦有了,就可以从它创建一个ShadingColorShadingColor最终是从BaseColor派生而来的,所以您应该能够在使用它的任何地方使用它。在您的示例中,您希望将其分配给一个BackgroundColor

下面是一个针对iTextSharp 5.1.1.0的完整的工作WinForms应用程序,其中显示了创建了一个包含两列的表,每一列都有自己的渐变背景色。

注意PdfShading静态方法的(x,y)坐标是文档级的,而不是单元格级的。这意味着,根据渐变的大小,您可能无法重用PdfShading对象。在下面的示例之后,我将向您展示如何使用单元格事件克服此限制。

代码语言:javascript
运行
复制
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方法的新类。下面是完成这一切的更新代码:

代码语言:javascript
运行
复制
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);
            }
        }
    }
}
票数 6
EN

Stack Overflow用户

发布于 2012-02-09 18:42:21

如果其他人还感兴趣,我想知道如何用渐变来给整个背景上色,你可以这样做……

代码语言:javascript
运行
复制
    PdfShading shading = PdfShading.simpleAxial(writer, 0, pageH, pageW, 0,
            BaseColor.WHITE, BaseColor.LIGHT_GRAY);
    PdfShadingPattern pattern = new PdfShadingPattern(shading);
    cb.setShadingFill(pattern);
    // cb.circle(500, 500, 500);
    cb.rectangle(0, 0, pageW, pageH);
    cb.fill();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7684002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档