SlidePages.vb
- ''
- '' This code is part of Document Solutions for PDF demos.
- '' Copyright (c) MESCIUS inc. All rights reserved.
- ''
- 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
-
- '' Creates pages of 'slides' from all images found in a directory.
- ''
- '' IMPORTANT NOTE: When you render an image in DsPdf multiple times (e.g. rendering
- '' the same image as part of a page header on all pages), it will automatically be
- '' added to a dictionary and reused throughout the document, provided you use
- '' the same image object on all pages. So rather than loading the same image from
- '' file (or stream) each time it is needed, it is always preferable to load the image
- '' once and cache it in an image object. This applies to all image types used in DsPdf.
- Public Class SlidePages
- Function CreatePDF(ByVal stream As Stream) As Integer
- Dim doc = New GcPdfDocument()
- '' Get a font for captions:
- Dim fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "segoeui.ttf"))
- '' GcPdfDocument.ImageOptions controls various image-related settings.
- '' In particular, we can lower the JPEG quality from the default 75% to reduce the file size:
- doc.ImageOptions.JpegQuality = 50
-
- '' Load all images from the Resources/Images folder:
- 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()
- '' Print all images as slide sheets in a 3x4 grid with 1/2" margins all around:
- 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
- '' Set up image alignment that would center images within the specified area:
- Dim ia = New ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Center, True, True, True, False, False)
- '' Text format for image captions:
- Dim tf = New TextFormat() With {.Font = fnt, .FontSize = sMargin * 0.65F}
- '' Insertion point:
- 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)
- '' We get the actual rectangle where the image was drawn from the DrawImage method
- '' (via an output parameter) so that we can draw a thin border exactly around the image
- '' (an array is required as the image can be tiled, in which case multiple rectangles
- '' will be returned):
- Dim imageRect As RectangleF() = Nothing
- g.DrawImage(images(i).Item2, rect, Nothing, ia, imageRect)
- g.DrawRectangle(imageRect(0), Color.DarkGray, 1)
- '' Print image file name as caption in the bottom slide margin:
- 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
- ''
- '' Done:
- doc.Save(stream)
- '' Dispose images (can be done only after saving the document):
- images.ForEach(Sub(t_) t_.Item2.Dispose())
- Return doc.Pages.Count
- End Function
- End Class
-