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();
            // 重置水印透明度为1
            brush.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中添加和删除水印注释的全部内容。感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

fpga系列 HDL:verilog 常见错误与注意事项 位宽不匹配+case 语句中没有覆盖所有情况

位宽不匹配问题 信号或操作数的位宽不匹配&#xff0c;可能导致仿真或综合错误。 module top (input wire [3:0] a,output wire [7:0] b );assign b a; endmodulecase 语句中没有覆盖所有情况 module top (input wire [1:0] sel,input wire [7:0] a,input wire [7:0] b,in…

groupby 操作的不同参数

groupby 是数据分析中一个非常强大的操作&#xff0c;可以根据指定的规则将数据拆分成多个组&#xff0c;并对每个组进行聚合、转换或过滤等操作。我们逐个解释这些参数的作用&#xff0c;并通过数值举例进行说明。 参数解释 by&#xff1a;分组依据 by 参数指定了分组的依据&…

鸢尾花种类预测--数据集介绍

1.6 案例&#xff1a;鸢尾花种类预测--数据集介绍 学习目标 目标 知道sklearn中获取数据集的方法知道sklearn中对数据集的划分方法 本实验介绍了使用Python进行机器学习的一些基本概念。 在本案例中&#xff0c;将使用K-Nearest Neighbor&#xff08;KNN&#xff09;算法对鸢尾…

基于深度学习的视觉检测小项目(二) 环境和框架搭建

一、环境和框架要求 SAM的环境要求&#xff1a; Python>3.7 PyTorch>1.7 torchvision>0.8 YOLO V8的环境要求&#xff1a;YOLO集成在ultralytics库中&#xff0c;ultralytics库的环境要求&#xff1a; Python>3.7 PyTorch>1.10.0 1、确定pytorch版本…

Javascript算法——回溯算法(组合问题)

相关资料来自《代码随想录》&#xff0c;版权归原作者所有&#xff0c;只是学习记录 回溯 回溯模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点…

Java Excel转PDF POI+Itext5

由于现在存在需求&#xff0c;通过Java将数据文本生成特点格式Excel&#xff0c;再输出为PDF。 调研了一些方案&#xff0c;最终决定使用POI写入Excel,再使用Itext5生成PDF。 在网上找了一些Itext的转换工具类&#xff0c;进行了一些改动。 目前市面上 Excel 转 PDF 的组件…

linux nginx maccms管理后台无法进入页面不存在和验证码不显示的问题

windows中运行maccms非常顺利&#xff0c;轻松搭建了。并一切正常。而我在linux中搭建缺遇到了一个非常奇怪的问题。进入管理后台&#xff0c;明明"admin.php"(比如重命名成a.php)的页面是存在的&#xff0c;访问时缺提示页面不存在&#xff01;稍后就自动跳到首页了…

C# 服务调用RFC函数获取物料信息,并输出生成Excel文件

这个例子是C#服务调用RFC函数&#xff0c;获取物料的信息&#xff0c;并生成Excel文件 上接文章&#xff1a;C#服务 文章目录 创建函数创建结构编写源代码创建批处理文件运行结果-成功部署服务器C#代码配置文件注意&#xff01;&#xff01; 创建函数 创建结构 编写源代码 创建…

在 SQL 中,区分 聚合列 和 非聚合列(nonaggregated column)

文章目录 1. 什么是聚合列&#xff1f;2. 什么是非聚合列&#xff1f;3. 在 GROUP BY 查询中的非聚合列问题示例解决方案 4. 为什么 only_full_group_by 要求非聚合列出现在 GROUP BY 中&#xff1f;5. 如何判断一个列是聚合列还是非聚合列&#xff1f;6. 总结 在 SQL 中&#…

Postman测试big-event

报错500。看弹幕&#xff0c;知道可能是yml或sql有问题。 所以检查idea工作台&#xff0c; 直接找UserMapper检查&#xff0c;发现完全OK。 顺着这个error发现可能是sql有问题。因为提示是sql问题&#xff0c;而且是有now()的那个sql。 之后通过给的课件&#xff0c;复制课件…

SpringBoot 2.6 集成es 7.17

引言 在现代应用开发中&#xff0c;Elasticsearch作为一个强大的搜索引擎和分析引擎&#xff0c;已经成为许多项目不可或缺的一部分。Spring Boot作为Java生态中最受欢迎的微服务框架之一&#xff0c;其对Elasticsearch的支持自然也是开发者关注的焦点。本文将详细介绍如何在S…

沙箱模拟支付宝支付3--支付的实现

1 支付流程实现 演示案例 主要参考程序员青戈的视频【支付宝沙箱支付快速集成版】支付宝沙箱支付快速集成版_哔哩哔哩_bilibili 对应的源码在 alipay-demo: 使用支付宝沙箱实现支付功能 - Gitee.com 以下是完整的实现步骤 1.首先导入相关的依赖 <?xml version"1…

自行下载foremos命令

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

商米电子秤服务插件

概述 SunmiScaleUTS封装商米电子秤服务模块&#xff0c;支持商米旗下S2, S2CC, S2L CC等设备&#xff0c;设备应用于超市、菜市场、水果店等,用于测量商品的重量,帮助实现快捷、准确、公正的交易等一系列商业场景。 功能说明 SDK插件下载 一. 电子秤参数 型号:S2, S2CC, …

快速将索尼手机联系人导出为 HTML 文件

我想将 Sony Xperia 手机上的联系人导出到计算机上进行备份&#xff0c;并在需要时进行编辑。这可以做到吗&#xff1f;如何做到&#xff1f;作为助手我需要下载什么工具吗&#xff1f; 当您的 Android 手机上存储了如此多的重要联系人&#xff0c;而您又不想丢失它们时&#…

linux安装redis及Python操作redis

目录 一、Redis安装 1、下载安装包 2、解压文件 3、迁移文件夹 4、编译 5、管理redis文件 6、修改配置文件 7、启动Redis 8、将redis服务交给systemd管理 二、Redis介绍 1、数据结构 ①字符串String ②列表List ③哈希Hash ④集合Set ⑤有序集合Sorted Set 2、…

聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载

聆听音乐手机版是面向广大音乐爱好者的移动应用程序&#xff0c;用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能&#xff0c;让用户在手机上畅享更舒适的音乐体验&#xff0c;每位用户都能享受精彩纷呈的收听体验。此外&#xff0c;软件还支持无损音质音乐…

在React中引入tailwind css(图文详解)

Tailwind CSS 是一个功能强大的 CSS 框架&#xff0c;旨在使开发者能够以更高效、灵活的方式创建现代、响应式的网页。与传统的 CSS 框架&#xff08;如 Bootstrap 或 Foundation&#xff09;不同&#xff0c;Tailwind 采取了“实用类”&#xff08;Utility-First&#xff09;的…

双指针算法详解

目录 一、双指针 二、双指针题目 1.移动零 解法&#xff1a; 代码&#xff1a; 2.复写零 ​编辑 解法&#xff1a; 代码&#xff1a; 边界情况处理: 3.快乐数 ​编辑 解法:快慢指针 代码&#xff1a; 4.盛水最多的容器 解法&#xff1a;&#xff08;对撞指针&#xff09;…

每天40分玩转Django:Django Celery

Django Celery 一、知识要点概览表 模块知识点掌握程度要求Celery基础配置、任务定义、任务执行深入理解异步任务任务状态、结果存储、错误处理熟练应用周期任务定时任务、Crontab、任务调度熟练应用监控管理Flower、任务监控、性能优化理解应用 二、基础配置实现 1. 安装和…