C#使用Spire.Pdf添加水印
最近接到的工作
1.word转PDF
2.PDF添加水印,并控制显示的页数
3.JPG转PDF
需要引入 Spire.Pdf Spire.License 和 System.Drawing
接下来上代码
/// <summary> /// 给PDF文件添加水印 /// </summary> /// <param name="pdfPath">需要添加水印的pdf文件路径</param> /// <param name="targetPath">添加成功之后的文件路径和文件名</param> /// <param name="marks">水印内容</param> /// <param name="fromPage">可以从第几页开始看</param> /// <param name="toPage">可以看多少页</param> /// <returns></returns> public static bool PDFAddMark(string pdfPath, string targetPath, string marks, int fromPage = 1, int toPage = 1) { bool result = false; try { //创建一个新的PDF实例。然后导入PDF文件。 Spire.Pdf.PdfDocument pdf = new Spire.Pdf.PdfDocument(); pdf.LoadFromFile(pdfPath); //这里是因为Spire的版本问题 第一页会被添加水印 PdfPageBase pb = pdf.Pages.Add(); //新增一页 pdf.Pages.Remove(pb); //去除第一页水印 var a = pdf.Pages.Count; if (fromPage > a) { fromPage = 1; } if (fromPage > 1 && toPage < a) { for (int i = 0; i < (a - toPage); i++) { pdf.Pages.Remove(pdf.Pages[pdf.Pages.Count - 1]); //去掉后面的页数 } for (int i = 1; i < fromPage; i++) { pdf.Pages.Remove(pdf.Pages[0]); //去掉前面的页数 } } else if (fromPage > 1) { for (int i = 1; i < fromPage; i++) { pdf.Pages.Remove(pdf.Pages[0]); //去掉前面的页数 } } else if (toPage < a) { for (int i = 0; i < (a - toPage); i++) { pdf.Pages.Remove(pdf.Pages[pdf.Pages.Count - 1]); //去掉后面的页数 } } PdfPageBase page = null; if (pdf.Pages.Count > 0) { for (int i = 0; i < pdf.Pages.Count; i++) { page = pdf.Pages[i]; PdfTilingBrush brush = new PdfTilingBrush(new SizeF(page.Canvas.ClientSize.Width / 2, page.Canvas.ClientSize.Height / 3)); brush.Graphics.SetTransparency(0.3f); brush.Graphics.Save(); brush.Graphics.TranslateTransform(brush.Size.Width / 2, brush.Size.Height / 2); brush.Graphics.RotateTransform(-45); brush.Graphics.DrawString(marks, new Spire.Pdf.Graphics.PdfFont(PdfFontFamily.Helvetica, 24), PdfBrushes.Blue, 0, 0, new PdfStringFormat(PdfTextAlignment.Center)); brush.Graphics.Restore(); brush.Graphics.SetTransparency(1); page.Canvas.DrawRectangle(brush, new RectangleF(new PointF(0, 0), page.Canvas.ClientSize)); } pdf.SaveToFile(targetPath); return true; } return result; } catch (Exception ex) { return false; } }
本文来自博客园,作者:吃兔子的萝卜7,转载请注明原文链接:https://www.cnblogs.com/kangsir7/p/15724639.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY