Logo

C# 使用Aspose.Pdf给Pdf文件添加文字水印和图片水印

photo

2022年07月01日

使用Aspose.Pdf给pdf文件添加水印,代码如下:仅供参考(带一些个人业务,还有些小bug自行修改)

Aspose试用版 pdf超过4页会报错,商用请购买正式版本。

1、添加文字水印

/// <summary>
        /// pdf添加文字水印(自定义水印行数和列数)
        /// </summary>
        /// <param name="pdfStream">pdf文件流</param>
        /// <param name="watermarkText">水印文字</param>
        /// <param name="fontSize">文字大小</param>
        /// <param name="fontColor">文字颜色</param>
        /// <param name="typeface">字体:(中文水印请自行查找相应字体的英文名称,如:宋体(SimSun),黑体(SimHei),仿宋(FangSong),微软雅黑(Microsoft YaHei)等等...)</param>
        /// <param name="rotation">倾斜角度</param>
        /// <param name="opacity">不透明度(值为:0-1)</param>
        /// <param name="watermarkRowNum">水印行数</param>
        /// <param name="watermarkColumnNum">水印列数</param>
        /// <returns></returns>
        public Stream AddTextWatermarkCustom(Stream pdfStream, string watermarkText, float fontSize, Aspose.Pdf.Color fontColor, string typeface, double rotation = 0, double opacity = 0, int watermarkRowNum = 1, int watermarkColumnNum = 1)
        {
            try
            {
                /*计算倾斜高度-start*/
                var angle = Math.Abs(rotation);
                var width = watermarkText.Length * fontSize;
                var radian = 2 * Math.PI / 360 * angle;
                var top = Math.Sin(radian) * width;
                /*计算倾斜高度-end*/
                Document document = new Document(pdfStream);
                for (int i = 1; i <= document.Pages.Count; i++)
                {
                    var pageWidth = document.Pages[i].GetPageRect(false).Width;
                    var pageHeight = document.Pages[i].GetPageRect(false).Height;
                    WatermarkArtifact artifact = new WatermarkArtifact();
                    artifact.SetTextAndState(watermarkText, new TextState
                    {
                        FontSize = fontSize,
                        ForegroundColor = fontColor,
                        Font = FontRepository.FindFont(typeface),
                    });
                    artifact.Rotation = rotation;
                    artifact.Opacity = opacity;
                    artifact.IsBackground = false;
                    if (watermarkRowNum == 1 && watermarkColumnNum == 1)
                    {
                        artifact.ArtifactHorizontalAlignment = HorizontalAlignment.Center;
                        artifact.ArtifactVerticalAlignment = VerticalAlignment.Center;
                        document.Pages[i].Artifacts.Add(artifact);
                    }
                    else
                    {
                        artifact.ArtifactHorizontalAlignment = HorizontalAlignment.Left;
                        artifact.ArtifactVerticalAlignment = VerticalAlignment.Top;
                        for (int j = 1; j <= watermarkColumnNum; j++)
                        {
                            artifact.LeftMargin = (j - 1) * (pageWidth / watermarkColumnNum) + fontSize;
                            for (int z = 1; z <= watermarkRowNum; z++)
                            {
                                artifact.TopMargin = (z - 1) * (pageHeight / watermarkRowNum) + top;
                                document.Pages[i].Artifacts.Add(artifact);
                            }
                        }
                    }
                }
                Stream outStream = new MemoryStream();
                document.Save(outStream, SaveFormat.Pdf);
                outStream.Seek(0, SeekOrigin.Begin);
                return outStream;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// pdf添加文字水印(平铺)
        /// </summary>
        /// <param name="pdfStream">pdf文件流</param>
        /// <param name="watermarkText">水印文字</param>
        /// <param name="fontSize">文字大小</param>
        /// <param name="fontColor">文字颜色</param>
        /// <param name="typeface">字体:(中文水印请自行查找相应字体的英文名称,如:宋体(SimSun),黑体(SimHei),仿宋(FangSong),微软雅黑(Microsoft YaHei)等等...)</param>
        /// <param name="rotation">倾斜角度</param>
        /// <param name="opacity">不透明度(值为:0-1)</param>
        /// <param name="density">水印密度(值为0-1)</param>
        /// <returns></returns>
        public Stream AddTextWatermarkTile(Stream pdfStream, string watermarkText, float fontSize, Aspose.Pdf.Color fontColor, string typeface, double rotation = 0, double opacity = 0, double density = 1)
        {
            try
            {
                Document document = new Document(pdfStream);
                /*计算水印详细-start*/
                var angle = Math.Abs(rotation);
                var width = watermarkText.Length * fontSize;
                var radian = 2 * Math.PI / 360 * angle;
                var top = Math.Sin(radian) * width;
                var row = Math.Cos(radian) * width;
                var pageWidth = document.Pages[1].GetPageRect(false).Width;
                var pageHeight = document.Pages[1].GetPageRect(false).Height;
                int watermarkRowNum = (int)(pageHeight / top * density);
                int watermarkColumnNum = (int)(pageHeight / row * density);
                if (rotation == 0)
                {
                    watermarkRowNum = (int)(pageHeight / fontSize * density);
                    watermarkColumnNum = (int)(pageHeight / width * density);
                }

                /*计算水印详细-end*/
                for (int i = 1; i <= document.Pages.Count; i++)
                {

                    WatermarkArtifact artifact = new WatermarkArtifact();
                    artifact.SetTextAndState(watermarkText, new TextState
                    {
                        FontSize = fontSize,
                        ForegroundColor = fontColor,
                        Font = FontRepository.FindFont(typeface),
                    });
                    artifact.Rotation = rotation;
                    artifact.Opacity = opacity;
                    artifact.IsBackground = false;
                    artifact.ArtifactHorizontalAlignment = HorizontalAlignment.Left;
                    artifact.ArtifactVerticalAlignment = VerticalAlignment.Top;
                    for (int j = 1; j <= watermarkColumnNum; j++)
                    {
                        artifact.LeftMargin = (j - 1) * (pageWidth / watermarkColumnNum) + fontSize;
                        for (int z = 1; z <= watermarkRowNum; z++)
                        {
                            artifact.TopMargin = (z - 1) * (pageHeight / watermarkRowNum) + top;
                            document.Pages[i].Artifacts.Add(artifact);
                        }
                    }
                }
                Stream outStream = new MemoryStream();
                document.Save(outStream, SaveFormat.Pdf);
                outStream.Seek(0, SeekOrigin.Begin);
                return outStream;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

调用代码部分代码:

Stream stream = File.OpenRead(@"C:\Users\HEDY\Desktop\Test\2.pdf");
            var outStream = AddTextWatermarkCustom(stream, "测试水印文字", 32, Color.Blue, "SimSun", 45, 0.5, 6, 3);
            var saveStream = new FileStream($@"C:\Users\HEDY\Desktop\Test\1_{Guid.NewGuid()}.pdf", FileMode.Create);
            outStream.CopyTo(saveStream);
            outStream.Close();
            saveStream.Close();

 

2、添加图片水印

 /// <summary>
        /// pdf添加图片水印(自定义水印行数和列数)
        /// </summary>
        /// <param name="pdfStream">pdf文件流</param>
        /// <param name="imgurl">水印文字</param>
        /// <param name="rotation">倾斜角度</param>
        /// <param name="opacity">不透明度(值为:0-1)</param>
        /// <param name="watermarkRowNum">水印行数</param>
        /// <param name="watermarkColumnNum">水印列数</param>
        /// <returns></returns>
        public Stream AddImgWatermarkCustom(Stream pdfStream, string imgPath, double rotation = 0, double opacity = 0, int watermarkRowNum = 1, int watermarkColumnNum = 1)
        {
            try
            {
                /*计算倾斜高度-start*/
                var angle = Math.Abs(rotation);
                var pic = new Bitmap(imgPath);
                var width = pic.Width;
                var radian = 2 * Math.PI / 360 * angle;
                var top = Math.Sin(radian) * width;
                /*计算倾斜高度-end*/
                Document document = new Document(pdfStream);
                for (int i = 1; i <= document.Pages.Count; i++)
                {
                    var pageWidth = document.Pages[i].GetPageRect(false).Width;
                    var pageHeight = document.Pages[i].GetPageRect(false).Height;
                    WatermarkArtifact artifact = new WatermarkArtifact();
                    artifact.SetImage(File.OpenRead(imgPath));
                    artifact.Rotation = rotation;
                    artifact.Opacity = opacity;
                    artifact.IsBackground = false;
                    if (watermarkRowNum == 1 && watermarkColumnNum == 1)
                    {
                        artifact.ArtifactHorizontalAlignment = HorizontalAlignment.Center;
                        artifact.ArtifactVerticalAlignment = VerticalAlignment.Center;
                        document.Pages[i].Artifacts.Add(artifact);
                    }
                    else
                    {
                        artifact.ArtifactHorizontalAlignment = HorizontalAlignment.Left;
                        artifact.ArtifactVerticalAlignment = VerticalAlignment.Top;
                        for (int j = 1; j <= watermarkColumnNum; j++)
                        {
                            artifact.LeftMargin = (j - 1) * (pageWidth / watermarkColumnNum) + pic.Height;
                            for (int z = 1; z <= watermarkRowNum; z++)
                            {
                                artifact.TopMargin = (z - 1) * (pageHeight / watermarkRowNum) + top;
                                document.Pages[i].Artifacts.Add(artifact);
                            }
                        }
                    }
                }
                Stream outStream = new MemoryStream();
                document.Save(outStream, SaveFormat.Pdf);
                outStream.Seek(0, SeekOrigin.Begin);
                return outStream;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// pdf添加图片水印(平铺)
        /// </summary>
        /// <param name="pdfStream">pdf文件流</param>
        /// <param name="watermarkText">水印文字</param>
        /// <param name="rotation">倾斜角度</param>
        /// <param name="opacity">不透明度(值为:0-1)</param>
        /// <param name="density">水印密度(值为0-1)</param>
        /// <returns></returns>
        public Stream AddImgWatermarkTile(Stream pdfStream, string imgPath, double rotation = 0, double opacity = 0, double density = 1)
        {
            try
            {
                Document document = new Document(pdfStream);
                /*计算水印详细-start*/
                var angle = Math.Abs(rotation);
                var pic = new Bitmap(imgPath);
                var width = pic.Width;
                var imgHeight = pic.Height;
                var radian = 2 * Math.PI / 360 * angle;
                var top = Math.Sin(radian) * width;
                var row = Math.Cos(radian) * width;
                var pageWidth = document.Pages[1].GetPageRect(false).Width;
                var pageHeight = document.Pages[1].GetPageRect(false).Height;
                int watermarkRowNum = (int)(pageHeight / top * density);
                int watermarkColumnNum = (int)(pageHeight / row * density);
                if (rotation == 0)
                {
                    watermarkRowNum = (int)(pageHeight / imgHeight * density);
                    watermarkColumnNum = (int)(pageHeight / width * density);
                }

                /*计算水印详细-end*/
                for (int i = 1; i <= document.Pages.Count; i++)
                {

                    WatermarkArtifact artifact = new WatermarkArtifact();
                    artifact.SetImage(File.OpenRead(imgPath));
                    artifact.Rotation = rotation;
                    artifact.Opacity = opacity;
                    artifact.IsBackground = false;
                    artifact.ArtifactHorizontalAlignment = HorizontalAlignment.Left;
                    artifact.ArtifactVerticalAlignment = VerticalAlignment.Top;
                    for (int j = 1; j <= watermarkColumnNum; j++)
                    {
                        artifact.LeftMargin = (j - 1) * (pageWidth / watermarkColumnNum) + imgHeight;
                        for (int z = 1; z <= watermarkRowNum; z++)
                        {
                            artifact.TopMargin = (z - 1) * (pageHeight / watermarkRowNum) + top;
                            document.Pages[i].Artifacts.Add(artifact);
                        }
                    }
                }
                Stream outStream = new MemoryStream();
                document.Save(outStream, SaveFormat.Pdf);
                outStream.Seek(0, SeekOrigin.Begin);
                return outStream;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

调用代码部分代码:

Stream stream = File.OpenRead(@"C:\Users\HEDY\Desktop\Test\2.pdf");
            var outStream = AddImgWatermarkTile(stream, @"C:\Users\HEDY\Desktop\Test\123.jpg", 0, 0.5,0.5);
            var saveStream = new FileStream($@"C:\Users\HEDY\Desktop\Test\1_{Guid.NewGuid().ToString("N")}.pdf", FileMode.Create);
            outStream.CopyTo(saveStream);
            outStream.Close();
            saveStream.Close();
所有附件
该文章没有附件.
本文为原创文章,请注意保留出处!

热门文章

修复群晖Synology Drive client右键菜单缺失问题 本教程主要解决windows10右键菜单中没有SynologyDrive菜单的问题,整体思路是找到...修复群晖SynologyDriveclient右键菜单缺失问题 作者:Pastore Antonio
1831 浏览量
docker如何查看一个镜像内部的目录结构及其内部都有哪些文件 前言:有时候我们会在docker上下载一个镜像,或者是上传一个镜像到docker上,甚至有时候就是在...docker如何查看一个镜像内部的目录结构及其内部都有哪些文件 作者:Pastore Antonio
1811 浏览量
configure: error: Package requirements (oniguruma) were not met configure:error:Packagerequirements(oniguruma)...configure:error:Packagerequirements(oniguruma)werenotmet 作者:Pastore Antonio
1540 浏览量
Adobe Acrobat Pro 激活 这里记录了一些AdobeAcrobat的激活教程和组件。浏览量:1,692 作者:Pastore Antonio
1538 浏览量
追寻日出,找回自己 为什么我要去追寻日出?其实我是一个很懒的人,每次都起不来,直到有一次我在租房中睡到了大天亮,阳光照...追寻日出,找回自己 作者:Pastore Antonio
1524 浏览量