.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);

打印如下:

相关推荐
北域码匠4 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
rockey6277 小时前
C#脚本引擎之AScript与Z.Expressions.Eval对比
c#·.net·script·expression·动态脚本
开开心心_Every9 小时前
实现鼠标键盘动作录制与重复播放的工具
微信·jupyter·pycharm·pdf·计算机外设·word·excel
天下无敌笨笨熊9 小时前
C#Modbus串口开发心得
开发语言·c#
CSDN_RTKLIB9 小时前
const与readonly关键字
c#
leonkay10 小时前
C# 锁机制——【2】深入原理
开发语言·后端·spring·c#·个人开发
2601_9622994911 小时前
使用 Python 将 CSV 转为 PDF(含表格样式美化)
python·pdf·csv·spire.xls·表格样式
geovindu14 小时前
CSharp: Wordcloud
开发语言·后端·c#·.net·.netcore·词云
geovindu15 小时前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式
格林威18 小时前
C# 相机图像阴影校正:使用OpenCvSharp实现工业相机阴影平场校正功能
人工智能·数码相机·opencv·计算机视觉·c#·机器视觉·工业相机