使用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设置线条的背景颜色,并使用模数来确定颜色应该是灰色还是白色。但我发现在任何地方都没有关于如何设置整行背景颜色的代码示例..任何想法????
答案 0 :(得分:4)
PDF规范中没有与文本相关的“背景颜色”概念。任何看起来像背景颜色的东西,甚至是桌子,都只是在矩形(或其他形状)上绘制的文字。
要绘制矩形,只需在Rectangle
对象上调用PdfContentByte
方法即可。它需要左下角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