C# 在PDF中添加和删除水印注释 (Watermark Annotation)

目录

使用工具

C# 在PDF文档中添加水印注释

C# 在PDF文档中删除水印注释


PDF中的水印注释是一种独特的注释类型,它通常以透明的文本或图片形式叠加在页面内容之上,为文档添加标识或信息提示。与传统的静态水印不同,水印注释并不会永久嵌入到PDF页面的内容中,而是以独立注释对象的形式存在。这种设计结合了水印的标记功能与注释的灵活性,使用户能够方便地删除水印,而无需影响文档的核心内容。非常适合标记 “草稿” 或 “保密” 文件,或为文档添加临时说明等场景。这篇博客将探讨如何使用C# 在PDF文档中添加和删除水印注释

  • C# 在PDF文档中添加水印注释
  • C# 在PDF文档中删除水印注释

使用工具

要使用C# 在PDF文档中添加和删除水印注释,需要用到合适的PDF文档处理库。本文所使用的是Spire.PDF for .NET库。该库主要用于在 .NET 应用程序中创建、读取、编辑、转换 和打印PDF 文档。

安装 Spire.PDF for .NET

你可以在 NuGet 包管理器中运行以下命令安装 Spire.PDF for .NET:

PM> Install-Package Spire.PDF

C# 在PDF文档中添加水印注释

Spire.PDF for .NET中的PdfWatermarkAnnotation类用于创建水印注释。创建后,你可以将其添加到你的PDF文档的页面中。以下是将水印注释添加到PDF文档的具体步骤:

  • 加载PDF文档: 创建PdfDocument对象,并使用LoadFromFile方法加载目标PDF文件。
  • 设置水印文本的字体: 创建一个PdfTrueTypeFont对象,设置所需的字体、大小和样式(例如,宋体、22pt、常规)。此字体将用于呈现水印文本。
  • 生成水印外观模板: 使用PdfTemplate对象定义一个与页面大小匹配的画布。在此模板上,使用PdfTilingBrush对象绘制水印文本。
  • 遍历页面并应用水印: 遍历PDF文档的所有页面。对于每一页:
    • 使用RectangleF对象定义水印注释的区域,确保其覆盖整个页面。
    • 创建PdfWatermarkAnnotation对象,并为其指定区域。
    • 设置水印注释的外观为预定义的模板。
    • 将水印注释添加到页面的Annotations集合中。
  • 保存修改后的PDF 使用SaveToFile方法将添加水印注释后的PDF文档保存为新文件。

以下代码展示了如何使用C#为PDF文档添加水印注释:

using Spire.Pdf;
using Spire.Pdf.Annotations;
using Spire.Pdf.Annotations.Appearance;
using Spire.Pdf.Graphics;
using System.Drawing;namespace WatermarkAnnotation
{internal class Program{static void Main(string[] args){// 创建PdfDocument对象PdfDocument pdf = new PdfDocument();// 加载PDF文档pdf.LoadFromFile("测试.pdf");// 创建PdfTrueTypeFont对象,用于渲染水印文本PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", 22.0f, FontStyle.Regular), true);// 遍历所有页面for (int i = 0; i < pdf.Pages.Count; i++){PdfPageBase page = pdf.Pages[i];// 创建与页面大小匹配的PdfTemplate对象PdfTemplate template = new PdfTemplate(page.GetClientSize().Width, page.GetClientSize().Height);// 调用函数将水印文本插入模板InsertWatermark(template, font, "保密");// 定义页面上应用水印注释的区域RectangleF loRect = new RectangleF(0.0f, 0.0f, page.GetClientSize().Width, page.GetClientSize().Height);// 创建水印注释PdfWatermarkAnnotation watermarkAnnotation = new PdfWatermarkAnnotation(loRect);// 设置水印注释的外观PdfAppearance appearance = new PdfAppearance(watermarkAnnotation);appearance.Normal = template;watermarkAnnotation.Appearance = appearance;watermarkAnnotation.Text = "ID_0";// 设置矩阵变换以控制水印的位置和缩放watermarkAnnotation.SetMatrix(new float[] { 1, 0, 0, 1, 0, 0 });// 设置水平偏移量watermarkAnnotation.SetHorizontalTranslation(0.5f);// 设置垂直偏移量watermarkAnnotation.SetVerticalTranslation(0.5f);// 将水印注释添加到当前页面page.Annotations.Add(watermarkAnnotation);}// 保存更新后的PDF文档pdf.SaveToFile("添加水印注释.pdf");pdf.Dispose();}// 定义一个静态方法用于在PDF模板中绘制水印static void InsertWatermark(PdfTemplate template, PdfTrueTypeFont font, string watermark){// 创建一个SizeF对象,用于设置水印刷子的大小SizeF size = new SizeF(template.Width / 2, template.Height / 3);// 创建PdfTilingBrush对象,用于重复绘制水印图案PdfTilingBrush brush = new PdfTilingBrush(size);// 设置水印透明度brush.Graphics.SetTransparency(0.3f);// 保存当前Graphic状态brush.Graphics.Save();// 平移Graphic,使其中心与水印刷子的中心对齐brush.Graphics.TranslateTransform(brush.Size.Width / 2, brush.Size.Height / 2);// 旋转Graphic,目的是使水印倾斜45度brush.Graphics.RotateTransform(-45);// 在Graphic上绘制水印文字,使用指定的字体、颜色和居中对齐方式brush.Graphics.DrawString(watermark, font, PdfBrushes.Violet, 0, 0, new PdfStringFormat(PdfTextAlignment.Center));brush.Graphics.Restore();// 重置水印透明度为1brush.Graphics.SetTransparency(1f);// 将水印图案绘制到整个模板区域RectangleF loRect = new RectangleF(0.0f, 0.0f, template.Size.Width, template.Size.Height);template.Graphics.DrawRectangle(brush, loRect);}}
}

C# 给PDF添加水印

C# 在PDF文档中删除水印注释

在某些情况下,你可能需要从PDF文档中删除水印注释,特别是在准备最终版本文档时,或者当水印不再需要时。以下是从PDF文档中删除水印注释的具体步骤:

  • 加载PDF文档: 创建PdfDocument对象,并使用LoadFromFile方法加载包含水印注释的PDF文件。
  • 遍历页面: 使用for循环遍历PDF文档中的所有页面。对于每一页:
    • 访问页面的Annotations集合,该集合包含所有应用于页面的注释。
  • 识别并删除水印注释: 在每页的注释集合中:
    • 循环遍历集合中的注释。
    • 检查当前注释是否为PdfWatermarkAnnotation类型(水印注释)。
    • 如果注释是PdfWatermarkAnnotation类型,则从页面的Annotations集合中删除它。
  • 保存更新后的PDF 使用SaveToFile方法将删除水印注释后的PDF文档保存为新文件。

以下代码展示了如何使用C#从PDF文档中删除水印注释:

using Spire.Pdf;
using Spire.Pdf.Annotations;namespace RemoveWatermarkAnnotation
{internal class Program{static void Main(string[] args){// 创建PdfDocument对象PdfDocument pdf = new PdfDocument();// 加载包含水印注释的PDF文档pdf.LoadFromFile("添加水印注释.pdf");// 遍历所有页面for (int i = 0; i < pdf.Pages.Count; i++){var annotations = pdf.Pages[i].Annotations;// 遍历所有注释for (int j = annotations.Count - 1; j >= 0; j--){// 如果是水印注释,则移除if (annotations[j] is PdfWatermarkAnnotation){annotations.Remove(annotations[j]);}}}// 保存更新后的PDF文档pdf.SaveToFile("删除水印注释.pdf");pdf.Dispose();}}
}

C# 删除PDF水印

以上就是使用C# 在PDF中添加和删除水印注释的全部内容。感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501524.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分析服务器 systemctl 启动gozero项目报错的解决方案

### 分析 systemctl start beisen.service 报错 在 Linux 系统中&#xff0c;systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时&#xff0c;如果服务启动失败&#xff0c;systemctl 会输出错误信息&#xff0c;帮助我们诊断和解决问题。 本文将通过一个实际的…

Dubbo扩展点加载机制

加载机制中已经存在的一些关键注解&#xff0c;如SPI、©Adaptive> ©Activateo然后介绍整个加载机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍扩展中使用的类动态编译的实 现原理。 Java SPI Java 5 中的服务提供商https://docs.oracle.com/jav…

如何利用Logo设计免费生成器创建专业级Logo

在当今的商业世界中&#xff0c;一个好的Logo是品牌身份的象征&#xff0c;它承载着公司的形象与理念。设计一个专业级的Logo不再需要花费大量的金钱和时间&#xff0c;尤其是当我们拥有Logo设计免费生成器这样的工具时。接下来&#xff0c;让我们深入探讨如何利用这些工具来创…

游戏如何检测iOS越狱

不同于安卓的开源生态&#xff0c;iOS一直秉承着安全性更高的闭源生态&#xff0c;系统中的硬件、软件和服务会经过严格审核和测试&#xff0c;来保障安全性与稳定性。 据FairGurd观察&#xff0c;虽然iOS系统具备一定的安全性&#xff0c;但并非没有漏洞&#xff0c;如市面上…

智联视频超融合平台:电力行业的智能守护者

文章目录 一、远程实时监控与设备状态监测二、提高应急响应能力三、实现无人值守与减员增效四、保障电力设施安全与防范外部破坏五、提升电网运行管理效率与决策科学性六、助力电力企业数字化转型与智能化发展七、智联视频超融合平台 在当今数字化浪潮下&#xff0c;视频联网平…

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history&#xff0c;表示同时删除 IDEA 本地缓存以及历史。 Delete I…

计算机网络•自顶向下方法:路由选路算法

路由选路算法 在网络层中&#xff0c;选路是指数据包从源主机到目的主机的传输过程中&#xff0c;如何通过网络中的路由器选择一条合适的路径。路由器根据网络拓扑、路由表、协议规则等来决定如何将数据包转发到下一跳&#xff0c;直到数据包到达目的地。 选路算法分类 静态算…

Qemu配置QXL显卡支持分辨率

默认情况下&#xff0c;创建的vm的视频RAM限制为16MB。在win操作系统中分辨率最高就只能调到1024x768。 <video><model typecirrus vram16384 heads1 primaryyes/><address typepci domain0x0000 bus0x00 slot0x02 function0x0/> </video>单单修改ram…

【区块链】零知识证明基础概念详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 零知识证明基础概念详解引言1. 零知识证明的定义与特性1.1 基本定义1.2 三个核心…

Redis面试相关

Redis开篇 使用场景 缓存 缓存穿透 解决方法一&#xff1a; 方法二&#xff1a; 通过多次hash来获取对应的值。 小结 缓存击穿 缓存雪崩 打油诗 双写一致性 两种不同的要求 强一致 读锁代码 写锁代码 强一致&#xff0c;性能低。 延迟一致 方案一&#xff1a;消息队列 方…

以太网协议和LWIP协议详解

一、以太网协议简介 以太网是一种产生较早&#xff0c;使用相当广泛的局域网技术。目前以太网根据速度等级分类大概分为&#xff1a;标准以太网&#xff08;10Mbit/s&#xff09;&#xff0c;快速以太网&#xff08;100Mbit/s&#xff09;&#xff0c;千兆以太网&#xff08;1…

Qt|QWidget窗口支持旋转

功能实现&#xff1a;使用QWidget创建的窗口支持窗口旋转功能。 展示的示例中支持由水平方向旋转至垂直方向。至于其它角度旋转的问题&#xff0c;看完这篇文章后应该会很简单能实现的&#xff01; 开发环境&#xff1a;win VS2019 Qt 5.15.2 在实现之前也有想用使用 QProp…

微信小程序滑动解锁、滑动验证

微信小程序简单滑动解锁 效果 通过 movable-view &#xff08;可移动的视图容器&#xff0c;在页面中可以拖拽滑动&#xff09;实现的简单微信小程序滑动验证 movable-view 官方说明&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/movable-view.ht…

微服务实战——购物车模块实战

购物车 1. 数据模型分析 1.1. 需求描述 用户可以在登录状态下将商品添加到购物车【用户购物车/在线购物车】 放入数据库mongodb放入 redis&#xff08;采用&#xff09; 登录以后&#xff0c;会将临时购物车的数据全部合并过来&#xff0c;并清空临时购物车&#xff1b; 用…

1961-2022年中国大陆多干旱指数数据集(SPI/SPEI/EDDI/PDSI/SC-PDSI/VPD)

DOI: 10.5194/essd-2024-270 干旱指数对于评估和管理缺水和农业风险至关重要;然而&#xff0c;现有数据集中缺乏统一的数据基础&#xff0c;导致不一致&#xff0c;对干旱指数的可比性提出了挑战。本研究致力于创建CHM_Drought&#xff0c;这是一个创新且全面的长期气象干旱数…

xilinx的高速接口构成原理和连接结构及ibert工具的使用-以k7 GTX为例

一、相关简介 Xilinx的高速接口称之为transceivers(高速收发器&#xff09;&#xff0c;这部分的电路是专用电路&#xff0c;供电等都是独立的&#xff0c;根据速率可以分为GTP/GTX/GTH/GTY/GTM等。 Xilinx的高速接口是QUAD为单位的&#xff0c;没一个QUAD由一个时钟COMMON资…

机器学习之模型评估——混淆矩阵,交叉验证与数据标准化

目录 混淆矩阵 交叉验证 数据标准化 0-1标准化 z 标准化 混淆矩阵 混淆矩阵&#xff08;Confusion Matrix&#xff09;是一种用于评估分类模型性能的工具。 它是一个二维表格&#xff0c;其中行表示实际的类别&#xff0c;列表示模型预测的类别。 假设我们有一个二分类问题&…

第R3周:RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前言二、代码流程1、导入包&#xff0c;设置GPU2、导入数据3、数据处理4、构建RNN模型5、编译模型6、模型训练7、模型评估 电脑环境&#xff1a;…

40% 降本:多点 DMALL x StarRocks 的湖仓升级实战

小编导读&#xff1a; 多点 DMALL 成立于2015年&#xff0c;持续深耕零售业&#xff0c;为企业提供一站式全渠道数字零售解决方案 DMALL OS。作为 DMALL OS 数字化能力的技术底座&#xff0c;大数据平台历经多次迭代平稳支撑了公司 To B 业务的快速开展。随着国家产业升级和云原…

C语言——字符函数和内存函数

目录 前言 字符函数 1strlen 模拟实现 2strcpy 模拟实现 3strcat 模拟实现 4strcmp 模拟实现 5strncpy 模拟实现 6strncat 模拟实现 7strncmp 模拟实现 8strstr 模拟实现 9strtok 10strerror 11大小写字符转换函数 内存函数 1memcpy 模拟实现 2…