从目录中的所有图像生成幻灯片页面

PDF TIFF SVG JPG C# VB
SlidePages.vb
  1. '' 完毕:
  2. Imports System.IO
  3. Imports System.Drawing
  4. Imports GrapeCity.Documents.Pdf
  5. Imports GrapeCity.Documents.Text
  6. Imports GrapeCity.Documents.Drawing
  7. Imports GCTEXT = GrapeCity.Documents.Text
  8. Imports GCDRAW = GrapeCity.Documents.Drawing
  9.  
  10. '' 从目录中找到的所有图像创建“幻灯片”页面。
  11. ''
  12. '' 重要提示:当您在 GcDocs.Pdf 中多次渲染图像时(例如渲染
  13. '' 相同的图像作为所有页面上页眉的一部分),它将自动
  14. '' 添加到字典中并在整个文档中重复使用,前提是您使用
  15. '' 所有页面上的相同图像对象。因此,不要从以下位置加载相同的图像
  16. '' 每次需要文件(或流)时,最好加载图像
  17. '' 一次并将其缓存在图像对象中。这适用于所有可用的图像类型
  18. '' GcDocs.Pdf(图像、RawImage)。
  19. Public Class SlidePages
  20. Function CreatePDF(ByVal stream As Stream) As Integer
  21. Dim doc = New GcPdfDocument()
  22. '' 获取标题字体:
  23. Dim fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "segoeui.ttf"))
  24. '' GcPdfDocument.ImageOptions 允许您控制各种与图像相关的设置。
  25. '' 特别是,我们可以将 JPEG 质量从默认的 75% 降低以减小文件大小:
  26. doc.ImageOptions.JpegQuality = 50
  27.  
  28. '' 从 Resources/Images 文件夹加载所有图像:
  29. Dim images = New List(Of Tuple(Of String, IImage))
  30. For Each fname In Directory.GetFiles(Path.Combine("Resources", "Images"), "*", SearchOption.AllDirectories)
  31. images.Add(Tuple.Create(Path.GetFileName(fname), Util.ImageFromFile(fname)))
  32. Next
  33.  
  34. images.Shuffle()
  35. '' 将所有图像打印为 3x4 网格中的幻灯片,四周留有 1/2 英寸边距:
  36. Const margin = 36.0F
  37. Const rows = 4
  38. Const cols = 3
  39. Dim gapx = 72.0F / 4, gapy = gapx
  40. Dim sWidth = (doc.PageSize.Width - margin * 2 + gapx) / cols
  41. Dim sHeight = (doc.PageSize.Height - margin * 2 + gapy) / rows
  42. If sWidth > sHeight Then
  43. gapx += sWidth - sHeight
  44. sWidth = sHeight
  45. Else
  46. gapy += sHeight - sWidth
  47. sHeight = sWidth
  48. End If
  49.  
  50. Const sMargin = 72.0F / 6
  51. '' 设置图像对齐方式,使图像在指定区域内居中:
  52. Dim ia = New ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Center, True, True, True, False, False)
  53. '' 图像标题的文本格式:
  54. Dim tf = New TextFormat() With {.Font = fnt, .FontSize = sMargin * 0.65F}
  55. '' 插入点:
  56. Dim ip = New PointF(margin, margin)
  57. Dim g = doc.NewPage().Graphics
  58. For i = 0 To images.Count() - 1
  59. Dim rect = New RectangleF(ip, New SizeF(sWidth - gapx, sHeight - gapy))
  60. g.FillRectangle(rect, Color.LightGray)
  61. g.DrawRectangle(rect, Color.Black, 0.5F)
  62. rect.Inflate(-sMargin, -sMargin)
  63. '' 我们通过 DrawImage 方法获得了绘制图像的实际矩形
  64. '' (通过输出参数)这样我们就可以在图像周围绘制一个细边框
  65. '' (需要一个数组,因为图像可以平铺,在这种情况下需要多个矩形
  66. '' 将被退回):
  67. Dim imageRect As RectangleF() = Nothing
  68. g.DrawImage(images(i).Item2, rect, Nothing, ia, imageRect)
  69. g.DrawRectangle(imageRect(0), Color.DarkGray, 1)
  70. '' 在幻灯片底部边距中打印图像文件名作为标题:
  71. g.DrawString(Path.GetFileName(images(i).Item1), tf,
  72. New RectangleF(rect.X, rect.Bottom, rect.Width, sMargin),
  73. TextAlignment.Center, ParagraphAlignment.Near, False)
  74. ip.X += sWidth
  75. If ip.X + sWidth > doc.PageSize.Width AndAlso i < images.Count() - 1 Then
  76. ip.X = margin
  77. ip.Y += sHeight
  78. If ip.Y + sHeight > doc.PageSize.Height Then
  79. g = doc.NewPage().Graphics
  80. ip.Y = margin
  81. End If
  82. End If
  83. Next
  84. ''
  85. '' 完毕:
  86. doc.Save(stream)
  87. '' 保存 PDF 后处理图像:
  88. images.ForEach(Sub(t_) t_.Item2.Dispose())
  89. Return doc.Pages.Count
  90. End Function
  91. End Class
  92.