AddWatermark.cs
  1. // 完毕:
  2. using System;
  3. using System.IO;
  4. using System.Drawing;
  5. using System.Numerics;
  6. using GrapeCity.Documents.Pdf;
  7. using GrapeCity.Documents.Text;
  8. using GCTEXT = GrapeCity.Documents.Text;
  9. using GCDRAW = GrapeCity.Documents.Drawing;
  10.  
  11. namespace DsPdfWeb.Demos
  12. {
  13. // 此示例展示了如何添加简单的类似文本水印的叠加层
  14. // 到现有 PDF 的所有页面。
  15. public class AddWatermark
  16. {
  17. public int CreatePDF(Stream stream)
  18. {
  19. var doc = new GcPdfDocument();
  20. using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "SlidePages.pdf"));
  21. doc.Load(fs);
  22. foreach (var page in doc.Pages)
  23. {
  24. var g = page.Graphics;
  25.  
  26. // 用于绘制“水印”的文本布局:
  27. var tl = g.CreateTextLayout();
  28. tl.Append("DsPdf Demo");
  29. tl.DefaultFormat.Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "calibrib.ttf"));
  30. tl.DefaultFormat.FontSize = g.Resolution;
  31. // 半透明颜色:
  32. tl.DefaultFormat.ForeColor = Color.FromArgb(128, Color.Yellow);
  33. tl.DefaultFormat.GlyphAdvanceFactor = 1.5f;
  34. tl.PerformLayout();
  35.  
  36. // 旋转角度(弧度)- 从页面的左/下角到右/上角:
  37. var angle = -Math.Asin(g.CanvasSize.Width / g.CanvasSize.Height);
  38. // 页面中心:
  39. var center = new PointF(g.CanvasSize.Width / 2, g.CanvasSize.Height / 2);
  40. // 文本大小的额外偏移:
  41. var delta = new PointF(
  42. (float)((tl.ContentWidth * Math.Cos(angle) - tl.ContentHeight * Math.Sin(angle)) / 2),
  43. (float)((tl.ContentWidth * Math.Sin(angle) + tl.ContentHeight * Math.Cos(angle)) / 2));
  44.  
  45. // 在页面中心对角绘制水印文本
  46. // (矩阵变换从最后到第一个应用):
  47. g.Transform =
  48. Matrix3x2.CreateRotation((float)angle) *
  49. Matrix3x2.CreateTranslation(center.X - delta.X, center.Y - delta.Y);
  50.  
  51. g.DrawTextLayout(tl, PointF.Empty);
  52. g.Transform = Matrix3x2.Identity;
  53. }
  54. doc.Save(stream);
  55. return doc.Pages.Count;
  56. }
  57. }
  58. }
  59.