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.mzph.cn/diannao/66034.shtml

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

相关文章

LLVM防忘录

目录 Windows中源码编译LLVMWindows下编译LLVM Pass DLL Windows中源码编译LLVM 直接从llvm-project下载源码, 然后解压后用VS2022打开该目录, 然后利用VS的开发终端执行: cmake -S llvm -B build -G "Visual Studio 17 2022" -DLLVM_ENABLE_PROJECTSclang -DLLVM_…

解释一下:运放的输入失调电流

输入失调电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…

【双指针】算法题(二)

【双指针】算法题&#xff08;二&#xff09; 前言&#xff1a; 这里是几道算法题&#xff0c;双指针说明在上一章。 一、有效三角形的个数 题目链接&#xff1a; 有效三角形的个数 题目叙述&#xff1a; 解法一&#xff1a;暴力循环&#xff0c;叠加三层for循环&#xff0c…

docker 安装influxdb

docker pull influxdb mkdir -p /root/influxdb/data docker run -d --name influxdb -p 8086:8086 -v /root/influxdb/data:/var/lib/influxdb influxdb:latest#浏览器登录&#xff1a;http://192.168.31.135:8086&#xff0c;首次登录设置用户名密码&#xff1a;admin/admin1…

深入剖析MySQL数据库架构:核心组件、存储引擎与优化策略(四)

慢查询日志&#xff0c;顾名思义&#xff0c;就是查询慢的日志&#xff0c;是指mysql记录所有执行超过long_query_time&#xff08;默认的时间10秒&#xff09;参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下&#xff0c;慢查询日志是…

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…

MT8788安卓核心板_MTK8788核心板参数_联发科模块定制开发

MT8788安卓核心板是一款尺寸为52.5mm x 38.5mm x 2.95mm的高集成度电路板&#xff0c;专为各种智能设备应用而设计。该板卡整合了处理器、图形处理单元(GPU)、LPDDR3内存、eMMC存储及电源管理模块&#xff0c;具备出色的性能与低功耗特性。 这款核心板搭载了联发科的MT8788处理…

Linux实验报告14-Linux内存管理实验

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 1、编辑模块的源代码mm_viraddr.c 2、编译模块 3、编写测试程序mm_test.c 4、编译测试程序mm_test.c 5、在后台运行mm_test 6、验证mm_viraddr模块 一&#xff1a;实验目的 (1)掌握内核空间、用户空间&#xff…

SAP物料主数据界面增加客制化字段、客制化页签的方式

文章目录 前言一、不增加页签&#xff0c;只增加客制化字段二、增加物料主数据页签 前言 【SAP系统MM模块研究】 #SAP #MM #物料 #客制化 #物料主数据 项目上难免会遇到客户要在物料主数据的界面上&#xff0c;增加新字段的需求。 实现方式有&#xff1a; &#xff08;1&…

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中&#xff0c;画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流&#xff08;程&#xff09;图 Data Flow Diagram&#xff0c;DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具&#xff0c;可以将…

U盘数据恢复实战指南与预防策略

一、U盘数据恢复初探 U盘数据恢复&#xff0c;简而言之&#xff0c;是指当U盘中的数据因各种原因丢失、损坏或无法访问时&#xff0c;通过特定技术和工具&#xff0c;将丢失的数据重新找回的过程。U盘作为现代生活中不可或缺的便携式存储设备&#xff0c;其数据安全性和稳定性…

持续大额亏损,销量增幅有限,北汽蓝谷依旧黯然神伤

撰稿 | 行星 来源 | 贝多财经 “起了个大早&#xff0c;赶了个晚集”&#xff0c;用在如今的北汽蓝谷身上再合适不过。 2025年的第一个工作日&#xff0c;北汽蓝谷新能源科技股份有限公司&#xff08;SH:600733&#xff0c;简称“北汽蓝谷”&#xff09;对外披露了子公司北京…

【微软,模型规模】模型参数规模泄露:理解大型语言模型的参数量级

模型参数规模泄露&#xff1a;理解大型语言模型的参数量级 关键词&#xff1a; #大型语言模型 Large Language Model #参数规模 Parameter Scale #GPT-4o #GPT-4o-mini #Claude 3.5 Sonnet 具体实例与推演 近日&#xff0c;微软在一篇医学相关论文中意外泄露了OpenAI及Claud…

Elasticsearch JavaRestClient版

文章目录 初始化RestHighLeveClient&#xff08;必要条件&#xff09;索引库操作1.创建索引库&#xff08;4步&#xff09;2.删除索引库&#xff08;3步&#xff09;3.判断索引库是否存在&#xff08;3步&#xff09;4.总结&#xff1a;四步走 文档操作1.创建文档&#xff08;4…

HTML——66.单选框

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单选框</title></head><body><!--input元素的type属性&#xff1a;(必须要有)--> <!--单选框:&#xff08;如所住省会&#xff0c;性别选择&…

自行下载foremos命令

文章目录 问题描述其他小伙伴的成功解决方案&#xff0c;但对我不适用解决思路失败告终 最终解决成功解决思路解决步骤 问题描述 在kali系统终端中输入foremost&#xff0c;显示无此命令 其他小伙伴的成功解决方案&#xff0c;但对我不适用 解决思路 正常来说使用命令 apt-g…

LED背光驱动芯片RT9293应用电路

一&#xff09;简介&#xff1a; RT9293 是一款高频、异步的 Boost 升压型 LED 定电流驱动控制器&#xff0c;其工作原理如下&#xff1a; 1&#xff09;基本电路结构及原理 RT9293的主要功能为上图的Q1. Boost 电路核心原理&#xff1a;基于电感和电容的特性实现升压功能。当…

AI大模型语音识别转文字

提取音频 本项目作用在于将常见的会议录音文件、各种语种音频文件进行转录成相应的文字&#xff0c;也可从特定视频中提取对应音频进行转录成文字保存在本地。最原始的从所给网址下载对应视频和音频进行处理。下载ffmpeg(https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-…

CG顶会论文阅读|《科技论文写作》硕士课程报告

文章目录 一、基本信息1.1 论文基本信息1.2 课程基本信息1.3 博文基本信息 二、论文评述&#xff08;中英双语&#xff09;2.1 研究问题&#xff08;Research Problem&#xff09;2.2 创新点&#xff08;Innovation/Contribution&#xff09;2.3 优点&#xff08;Why this pape…

JVM实战—9.线上FGC的几种案例

大纲 1.如何优化每秒十万QPS的社交APP的JVM性能(增加S区大小 优化内存碎片) 2.如何对垂直电商APP后台系统的FGC进行深度优化(定制JVM参数模版) 3.不合理设置JVM参数可能导致频繁FGC(优化反射的软引用被每次YGC回收) 4.线上系统每天数十次FGC导致频繁卡顿的优化(大对象问题…