.net C# 打印pdf添加水印实现

.net C# 打印pdf添加水印实现

工具类

复制代码
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace Common
{
    public static class PdfUtils
    {
        /// <summary>
        /// PDF添加文字水印
        /// 参数检查:检查水印内容、源文件路径和目标文件路径是否为空,若为空则直接返回源文件路径,与Java代码逻辑一致。
        ///读取和创建PDF对象:使用PdfReader读取源PDF文件,PdfStamper结合FileStream创建目标文件,用于写入添加水印后的内容。
        ///设置字体:通过BaseFont.CreateFont方法设置支持中文的字体,参数与Java版本保持一致,确保中文正常显示。
        ///设置透明度:创建PdfGState对象,设置FillOpacity属性为0.5f,实现水印半透明效果。
        ///遍历页面添加水印:遍历PDF的每一页,获取页面的上层内容(GetOverContent),通过双重循环平铺水印,设置字体、颜色、透明度,并使用ShowTextAligned方法在指定位置以45度角添加水印。
        ///异常处理和资源释放:捕获异常并输出错误信息,在finally块中关闭PdfStamper和PdfReader,释放资源,避免内存泄漏。
        /// </summary>
        /// <param name="waterMark">水印内容</param>
        /// <param name="sourcePath">源文件路径</param>
        /// <param name="targetPath">目标文件路径</param>
        /// <param name="fontSize">字体大小</param>
        /// <returns></returns>
        public static string AddWatermark(string waterMark, string sourcePath, string targetPath, int fontSize)
        {
            if (string.IsNullOrWhiteSpace(waterMark) || string.IsNullOrWhiteSpace(sourcePath) || string.IsNullOrWhiteSpace(targetPath))
            {
                return sourcePath;
            }

            PdfReader reader = null;
            PdfStamper stamp = null;
            try
            {
                // 待加水印文件
                reader = new PdfReader(sourcePath);
                // 加完水印输出的文件
                stamp = new PdfStamper(reader, new FileStream(targetPath, FileMode.Create));

                // 设置字体(需要考虑pdf中文无法显示的问题),iTextSharp内置了一些中文字体,STSongStd-Light,STSong-Light
                BaseFont font = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);

                // 设置透明度
                PdfGState pdfGState = new PdfGState();
                pdfGState.FillOpacity = 0.5f;   // 设置透明度为0.5,值的范围是0.0到1.0,其中0.0代表完全透明(即不可见),1.0代表完全不透明(即完全可见)

                // 源PDF文件的总页数
                int pageSize = reader.NumberOfPages;

                // 循环对每页添加水印
                for (int i = 1; i <= pageSize; i++)
                {
                    // PdfContentByte under = stamp.GetUnderContent(i);  // 水印在之前的文本下,文本会盖住水印,如果需要文本水印一起出现,不要使用该方法
                    PdfContentByte under = stamp.GetOverContent(i);   // 水印在之前的文本上

                    // 平铺水印
                    for (int x = 100; x < 750; x += 200) // 控制水印在横向上的间距
                    {
                        for (int y = 100; y < 1000; y += 300) // 控制水印在纵向上的间距
                        {
                            under.BeginText();     // 开始
                            under.SetFontAndSize(font, fontSize);    // 应用字体,并将字体大小改为40
                            under.SetColorFill(BaseColor.LIGHT_GRAY);     // 设置字体颜色
                            under.SetGState(pdfGState);  // 将透明度应用到水印里
                            under.ShowTextAligned(Element.ALIGN_CENTER, waterMark, x, y, 45);// 居中;水印内容;水印x坐标;水印y坐标;45°角
                            under.EndText();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"添加水印时发生错误: {ex.Message}");
                return sourcePath;
            }
            finally
            {
                if (stamp != null)
                {
                    stamp.Close();
                }
                if (reader != null)
                {
                    reader.Close();
                }
            }

            return targetPath;
        }
    }
}

调用实现

复制代码
			// 添加水印
            string fileFullName = "D:\\project\\code\\Att\\Templates\\111.pdf";
            string targetFileName = "D:\\project\\code\\Att\\Templates\\222.pdf";
            string path = PdfUtils.AddWatermark("预览", fileFullName, targetFileName, 40);

            Response.Redirect("~/Att/Templates/" + targetFileName);

打印如下:

相关推荐
大傻^2 小时前
LangChain4j 企业知识库实战:PDF 解析、OCR 与文档加载器生态
人工智能·pdf·ocr·langchain4j
阿蒙Amon2 小时前
C#常用类库-详解Moq
开发语言·c#·log4j
格林威2 小时前
工业相机彩色图像采集:为什么我的图是绿色的?附海康/Basler/堡盟相机设置
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·工业相机
爱炸薯条的小朋友2 小时前
C#使用反射,特性,表达式树仿写AutoMapper
开发语言·c#
似水明俊德2 小时前
11-C#
开发语言·c#
人工智能AI技术3 小时前
.NET 9实战|最新C# AI Agent开发,Semantic Kernel+OpenClaw双剑合璧
人工智能·c#
我是唐青枫3 小时前
C#.NET stackalloc 深入解析:栈上分配、Span 配合与使用边界
c#·.net
开开心心_Every3 小时前
免费抽奖软件支持内定名单+防重复中奖
linux·运维·服务器·edge·pdf·c5全栈·c4python
一个帅气昵称啊3 小时前
.Net基于AgentFramework中智能体Agent Skill集成Shell命令实现小龙虾mini版
ai·c#·.net·openclaw