我使用iTextSharp创建一个简单的PDF文件。工作正常。
现在我希望用户可以更改样式或主题。用户可以从对话框中选择:Normal,Elegant,Modern,然后需要更改PDF的某些字体以适应所需的样式或主题。
PDF create Sub有类似的内容:
'Define fontLetterSeparator
Dim fontLetterSeparator As New Font(BaseFont.CreateFont("c:/windows/fonts/comic.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED), 18)
'Define letter separator paragraph
Dim letterSeparator As New Chunk(ActualLetter, fontLetterSeparator)
其中ActualLetter只是一个字母,如A,B,C ......(从SQLite数据库中读取,没有问题,这个)
我认为我可以管理3种风格或主题的一种方式是使用像
这样的代码If PDFTheme = "Normal" Then
Dim fontLetterSeparator As New Font(BaseFont.CreateFont("c:/windows/fonts/arial.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED), 20)
End If
If PDFTheme = "Elegant" Then
Dim fontLetterSeparator As New Font(BaseFont.CreateFont("c:/windows/fonts/verdana.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED), 20)
End If
If PDFTheme = "Modern" Then
Dim fontLetterSeparator As New Font(BaseFont.CreateFont("c:/windows/fonts/comic.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED), 60)
End If
但这不起作用,我认为是因为字体不可变条件。所以我认为解决方案是使用3种新字体或新实例
Dim fontLetterSeparatorNormal As New fontLetterSeparator
fontLetterSeparatorNormal.Name = "Arial"
Dim fontLetterSeparatorElegant As New fontLetterSeparator
fontLetterSeparatorElegant.Name = "Verdana"
Dim fontLetterSeparatorModern As New fontLetterSeparator
fontLetterSeparatorModern.Name = "Comic"
以及大小条件,但这会使原始行
'Define letter separator paragraph
'Dim letterSeparator As New Chunk(ActualLetter, fontLetterSeparator)
更复杂,因为现在我需要另一个3 IF的块 - 然后为每个样式或主题选择正确的字体......
我敢肯定会有一个更简单,更干净的解决方案,但我无法理解
答案 0 :(得分:1)
If PDFTheme = "Normal" Then
Dim fontLetterSeparator As New Font(BaseFont.CreateFont("c:/windows/fonts/arial.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED), 20)
End If
但这不起作用,我认为是因为字体不可变条件。
您没有描述错误,但一般来说代码似乎与范围内的自身争斗。几乎导致代码缩进的所有内容(If/End If
,For Each/Next
)都会导致新的块范围。因此,那些字体对象仅存在于End If
之前。
如果问题是您在其他地方声明了字体变量,并且您无法理解它没有被更改,这就是原因;你不小心在2个不同的范围内使用了2个不同的字体变量。
此外,New
和Dim | Private | Public
执行 2个不同的事情,并且不必每次都在一起使用。 New
创建对象实例,而其他声明变量(通常是类型),其中Scope
由确定> em>那个声明是。
' first, I would use an Enum for the style
Public Enum PDFSytles
[Default] ' its a reserved word
Elegant
Modern
End Enum
...
Private PDFStyle As PDFStyles ' will default to Default (0)
Private fontLetterSeparator As Font
简单声明此字体变量。尝试使用它会导致NullReference异常,但是因为它在Form / Class级别声明,可以在表单的任何地方使用。
If fontLetterSeparator IsNot Nothing Then
fontLetterSeparator.Dispose()
End If
Select Case PDFStyle
Case PDFStyles.Elegant
fontLetterSeparator = New Font("Verdana"...)
Case PDFStyles.Modern
...
End Select
首先,代码处理旧字体以防止资源泄漏。然后它创建一个New
字体并将其分配给变量。该变量很久以前在代码中的其他位置被声明,所以不需要再次声明它。
我不知道SQLite与此有什么关系或New Chunk(...)
做了什么,但代码和部分说明听起来就像是你遇到了Scope
。
更多:
那就是说,NET Font
个对象是不可变的。但这意味着你无法改变做类似的事情:
myFancyFont.Name = "Elabora Special"