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

打印如下:

相关推荐
筱璦8 小时前
期货软件开发 - C# 调用 HQChart 指标计算 C++ 动态库
c++·microsoft·c#
武藤一雄10 小时前
C# 异常(Exception)处理避坑指南
windows·microsoft·c#·.net·.netcore·鲁棒性
步步为营DotNet10 小时前
剖析.NET 11 中 Native AOT 在高性能客户端应用的极致实践
.net
xinixini12 小时前
小初高全学科课程标准PDF
pdf
步步为营DotNet13 小时前
深度探索.NET Aspire在云原生应用性能与安全加固的创新实践
安全·云原生·.net
武藤一雄13 小时前
WPF中ViewModel之间的5种通讯方式
开发语言·前端·microsoft·c#·wpf
雨浓YN13 小时前
OPC UA 通讯开发笔记 - 基于Opc.Ua.Client
笔记·c#
我是唐青枫14 小时前
C#.NET TPL Dataflow 深入解析:数据流管道、背压控制与实战取舍
c#·.net
SQVIoMPLe14 小时前
python-langchain框架(3-7-提取pdf中的图片 )
python·langchain·pdf
Highcharts.js15 小时前
Highcharts客户端导出使用文档说明|图表导出模块讲解
前端·javascript·pdf·highcharts·图表导出