当前位置: 首页 > news >正文

.NET平台用C#添加动作到PDF文档

使用C#语言在.NET框架下向PDF文档中添加动作,不仅能够提升文档的交互性和用户体验,还能够在自动化工作流中发挥关键作用,例如自动跳转至特定页面、链接外部资源或播放音频资源等操作。这种能力使得开发者能够根据具体需求定制PDF文档的互动操作,进而提高文档的实用性。本文将介绍如何在.NET平台使用C#在PDF文档中添加动作

文章目录

    • 用C#在PDF中添加动作的一般步骤
    • 在PDF中创建文档内跳转动作
    • 在PDF中创建网页链接打开动作
    • 在PDF中创建音频播放动作
    • 在PDF中创建文件打开动作
    • 在PDF中创建JavaScript动作

本文所使用的方法需要用到免费Free Spire.PDF for .NET,可通过NuGet安装:PM> Install-Package Spire.PDF

用C#在PDF中添加动作的一般步骤

利用C#以及该库可以向PDF文档中嵌入多种互动组件动作,如浏览控制按钮、外部文件和网页连接以及声音播放功能,以此来提升用户的阅读体验。下面简要介绍实现PDF内的动作添加的主要步骤:

  1. 创建PdfDocument类的实例。
  2. 通过PdfDocument.LoadFromFile()方法加载 PDF 文档。
  3. 使用PdfDocument.Pages[]属性获取页面。
  4. 创建表示动作的类的实例,并设置其属性。
  5. 将动作添加到PDF文档:
    • 可以使用动作在页面的矩形区域内创建PdfActionAnnotation类的实例,并为动作添加提示文字(可选)。然后使用PdfPageBase.Annotations.Add()方法将动作注释添加到页面上,从而创建可点击触发的动作。
    • 也可以通过PdfDocument.AfterOpenActionPdfDocument.BeforeCloseAction等属性直接将动作设置为在进行其他特定操作时执行的动作。
  6. 使用PdfDocument.SaveToFile()方法保存生成的文档。
  7. 释放资源。

在PDF中创建文档内跳转动作

文档内跳转动作的创建通过PdfGoToAction类实现。代码示例:

using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.General;
using Spire.Pdf.Graphics;
using System.Drawing;namespace AddNavigationButtonPDF
{class Program{static void Main(string[] args){// 创建 PdfDocument 的实例PdfDocument pdf = new PdfDocument();// 加载 PDF 文件pdf.LoadFromFile("示例.pdf");// 创建 PdfDestination 实例并设置目标位置PdfDestination destination = new PdfDestination(pdf.Pages[1]);destination.Location = new PointF(0, 0);destination.Mode = PdfDestinationMode.Location;destination.Zoom = 0.6f;// 基于目标位置创建 PdfGoToAction 实例PdfGoToAction action = new PdfGoToAction(destination);// 创建矩形并绘制到第一页RectangleF rect = new RectangleF(70, pdf.PageSettings.Size.Height - 120, 140, 20);pdf.Pages[0].Canvas.DrawRectangle(PdfBrushes.LightGray, rect);// 在矩形中绘制文本PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("HarmonyOS Sans SC", 14f, FontStyle.Bold), true);PdfStringFormat stringFormat = new PdfStringFormat(PdfTextAlignment.Center);pdf.Pages[0].Canvas.DrawString("跳转到第2页", font, PdfBrushes.Green, rect, stringFormat);// 基于矩形和动作创建 PdfActionAnnotation 实例PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);// 将动作注释添加到第一页pdf.Pages[0].Annotations.Add(actionAnnotation);// 保存文档pdf.SaveToFile("output/PDF导航动作.pdf");pdf.Close();}}
}

结果
C#在PDF中创建文档内跳转动作

在PDF中创建网页链接打开动作

网页链接打开动作的创建通过PdfUriAction类实现。代码示例:

using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using System.Drawing;namespace AddSoundActionPDF
{class Program{static void Main(string[] args){// 创建 PdfDocument 的实例PdfDocument pdf = new PdfDocument();// 加载 PDF 文件pdf.LoadFromFile("示例.pdf");// 获取第一页PdfPageBase page = pdf.Pages[0];// 在页面上绘制矩形RectangleF rect = new RectangleF(30, 30, 120, 20);page.Canvas.DrawRectangle(PdfBrushes.LightGray, rect);// 在矩形内绘制文本PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("HarmonyOS Sans SC", 14f, FontStyle.Bold), true);PdfStringFormat stringFormat = new PdfStringFormat(PdfTextAlignment.Center);page.Canvas.DrawString("点击跳转示例网页", font, PdfBrushes.LightSkyBlue, rect);// 创建 PdfUriAction 实例并设置其属性PdfUriAction action = new PdfUriAction();action.Uri = "https://www.example.com/";// 使用网页链接动作和矩形创建 PdfActionAnnotation 实例PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);// 将动作注释添加到第一页page.Annotations.Add(actionAnnotation);// 保存文档pdf.SaveToFile("output/PDF网页链接打开动作.pdf");pdf.Close();}}
}

结果
C#在PDF中创建网页链接打开动作

在PDF中创建音频播放动作

音频播放动作的创建通过PdfSoundAction类实现。代码示例:

using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using Spire.Pdf.General;
using System.Drawing;namespace AddSoundActionPDF
{class Program{static void Main(string[] args){// 创建 PdfDocument 的实例PdfDocument pdf = new PdfDocument();// 加载 PDF 文件pdf.LoadFromFile("示例.pdf");// 获取第一页PdfPageBase page = pdf.Pages[0];// 在页面上绘制提示图像PdfImage image = PdfImage.FromFile("音频.png");page.Canvas.DrawImage(image, new PointF(30, 30));// 创建 PdfSoundAction 实例并设置其属性PdfSoundAction action = new PdfSoundAction("背景.wav");// 设置声音参数action.Sound.Bits = 16;action.Sound.Channels = PdfSoundChannels.Stereo;action.Sound.Encoding = PdfSoundEncoding.Signed;action.Sound.Rate = 44100;// 设置播放选项action.Volume = 0;action.Repeat = true;action.Mix = true;action.Synchronous = true;// 基于提示图像的位置创建 PdfActionAnnotation 实例,用于声音动作RectangleF rect = new RectangleF(30, 30, image.Width, image.Height);PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);// 将动作注释添加到第一页page.Annotations.Add(actionAnnotation);// 设置在文档打开后播放声音动作pdf.AfterOpenAction = action;// 保存文档pdf.SaveToFile("output/PDF音频播放动作.pdf");pdf.Close();}}
}

结果
C#在PDF中创建音频播放动作

在PDF中创建文件打开动作

文件打开动作的创建通过PdfLaunchAction类实现。代码示例:

using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using System.Drawing;namespace AddFileLaunchActionPDF
{class Program{static void Main(string[] args){// 创建 PdfDocument 的实例PdfDocument pdf = new PdfDocument();// 加载 PDF 文件pdf.LoadFromFile("示例.pdf");// 获取第一页PdfPageBase page = pdf.Pages[0];// 在页面上绘制矩形RectangleF rect = new RectangleF(50, 50, 180, 20);page.Canvas.DrawRectangle(PdfBrushes.LightGray, rect);// 在矩形内绘制文本PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("HarmonyOS Sans SC", 14f, FontStyle.Bold), true);PdfStringFormat stringFormat = new PdfStringFormat(PdfTextAlignment.Center);pdf.Pages[0].Canvas.DrawString("点击打开示例2", font, PdfBrushes.Green, rect, stringFormat);// 创建 PdfLaunchAction 实例PdfLaunchAction action = new PdfLaunchAction("D:/示例2.pdf", PdfFilePathType.Absolute);// 设置启动模式为在新窗口中打开action.IsNewWindow = true;// 基于矩形和启动动作创建 PdfActionAnnotation 实例PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);// 将动作注释添加到第一页page.Annotations.Add(actionAnnotation);// 保存文档pdf.SaveToFile("output/PDF文件打开动作.pdf");pdf.Close();}}
}

结果
C#在PDF中创建文件打开动作

在PDF中创建JavaScript动作

JavaScript动作的创建通过PdfJavaScriptAction类实现。代码示例:

using Spire.Pdf;
using Spire.Pdf.Actions;namespace AddJavaScriptActionPDF
{class Program{static void Main(string[] args){// 创建 PdfDocument 的实例PdfDocument pdf = new PdfDocument();// 加载 PDF 文件pdf.LoadFromFile("示例.pdf");// 定义JavaScript代码string jsCode ="app.alert({" +"    cMsg: '欢迎阅读《水星:太阳系中最小的行星之一,却拥有无尽的科学奥秘》。\\n\\n本文将详细探讨水星的各个方面,包括概述、形成和历史、表面特征、气候和环境,以及未来的探索。', " +"    nIcon: 3, " +"    cTitle: '文档介绍'" +"});";// 使用代码创建 PdfJavaScriptAction 实例PdfJavaScriptAction action = new PdfJavaScriptAction(jsCode);// 将动作设置为PDF文档打开时执行pdf.AfterOpenAction = action;// 保存文档pdf.SaveToFile("output/PDF JavaScript动作.pdf");pdf.Close();}}
}

结果
C#在PDF中创建JavaScript动作

本文介绍如何在.NET平台使用C#代码实现在PDF中添加动作,提供步骤介绍及代码示例。

相关文章:

.NET平台用C#添加动作到PDF文档

使用C#语言在.NET框架下向PDF文档中添加动作,不仅能够提升文档的交互性和用户体验,还能够在自动化工作流中发挥关键作用,例如自动跳转至特定页面、链接外部资源或播放音频资源等操作。这种能力使得开发者能够根据具体需求定制PDF文档的互动操…...

大数据治理:概念、框架与实践应用

摘要: 随着大数据时代的到来,数据量呈爆炸式增长,数据来源和类型日益多样化。大数据治理作为确保数据质量、安全性、合规性以及有效利用数据资产的关键领域,已成为企业和组织在数字化转型过程中面临的重要挑战和机遇。本文深入探讨了大数据治理的概念,详细阐述了其涵盖的主…...

Vue.observable 全解析:Observable 是什么及使用场景剖析

Vue.observable 详解 Vue.observable 是 Vue 2.x 中的一个 API,用于将普通对象转化为响应式对象,类似于 Vue 组件中的 data 对象,可以实现数据的双向绑定。它允许你将任何普通对象转化为 Vue 响应式系统管理的对象,使得该对象的属性变化时能够自动触发视图更新。 什么是 …...

MySQL基础知识大总结

一,介绍 数据库是什么,我们在学习其他编程语言的时候会使用数组呀,链表,二叉树等等一些数据结构来存储我们的数据,但是大家有没有发现我们一旦关闭程序,所有的数据都没有了,这在发行的软件来看是…...

池化技术、Commons Pool介绍

概述 池化技术,一种通过重复利用对象实例而非频繁创建和销毁的技术。 常见的可池化对象: 数据库连接(Connection):数据库连接创建和销毁代价高,连接池广泛用于管理JDBC连接;线程(Thread):线程的创建和销…...

下载并安装Visual Studio 2017过程

一、下载 1、下载链接 下载链接:官方网址 先登录 往下滑找到较早的下载 2、进行搜索下载 或者直接点击🔗网站跳转 3、确认系统信息进行下载 二、安装 下载完成后右键使用管理员身份运行 1、点击同意后安装 2、若报错—设置失败 打开控制面板-&g…...

菊风视频能力平台开发服务正式入驻华为云云商店,成为华为云联营联运合作伙伴

日前,菊风视频能力平台开发服务正式入驻华为云云商店,成为华为云在实时音视频领域的联营联运合作伙伴。 菊风结合自身产品方案优势与华为云开放、共盈的生态优势强强联手,在推动金融行业数字化转型的路上又向前迈出了一大步。华为云云商店作为…...

springboot整合kafka

springboot整合kafka pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven…...

Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!

前言 我们先简单了解一下PyTorch、Keras、Scikit-learn和TensorFlow都是什么。 想象一下你要盖一座大房子。你需要砖头、水泥、工具等等&#xff0c;对吧&#xff1f;机器学习也是一样&#xff0c;需要一些工具来帮忙。PyTorch、Keras、Scikit-learn和TensorFlow就是四种不同的…...

【Linux】安装cuda

一、安装nvidia驱动 # 添加nvidia驱动ppa库 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update# 查找推荐版本 sudo ubuntu-drivers devices# 安装推荐版本 sudo apt install nvidia-driver-560# 检验nvidia驱动是否安装 nvidia-smi 二、安装cudatoolkit&…...

为什么DDoS防御很贵?

分布式拒绝服务攻击&#xff08;DDoS攻击&#xff09;是一种常见的网络安全威胁&#xff0c;通过大量恶意流量使目标服务器无法提供正常服务。DDoS防御是一项复杂且昂贵的服务&#xff0c;本文将详细探讨为什么DDoS防御如此昂贵&#xff0c;并提供一些实用的代码示例和解决方案…...

将WPS的PPT 无损的用微软的PowerPoint打开

用WPS做了PPT&#xff0c;但是用用PowerPoint打开的时候&#xff0c;老是会有几张图错位。 解决方案&#xff1a;将wps做的PPT另存为PowerPoint的格式 参考博客&#xff1a;解决office的PPT和WPS的PPT不兼容的问题_office ppt和wps中代码不通用-CSDN博客 另存为的时候&#…...

【汇编】uniapp开发

UniApp是一款基于Vue.js构建的跨平台开发框架&#xff0c;可以用于快速开发同时运行在多个平台&#xff08;包括iOS、Android、H5和小程序&#xff09;的应用程序。UniApp的目标是提供一套代码即可在不同平台上运行的开发模式&#xff0c;从而节省开发者的时间和精力。本文将介…...

详解Oracle表的类型(二)

1.引言&#xff1a; Oracle数据库提供了多种表类型&#xff0c;以满足不同的数据存储和管理需求。本博文将对Oracle分区表及使用场景进行详细介绍。 2. 分区表 分区表是Oracle数据库中一种重要的表类型&#xff0c;它通过将表数据分割成多个逻辑部分来提高查询性能、管理灵活…...

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器&#xff0c;一般指网站服务器&#xff0c;是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件以供全世界浏览&#xff0c;或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…...

Next.js-样式处理

#题引&#xff1a;我认为跟着官方文档学习不会走歪路 Next.js 支持多种为应用程序添加样式的方法&#xff0c;包括&#xff1a; CSS Modules&#xff1a;创建局部作用域的 CSS 类&#xff0c;避免命名冲突并提高可维护性。全局 CSS&#xff1a;使用简单&#xff0c;对于有传统…...

整合Springboot shiro jpa mysql 实现权限管理系统(附源码地址)

一、在开发企业级应用时,权限管理是一个至关重要的功能。本文将围绕 Spring Boot、JPA、MySQL 和 Apache Shiro,构建一个基础的权限管理系统,涵盖用户认证与授权等核心功能。 一、技术选型及框架介绍 Spring Boot:简化 Spring 应用的配置和开发。JPA:实现数据持久化,提供…...

极智嘉嵌入式面试题及参考答案

对于交叉编译器的理解 交叉编译器是一种在一个计算机平台上为另一个不同架构的计算机平台生成可执行代码的编译器。它在嵌入式系统开发中起着关键作用。 从其必要性来看&#xff0c;嵌入式系统通常使用的处理器架构与我们日常使用的 PC 等通用计算机不同&#xff0c;如 ARM、MI…...

【MySQL】数据库核心技术与应用指南

数据库的各种概念 1. 指一门学科《数据库原理与应用》。&#xff08;研究如何设计实现一个数据库&#xff09; 2. 指一类用来管理数据的软件。 3. 指某一个具体的数据库软件。 4. 指部署了某个数据库软件的电脑。 数据库软件 关系型数据库 1. 使用 “表” 的结构来组织数据。…...

23省赛区块链应用与维护(房屋租凭)

23省赛区块链应用与维护(房屋租凭) 背景描述 随着异地务工人员的增多,房屋租赁成为一个广阔市场。目前,现有技术中的房屋租赁是由房主发布租赁信息,租赁信息发布在房屋中介或租赁软件,租客获取租赁信息后,现场看房,并签订纸质的房屋租赁合同,房屋租赁费用通过中介或…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...