测量文本

请先打开CaseStyudy目录下的文件"PDFCreator示例.Table"后再运行本节的示例代码。

PDFCreator不可能只绘制一个文本,可能要绘制多个,而且每个文本的长度可能未知。

那么如何顺序绘制多个未知长度的文本,且合理安排其位置呢?

可以先通过MeasureString方法获得文本的尺寸(通常是高度),然后进行布局,该方法的语法为:

MeasureString(text, font, width)
MeasureString(text, font, width, sf)
MeasureString(text, font, width, sf, firstChar)

参数 说明
text 文本内容
font 文本字体
width 指定测量文本矩形区域的宽度,单位为磅,换算规则:72磅等于1英寸,也就是2,54厘米
sf 指定文本格式,StringFormat类型。

StringFormat的Alignment和LineAlignment属性,分别分解用于指定水平和垂直对齐方式,二者均为StringAlignment类型,其可选值有:

Near 近端对齐,如果是水平方向,向左对齐,如果是垂直方向,向上对齐
Center 居中对齐
Far 靠远端对齐,如果是水平方向,向右对齐,如果是垂直方向,向下对齐

StringFormat的FormatFlags用于其他格式设置,例如文本方向等,StringFormatFlags类型,可选值有:

DirectionRightToLeft 从右到左显示文本
DirectionVertical 垂直显示文本
DisplayFormatControl 显示格式符号
LineLimit 只绘制整行的文本,当矩形不是行高整数倍的时候,设置此选项可以避免最后一行不完整
NoClip 禁止裁切文本,设置此选项会导致文本可能绘制在文本框之外(例如未换行的文本)
NoWrap 禁止自动换行
firstChar 整数型,第一个要测量的字符的位置。

示例一

下面的代码演示了MeasureString的简单应用,txt的长度是随机的,如果希望紧随在txt之后绘制"结束"二字,就需要用MeasureString测量txt的高度:

Dim file As String = "c:\temp\test.pdf"
Dim
pdc As New PDFCreator()
pdc.PaperKind = Drawing.Printing.PaperKind.B5

Dim
rcPage As RectangleF = pdc.PageRectangle()
rcPage.Inflate( - 72, - 72)
'设置页边距为72磅,也就是2.54厘米
Dim
fnt As New Font("宋体", 10)
Dim
txt As String = "data 0"
For
i As Integer = 1 To Rand.Next(15) 'txt的长度是随机的
    txt = txt & vbCrLf &
"data " & i
Next
Dim
rect As RectangleF = rcPage
rect.Height = pdc.MeasureString(txt, fnt, rect.Width).Height
'计算txt的高度并赋值给rect
pdc.DrawString(txt, fnt, color.Black, rect)
'绘制txt
rect.Offset(0, rect.Height + 5)
'间隔5磅绘制后续内容
pdc.DrawString(
"结束", fnt, color.red, rect)
pdc.Save(file)

Process.Start(file)

生成的文档为:

 

示例二

请先打开CaseStyudy目录下的文件"PDFCreator示例.Table",然后选择"员工"表,在命令窗口运行下面的代码:

Dim file As String = "c:\temp\test.pdf"
Dim
pdc As New PDFCreator()
pdc.PaperKind = Drawing.Printing.PaperKind.B5

Dim
rcPage As RectangleF = pdc.PageRectangle()
rcPage.Inflate( - 72, - 72)
'设置页边距为72磅,也就是2.54厘米
Dim
rect As RectangleF = rcPage 'rect为绘制区域,我们将通过调整rect的位置和高度,来实现动态布局
Dim
title As String = "员工列表" '标题
Dim
fntTitle As New Font("微软雅黑", 14, FontStyle.Bold) '标题字体
Dim
fntName As New Font("微软雅黑", 10, FontStyle.Bold) '员工姓名字体
Dim
fntMemo As New Font("宋体", 10) '员工备注字体
'绘制标题

rect.Height = pdc.MeasureString(title, fntTitle, rect.Width).Height
'计算标题的高度,并设置为rect的高度
pdc.DrawString(title, fntTitle, color.Black, rect)
'rect区域绘制标题
rect.Offset(0, rect.Height + 30)
'标题之后30磅开始绘制后续内容
For
Each r As Row In Tables("员工").Rows
   
Dim name As String = r("姓名")
    rect.Height = pdc.MeasureString(name, fntName, rect.Width).Height
'计算姓名的高度,并设置为rect的高度
   
If rect.Bottom > rcPage.Bottom Then '如果超过页面范围
        pdc.NewPage()
'新增一页
        rect.Y = rcPage.Y
'重置rect的起始位置
   
End If
    pdc.DrawString(name, fntName, color.Black, rect)
'绘制姓名
    pdc.DrawLine(pens.Black, rect.Left, rect.Bottom, rect.Right, rect.Bottom)
'在姓名之后绘制一条横线
    rect.Offset(0, rect.Height + 5)
'姓名 之后5磅绘制后续内容

    Dim memo As String = r("备注").Trim()
    rect.Height = pdc.MeasureString(memo, fntMemo, rect.Width).Height
'计算备注的高度,并设置为rect的高度
   
If rect.Bottom > rcPage.Bottom Then '如果超过页面范围
        pdc.NewPage()
'新增一页
        rect.Y = rcPage.Y
'重置rect的起始位置
   
End If
    pdc.DrawString(memo, fntMemo, color.Black, rect)
'绘制备注
    rect.Offset(0, rect.Height + 25)
'间隔25磅之后绘制下一个员工
Next

pdc.Save(file)
Process.Start(file)

执行后,生成的文档如下:


本页地址:http://www.foxtable.com/webhelp/topics/6063.htm