Setting the background color of a contentbyte itextsharp

旧时模样 提交于 2019-12-07 17:38:32

There is no concept of "background color" in the PDF spec in relation to text. Anything that looks like a background color, even a table, is just text drawn on top of a rectangle (or some other shape).

To draw a rectangle you just call the Rectangle method on your PdfContentByte object. It takes a lower left x,y and a width and a height. The color is determined by a previous call to one of the color fills such as SetColorFill().

When working with the raw canvas its recommended that you also use SaveState() and RestoreState(). Since the fill commands are shared between objects but mean different things these can help avoid confusion. SaveState() sets a flag allowing you to undo all graphics state changes when you call RestoreState().

The code below is a full working VB.Net 2010 WinForms app targeting iTextSharp 5.1.2.0 that shows off the above. It creates a sample file on the desktop with a line of text repeated 7 times. Each line toggles back and forth between two background colors. Additionally it draws a stroke around the line of text to simulate a border.

Option Strict On
Option Explicit On

Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf

Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ''//Test file that we'll create
        Dim TestFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TestFile.pdf")
        ''//Test String that we'll repeat
        Dim TestString = "It was the best of times..."
        ''//Create an array of our test string
        Dim TestArray = {TestString, TestString, TestString, TestString, TestString, TestString, TestString}

        ''//Create our generic font
        Dim BF_Times = BaseFont.CreateFont(BaseFont.TIMES_BOLD, BaseFont.CP1250, BaseFont.NOT_EMBEDDED)

        ''//Standard PDF setup, change as needed for your stream type
        Using FS As New FileStream(TestFile, FileMode.Create, FileAccess.Write, FileShare.None)
            Using Doc As New Document(PageSize.LETTER)
                Using writer = PdfWriter.GetInstance(Doc, FS)
                    Doc.Open()

                    ''//Grab the raw content object
                    Dim cb = writer.DirectContent
                    ''//Set our starter Y coordinate
                    Dim y = 670
                    ''//Loop through our string collection
                    For I = 0 To (TestArray.Count - 1)
                        ''//Store the current graphics state so that we can unwind it later
                        cb.SaveState()
                        ''//Set the fill color based on eve/odd
                        cb.SetColorFill(If(I Mod 2 = 0, BaseColor.GREEN, BaseColor.BLUE))
                        ''//Optional, set a border
                        cb.SetColorStroke(BaseColor.BLACK)
                        ''//Draw a rectangle. NOTE: I'm subtracting 5 from the y to account for padding
                        cb.Rectangle(0, y - 5, Doc.PageSize.Width, 15)
                        ''//Draw the rectangle with a border. NOTE: Use cb.Fill() to draw without the border
                        cb.FillStroke()
                        ''//Unwind the graphics state
                        cb.RestoreState()

                        ''//Flag to begin text
                        cb.BeginText()
                        ''//Set the font
                        cb.SetFontAndSize(BF_Times, 6)
                        ''//Write some text
                        cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, TestArray(I), 0, y, 0)
                        ''//Done writing text
                        cb.EndText()

                        ''//Decrease the y accordingly
                        y -= 15
                    Next


                    Doc.Close()
                End Using
            End Using
        End Using

        Me.Close()
    End Sub
End Class
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!