C#使用iText7给PDF文档添加书签

  上一篇文章将SqlSugar官网文档中每个链接对应的网页生成独立PDF文档再合并为单个PDF文档,但是没有书签,八百多页的内容查找和跳转都不方便,本文学习和使用iText7给PDF文档添加多级书签。
  添加多级书签分为两大步骤:1)获取书签分类;2)创建多级书签。如下图所示,SqlSugar官网文档页面右侧的帮助链接都有所属版块,如版本记录属于产品详情版块,入门必看属于从零开始版块,本文第一步先分析如何获取链接所属的版块信息。

在这里插入图片描述
  查看网页源代码,分析其中的结构,可以看到版块名称和帮助链接都位于class值为layui-tree的列表内,且版块名称和帮助链接属于同一级别,先出现版块li,其class值为clear,后面跟随的li都属于其版块内容,class值均包含site-float site-tree-noicon。
在这里插入图片描述
  根据上述分析,采用HtmlAgilityPack抓取并获取版块及其所属帮助链接信息,主要代码及程序运行效果如下所示:

HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument docu = web.Load(txtUrl.Text);
HtmlNode node = docu.DocumentNode.SelectSingleNode(@"//ul[@class='layui-tree']");HtmlNode tmpNode;
string curSection = string.Empty;foreach (HtmlNode subNode in node.ChildNodes)
{string className = subNode.GetAttributeValue<string>("class", string.Empty);if (string.IsNullOrEmpty(className)){continue;}if (className == "clear"){curSection = subNode.InnerText;}if (className.Contains("site-float site-tree-noicon")){tmpNode = subNode.SelectSingleNode(".//a");DataGridViewRow dgvr = new DataGridViewRow();        dgvr.CreateCells(dataGridView1);dgvr.Cells[0].Value = dataGridView1.Rows.Count + 1;dgvr.Cells[1].Value = curSection ;dgvr.Cells[2].Value = tmpNode.InnerText;dgvr.Cells[3].Value = @"https://www.donet5.com" + tmpNode.Attributes["href"].Value;dataGridView1.Rows.Add(dgvr);}                
}

在这里插入图片描述
  生成的独立文档如下所示,为便于获取文档所属板块,将板块名称作为文件名的第一部分。
在这里插入图片描述
  接下来是添加多级书签,主要就是两级,第一级为版块,第二级为版块包含的帮助文档。使用PdfOutline创建书签及跳转链接。在PDF文档合并之后,调用PdfDocument.GetOutlines函数获取书签根节点,然后调用PdfOutline.AddOutline函数创建下级书签(类似于树控件中的节点,可以不停地创建),关键代码如下所示。

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(txtFileName.Text));
...
...
PdfOutline rootOutline = pdfDoc.GetOutlines(false);
PdfOutline tmpOutline = null;
PdfOutline tmpSubOutline = null;
int curPageIndex = 1;
int underlineIndex = -1;
string tmpModule = "XXXXXX";foreach (PdfFileInfo doc in pdfFiles)
{string fileName = doc.FileName;if (!fileName.StartsWith(tmpModule)){underlineIndex = fileName.IndexOf('_');//添加第一级版块书签及跳转链接tmpModule = fileName.Substring(0, underlineIndex);tmpOutline = rootOutline.AddOutline(tmpModule);tmpOutline.AddDestination(PdfExplicitDestination.CreateFit(pdfDoc.GetPage(curPageIndex)));}//添加第二级书签及跳转链接tmpSubOutline = tmpOutline.AddOutline(fileName.Substring(underlineIndex + 1));tmpSubOutline.AddDestination(PdfExplicitDestination.CreateFit(pdfDoc.GetPage(curPageIndex)));curPageIndex += doc.docu.GetNumberOfPages();
}

  程序的运行效果及最终的PDF文档效果如下图所示。SqlSugar官网帮助文档的合并PDF文件已上传到资源中,待审核后即可下载使用,有需要的可以自行下载。
在这里插入图片描述
在这里插入图片描述

参考文献:
[1]https://itextpdf.com/
[2]https://github.com/itext/itext-dotnet
[3]https://blog.csdn.net/qq_38628970/article/details/135478244
[4]https://github.com/itext/itext-publications-samples-dotnet/blob/master/itext/itext.samples/itext/samples/sandbox/merge/MergeWithOutlines.cs
[5]https://blog.csdn.net/rebecca_cao/article/details/135185043

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

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

相关文章

Nodejs+vue汽车保养美容管理系统vscode前后端分离项目

汽车美容保养管理系统后台采用nodejs语言开发,前台页面和后台管理页面使用vue等技术开发,使用MySql作为数据持久化存储工具对汽车美容保养管理系统的用户等角色权限对应的功能等进行存储。采用vsocde集成IDE对汽车美容保养管理系统统进行开发,整合系统的各个模块。 拟开发的汽车…

对el-table表格的表头操作

效果1&#xff1a;单层表头合并 图示1&#xff1a; 说明&#xff1a; header-cell-style函数用于给表头添加样式&#xff0c;其返回的值会被添加到表头对应样式中去注意函数的形参中的column.id为单元格的class类大家最好打印一下&#xff0c;结合审查dom看类名 代码&#x…

Springboot项目中定时任务的四种实现方式

文章目录 1. 使用Scheduled注解1.1 时间间隔执行1.2 固定时间点执行 2. 使用EnableScheduling注解启用定时任务3. 实现SchedulingConfigurer接口4. 使用Quartz框架4.1 配置QuartzScheduler4.2 定义Job类和Trigger类 5. 总结 在开发现代应用时&#xff0c;定时任务是一个非常常见…

T-BOC-Aminooxy-PEG2-amine,252378-69-1,分子生物偶联常用试剂

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;252378-69-1&#xff0c;T-BOC-Aminooxy-PEG2-amine&#xff0c;T-BOC-Aminooxy-PEG2-NH2&#xff0c;t-Boc-氨基氧基-PEG2-胺&#xff0c;T-BOC-氨氧基-二聚乙二醇-氨基 一、基本信息 【产品简介】&#xff1a;The…

【leetcode】移除链表元素

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 方法1. 直接在原链表上移除方法2 点击查看题目 方法1. 直接在原链表上移除 思路&#xff1a; 因为…

利用 Python 抓取数据探索汽车市场趋势

一、引言 随着全球对环境保护意识的增强和技术的进步&#xff0c;新能源汽车作为一种环保、高效的交通工具&#xff0c;正逐渐受到人们的关注和青睐。在这个背景下&#xff0c;对汽车市场的数据进行分析和研究显得尤为重要。 本文将介绍如何利用 Python 编程语言&#xff0c;结…

CBAM注意力机制详解(附pytorch复现)

简介 论文原址&#xff1a;1807.06521.pdf (arxiv.org) CBAM&#xff08;Convolutional Block Attention Module&#xff09;是一种卷积神经网络模块&#xff0c;旨在通过引入注意力机制来提升网络的表示能力。CBAM包含两个顺序子模块&#xff1a;通道注意力模块和空间注意力…

Unity(第二十二部)官方的反向动力学一般使用商城的IK插件,这个用的不多

反向动力学&#xff08;Inverse Kinematic&#xff0c;简称IK&#xff09;是一种通过子节点带动父节点运动的方法。 正向动力学 在骨骼动画中&#xff0c;大多数动画是通过将骨架中的关节角度旋转到预定值来生成的&#xff0c;子关节的位置根据父关节的旋转而改变&#xff0c;这…

4G音柱Ip音柱-街道社区反诈宣传4G音柱 4G广播音柱城市防洪工程管理处防汛排涝信息系统 智慧城市文明交通广播4G音柱

4G音柱Ip音柱-街道社区反诈宣传4G音柱 4G广播音柱城市防洪工程管理处防汛排涝信息系统 智慧城市文明交通广播4G音柱 SV-7042UG是深圳锐科达电子有限公司的一款壁挂式4G无线网络音柱&#xff0c;通过4G无线卡联网&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xf…

【报名指南】2024年第九届数维杯数学建模挑战赛报名全流程图解

1.官方报名链接&#xff1a; 2024年第九届数维杯大学生数学建模挑战赛http://www.nmmcm.org.cn/match_detail/32 2.报名流程&#xff08;电脑与手机报名操作流程一致&#xff09; 参赛对象为在校专科生、本科生、研究生&#xff0c;每组参赛人数为1-3人&#xff08;指导老师不…

第3届图像处理与媒体计算国际会议(ICIPMC 2024)即将召开!

2024年第3届图像处理与媒体计算国际会议&#xff08;ICIPMC2024&#xff09;将于2024年5月17-19日在中国合肥举行。本次大会由安徽大学、西北工业大学&#xff0c;西北大学和IEEE联合主办。ICIPMC 2024旨在汇集该领域领先的学术科学家、研究人员和学者&#xff0c;并进行交流和…

虚拟游戏理财【华为OD机试-JAVAPythonC++JS】

题目描述 题目描述&#xff1a; 在一款虚拟游戏中生活&#xff0c;你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。现有一家Bank&#xff0c;它提供有若干理财产品m&#xff0c;风险及投资回报不同&#xff0c;你有N&#xff08;元&#xff09;进行投资&#xff0c;能…