字体实例:如何使用不同的字体样式简化文档创建

时间:2016-09-26 16:40:10

标签: .net vb.net fonts

我使用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的块 - 然后为每个样式或主题选择正确的字体......

我敢肯定会有一个更简单,更干净的解决方案,但我无法理解

1 个答案:

答案 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 IfFor Each/Next)都会导致新的块范围。因此,那些字体对象仅存在于End If之前。

如果问题是您在其他地方声明了字体变量,并且您无法理解它没有被更改,这就是原因;你不小心在2个不同的范围内使用了2个不同的字体变量。

此外,NewDim | 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"