测量文本
请先打开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类型,其可选值有:
StringFormat的FormatFlags用于其他格式设置,例如文本方向等,StringFormatFlags类型,可选值有:
|
||||||||||||||||||
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)
执行后,生成的文档如下: