SlidePages.vb
'' 完毕:
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing
'' 从目录中找到的所有图像创建“幻灯片”页面。
''
'' 重要提示:当您在 GcDocs.Pdf 中多次渲染图像时(例如渲染
'' 相同的图像作为所有页面上页眉的一部分),它将自动
'' 添加到字典中并在整个文档中重复使用,前提是您使用
'' 所有页面上的相同图像对象。因此,不要从以下位置加载相同的图像
'' 每次需要文件(或流)时,最好加载图像
'' 一次并将其缓存在图像对象中。这适用于所有可用的图像类型
'' GcDocs.Pdf(图像、RawImage)。
Public Class SlidePages
Function CreatePDF(ByVal stream As Stream) As Integer
Dim doc = New GcPdfDocument()
'' 获取标题字体:
Dim fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "segoeui.ttf"))
'' GcPdfDocument.ImageOptions 允许您控制各种与图像相关的设置。
'' 特别是,我们可以将 JPEG 质量从默认的 75% 降低以减小文件大小:
doc.ImageOptions.JpegQuality = 50
'' 从 Resources/Images 文件夹加载所有图像:
Dim images = New List(Of Tuple(Of String, IImage))
For Each fname In Directory.GetFiles(Path.Combine("Resources", "Images"), "*", SearchOption.AllDirectories)
images.Add(Tuple.Create(Path.GetFileName(fname), Util.ImageFromFile(fname)))
Next
images.Shuffle()
'' 将所有图像打印为 3x4 网格中的幻灯片,四周留有 1/2 英寸边距:
Const margin = 36.0F
Const rows = 4
Const cols = 3
Dim gapx = 72.0F / 4, gapy = gapx
Dim sWidth = (doc.PageSize.Width - margin * 2 + gapx) / cols
Dim sHeight = (doc.PageSize.Height - margin * 2 + gapy) / rows
If sWidth > sHeight Then
gapx += sWidth - sHeight
sWidth = sHeight
Else
gapy += sHeight - sWidth
sHeight = sWidth
End If
Const sMargin = 72.0F / 6
'' 设置图像对齐方式,使图像在指定区域内居中:
Dim ia = New ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Center, True, True, True, False, False)
'' 图像标题的文本格式:
Dim tf = New TextFormat() With {.Font = fnt, .FontSize = sMargin * 0.65F}
'' 插入点:
Dim ip = New PointF(margin, margin)
Dim g = doc.NewPage().Graphics
For i = 0 To images.Count() - 1
Dim rect = New RectangleF(ip, New SizeF(sWidth - gapx, sHeight - gapy))
g.FillRectangle(rect, Color.LightGray)
g.DrawRectangle(rect, Color.Black, 0.5F)
rect.Inflate(-sMargin, -sMargin)
'' 我们通过 DrawImage 方法获得了绘制图像的实际矩形
'' (通过输出参数)这样我们就可以在图像周围绘制一个细边框
'' (需要一个数组,因为图像可以平铺,在这种情况下需要多个矩形
'' 将被退回):
Dim imageRect As RectangleF() = Nothing
g.DrawImage(images(i).Item2, rect, Nothing, ia, imageRect)
g.DrawRectangle(imageRect(0), Color.DarkGray, 1)
'' 在幻灯片底部边距中打印图像文件名作为标题:
g.DrawString(Path.GetFileName(images(i).Item1), tf,
New RectangleF(rect.X, rect.Bottom, rect.Width, sMargin),
TextAlignment.Center, ParagraphAlignment.Near, False)
ip.X += sWidth
If ip.X + sWidth > doc.PageSize.Width AndAlso i < images.Count() - 1 Then
ip.X = margin
ip.Y += sHeight
If ip.Y + sHeight > doc.PageSize.Height Then
g = doc.NewPage().Graphics
ip.Y = margin
End If
End If
Next
''
'' 完毕:
doc.Save(stream)
'' 保存 PDF 后处理图像:
images.ForEach(Sub(t_) t_.Item2.Dispose())
Return doc.Pages.Count
End Function
End Class