首页 > 编程语言 >【转】[C#] Aspose.pdf 添加文字水印

【转】[C#] Aspose.pdf 添加文字水印

时间:2024-11-26 18:02:33浏览次数:7  
标签:C# 水印 int Aspose var pdf Document Math

转自:https://www.cnblogs.com/Shi-zy/p/15494760.html

另一篇:https://www.cnblogs.com/z5337/p/7344636.html

用aspose.word把word 转pdf 的代码段:

            Document pdfDocument = new Document(@"D:\pdfdir\jhrs.com.pdf");
            for (int pageCount = 1; pageCount <= pdfDocument.Pages.Count; pageCount++)
            {
                using (FileStream imageStream = new FileStream($"jhrs.com_{i}.png", FileMode.Create))
                {
                    Resolution resolution = new Resolution(300);
                    PngDevice pngDevice = new PngDevice(resolution);
                    pngDevice.Process(pdfDocument.Pages[pageCount], imageStream);
                    imageStream.Close();
                }
            }
Aspose.pdf 添加文字水印
        /// <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();

 

标签:C#,水印,int,Aspose,var,pdf,Document,Math
From: https://www.cnblogs.com/z5337/p/18570686

相关文章

  • AI绘画Stable Diffusion教程|SD Comfyui必备流程节点教程菜鸟轻松成高手云端部署 第一
    大家好,这次又来给大家更新SDcomfyui的节点教程了。这一次我们换一种教程的方式先不介绍各种具体的工作流和插件而是按照节点的方式,一点点把Comfyui里的节点讲透,那今天讲的就是最基础的节点模型加载器了。一、Comfyui加载器与工作流的关系根据不同工作流的需求,一个工作流可......
  • AI绘画Stable Diffusion教程|SD Comfyui必备流程节点教程菜鸟轻松成高手云端部署 第二
    大家好,这次又来给大家更新SDcomfyui的节点教程了。昨天我们讲解了Comfyui加载器节点的教程,那今天讲的就是另一个比较基础的节点,条件节点。所谓的条件节点最直观的应该就是在文生图工作流中不可或缺的正面提示词和负面提示词,这两个就是最直白的条件节点。条件节点的放入位置一......
  • 麒麟v10上安装麒麟桌面和VNC
    直接上命令yum-ygroupinstall"ServerwithUKUIGUI"yum-yinstalltigervnc-server.x86_64systemctlget-defaultsystemctlset-defaultgraphical.targetvncpasswdcp/lib/systemd/system/vncserver@.service/etc/systemd/system/vncserver@:1.service......
  • 《解读 freeRTOS queue.c 源码:探寻任务间高效通信的核心机制》(建议收藏)
    摘要:文章介绍了FreeRTOS中的队列机制,包括队列的基本概念、创建与初始化方式、数据操作(发送、接收、查看等)、状态查询与管理、在互斥量与信号量中的应用以及队列集的相关操作建议:作者在这里建议,结合queue.c源码来看效果会更好一下FreeRTOS队列:任务间通信与同步的高效利器......
  • 如何激活CATIA许可证
    轻松激活CATIA许可证,开启设计新征程在工程设计领域,CATIA软件以其卓越的性能和广泛的应用而备受推崇。然而,对于许多新手用户来说,激活CATIA许可证可能是一个令人困惑的步骤。本文将为您提供详细的指导,帮助您轻松激活CATIA许可证,迅速开启设计新征程。一、了解CATIA许可证激活的重要......
  • 宝塔面板易优CMS建站教程:海外服务器选择与详细安装步骤
    一、什么是易优CMS?易优CMS(EyouCMS)是一款国内非常流行的内容管理系统,操作简单,支持多语言和多功能扩展,非常适合企业官网、个人网站以及电商等类型的站点建设。它能够帮助用户快速搭建网站,易于维护,并且非常适合进行SEO优化。二、准备工作选择服务器与域名搭建网站的第一步是选择......
  • LeetCode234 回文链表
    LeetCode234回文链表题目链接:LeetCode描述给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。示例输入:head=[1,2,2,1]输出:true输入:head=[1,2]输出:false方法一思路首先找到链表的中间结点mid:如果链表有奇数个节......
  • Avalonia 中使用 CEF 在 Ubuntu 运行崩溃分析
    在Linux上使用Avalonia和CefGlue:崩溃分析介绍本文主要记录了在Avalonia中使用CefGlue(基于.NET的Chrome嵌入内核的封装库)时遇到的问题,目的是测试Avalonia的Chrome内核在Linux系统中的兼容性。然而在实际运行时,我们意外地遇到了运行崩溃的问题。环境测试环境......
  • P3613 【深基15.例2】寄包柜(c嘎嘎)
    题目链接:P3613【深基15.例2】寄包柜-洛谷|计算机科学教育新生态难度:普及题目分析:观察题目要求,很容易想到用二维数组来解决这个问题。但真就这么简单的 AC了吗?如果真这么简单就好了,开一个数组a[1e5][1e5]空间复杂度是1e5*1e5*4(字节)约等于40gb而题目要求是128mb。......
  • Canal快速开始
    目录一、Canal简介​编辑二、Canal快速开始准备启动总结一、Canal简介        早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步......