【问题标题】:Setting the background color of a contentbyte itextsharp设置 contentbyte itextsharp 的背景颜色
【发布时间】:2012-03-23 08:50:24
【问题描述】:

使用 Itextsharp 的 MVC3 VB.NET 应用程序。我有一段代码可以生成一个 pdf 文件,一切看起来都很棒,但我想在 pdf 文件中的 2 种颜色之间交替使用线条颜色,以便查看它的人容易理解这些值。有没有办法根据字体大小将整行的背景颜色设置为设置颜色?我将在其中使用的函数如下:

    For Each _reg_ In _reg
                Dim _registrant As reg_info = _reg_
                If y_line1 <= 30 Then
                    doc.NewPage()
                    _Page = _Page + 1
                    y_line1 = 670
                End If

                If y_line1 = 670 Then
                    cb.BeginText()
                    cb.SetFontAndSize(BF_Times, 6)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, _datePrinted + "  " + _timePrinted, 500, 770, 0)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, "Page Number" + " " + _Page, 600, 770, 0)
                    cb.SetFontAndSize(BF_Times, 8)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _reportHead + " Overrides ", 304, 720, 0)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "First Name", 20, 700, 0)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "Last Name", 80, 700, 0)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "Last Four", 160, 700, 0)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "Email Address", 300, 700, 0)

                    cb.EndText()
                End If

                cb.BeginText()
                cb.SetFontAndSize(BF_Times, 8)
                cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, _registrant.first_name, 20, y_line1, 0)
                cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, _registrant.last_name, 80, y_line1, 0)
                cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, _registrant.last_four_social, 160, y_line1, 0)
                cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, _registrant.email, 300, y_line1, 0)
                _total += 1
                cb.EndText()
                y_line1 = y_line1 - 15
            Next

我考虑过使用 y_line1 设置线条的背景颜色,并使用模数来确定颜色应该是灰色还是白色。但是我在任何地方都没有找到关于如何设置整行背景颜色的代码示例。有什么想法吗????

【问题讨论】:

    标签: vb.net pdf-generation itextsharp


    【解决方案1】:

    PDF 规范中没有与文本相关的“背景颜色”概念。任何看起来像背景颜色的东西,甚至是表格​​,都只是在矩形(或其他形状)上绘制的文本。

    要绘制一个矩形,您只需在 PdfContentByte 对象上调用 Rectangle 方法。它需要一个左下角的 x,y 和一个宽度和一个高度。颜色由先前调用其中一种颜色填充(例如SetColorFill())确定。

    在使用原始画布时,建议您同时使用SaveState()RestoreState()。由于填充命令在对象之间共享,但含义不同,这些可以帮助避免混淆。 SaveState() 设置一个标志,允许您在调用 RestoreState() 时撤消所有图形状态更改。

    下面的代码是一个完整的 VB.Net 2010 WinForms 应用程序,目标是 iTextSharp 5.1.2.0,展示了上面的内容。它在桌面上创建一个示例文件,其中一行文本重复 7 次。每条线在两种背景颜色之间来回切换。此外,它会在文本行周围画一个笔触来模拟边框。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2010-09-17
      • 2018-07-15
      • 2014-09-04
      • 2010-11-10
      相关资源
      最近更新 更多