C#在pdf中添加水印

使用的技术

1.Apose.Cells 用于将Excel转化为PDF
2.Apose.Words 用于将Word转化为PDF
3.Itextsharp 用于在PDF上面添加水印

代码

public WaterResult pdfWatermark(string fileUrl, string fileNameAll, string watermark1, string watermark2,string watermark3, int fontSize1 = 40, int fontSize2 = 20)
        {
            HttpWebRequest fileRequest = WebRequest.Create(fileUrl) as HttpWebRequest;
            HttpWebResponse fileResponse = fileRequest.GetResponse() as HttpWebResponse;
            Stream fileStream = fileResponse.GetResponseStream();
            WaterResult waterResult = new WaterResult();

            //获取根目录
            string mainURL = AppDomain.CurrentDomain.BaseDirectory;
            //判断路径是否存在
            if (!Directory.Exists($@"{mainURL}\PdfFile\"))
            {
                Directory.CreateDirectory($@"{mainURL}\PdfFile\");
            }
            //文件名称不带后缀
            string fileName = Path.GetFileNameWithoutExtension(fileNameAll);
            //时间和Guid
            string time = DateTime.Now.ToString("yyyyMMdd") + "-" + Guid.NewGuid();
            //后缀
            string fileSuffix = Path.GetExtension(fileNameAll);
            //默认后缀
            string pdfSuffix = ".pdf";
            //临时路径
            string onePath = string.Empty;
            //文件流
            //Stream fileStream = null;
            //Stream fileLastStream = null;
            if (fileSuffix == ".docx" || fileSuffix == ".doc")
            {
                onePath = $@"{mainURL}\PdfFile\Word{fileName}{pdfSuffix}";
                //格式转换
                MemoryStream ms = StreamToMemoryStream(fileStream);
                Aspose.Words.Document doc = new Aspose.Words.Document(ms);
                doc.Save(onePath, Aspose.Words.SaveFormat.Pdf);
                //开启文件流
                fileStream = new FileStream(onePath, FileMode.OpenOrCreate);
            }
            else if (fileSuffix == ".xlsx" || fileSuffix == ".xls")
            {
                onePath = $@"{mainURL}\PdfFile\Excel{fileName}{pdfSuffix}";
                //格式转换
                MemoryStream ms = StreamToMemoryStream(fileStream);
                Aspose.Cells.Workbook wb = new Aspose.Cells.Workbook(ms);
                wb.Save(onePath, Aspose.Cells.SaveFormat.Pdf);
                //开启文件流
                fileStream = new FileStream(onePath, FileMode.OpenOrCreate);
            }
            else
            {
                if (fileSuffix != ".pdf")
                {
                    waterResult.susses = false;
                    waterResult.filePath = string.Empty;
                    waterResult.msg= $"{fileSuffix}格式的文件暂不予处理";
                    return waterResult;
                }
            }
            //格式为pdf的文件开启文件流
            //if(fileStream == null)fileStream = new FileStream(filePath, FileMode.OpenOrCreate);
            //文件名(全)
            fileName = fileName + pdfSuffix;
            //最后保存路径
            var tempPath = $@"{mainURL}\PdfFile\{fileName}";
            PdfReader pdfReader = null;
            PdfStamper pdfStamper = null;
          
            try
            {
                //实例化itextSharp
                pdfReader = new PdfReader(fileStream);
                pdfStamper = new PdfStamper(pdfReader, new FileStream(tempPath, FileMode.OpenOrCreate));
                //总页数
                int total = pdfReader.NumberOfPages + 1;
                iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);
                float width = psize.Width;
                float height = psize.Height;
                PdfContentByte content;
                // 中文适配
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                //设置字体,需要有字体文件,网上自行下载
                BaseFont font = BaseFont.CreateFont($@"{mainURL}\Font\STChangmou_XM.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                PdfGState gs = new PdfGState();
                for (int i = 1; i < total; i++)
                {
                    content = pdfStamper.GetOverContent(i);//在内容上方加水印
                    //content = pdfStamper.GetUnderContent(i);//在内容下方加水印
                    //透明度
                    gs.FillOpacity = 0.4f;
                    content.SetGState(gs);
                    //content.SetGrayFill(0.3f);
                    //开始写入文本
                    content.BeginText();
                    content.SetColorFill(BaseColor.GRAY);
                    content.SetTextMatrix(0, 0);
                    if (!string.IsNullOrEmpty(watermark1))
                    {
                        content.SetFontAndSize(font, fontSize1);
                        content.ShowTextAligned(Element.ALIGN_CENTER, watermark1, width / 2, height / 4+50, 38);
                        content.SetFontAndSize(font, fontSize1);
                        content.ShowTextAligned(Element.ALIGN_CENTER, watermark1, width / 2, height / 4*3 + 50-(height/10), 38);
                    }
                    if (!string.IsNullOrEmpty(watermark2))
                    {
                        content.SetFontAndSize(font, fontSize1);
                        content.ShowTextAligned(Element.ALIGN_CENTER, watermark2, width / 2, height / 4-50, 38);
                        content.SetFontAndSize(font, fontSize1);
                        content.ShowTextAligned(Element.ALIGN_CENTER, watermark2, width / 2, height / 4 * 3 - 50-(height / 10), 38);
                    }
                    if (!string.IsNullOrEmpty(watermark3))
                    {
                        content.SetFontAndSize(font, fontSize2);
                        content.ShowTextAligned(Element.ALIGN_CENTER, watermark3, width - 100, 10, 0);
                    }
                    content.EndText();
                }
                waterResult.susses = true;
                waterResult.filePath = tempPath;
                waterResult.msg = $"水印添加成功";
                return waterResult;
            }
            catch (Exception ex)
            {
                waterResult.susses = false;
                waterResult.filePath = string.Empty;
                waterResult.msg = $"水印添加失败";
                return waterResult;
            }
            finally
            {
                if (pdfStamper != null) pdfStamper.Close();
                if (pdfReader != null) pdfReader.Close();
                if (fileStream != null) fileStream.Close();
                //if (fileLastStream != null) fileLastStream.Close();
                if (!string.IsNullOrEmpty(onePath)) File.Delete(onePath);
                conn.Logout();
                //if (!string.IsNullOrEmpty(tempPath)) File.Delete(tempPath);
            }
        }
        //文件流转内存流
       	public static MemoryStream StreamToMemoryStream(Stream stream)
        {
            MemoryStream memoryStream = new MemoryStream();

            //将基础流写入内存流
            const int bufferLength = 1024;
            byte[] buffer = new byte[bufferLength];
            int actual = stream.Read(buffer, 0, bufferLength);
            while (actual > 0)
            {
                memoryStream.Write(buffer, 0, actual);
                actual = stream.Read(buffer, 0, bufferLength);
            }
            memoryStream.Position = 0;

            return memoryStream;
        }
        public class WaterResult
        {
            public bool susses { set; get; }
            public string filePath { set; get; }
            public string msg { set; get; }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值