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

使用itextsharp5.0版本来合并多个pdf文件并保留书签目录结构

using System;
using System.Collections.Generic;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;public class PdfMergeUtility
{/// <summary>/// 合并多个PDF文件并保留书签目录结构/// </summary>/// <param name="inputFiles">要合并的PDF文件路径列表</param>/// <param name="outputFile">合并后的输出文件路径</param>public static void MergeWithBookmarks(List<string> inputFiles, string outputFile){// 1. 创建目标文档对象// Document类表示PDF文档的抽象Document document = new Document();// 2. 创建PdfWriter实例,用于写入PDF内容// GetInstance方法将文档与输出流绑定PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFile, FileMode.Create));document.Open();// 3. 获取DirectContent用于直接操作页面内容// PdfContentByte是操作PDF内容的底层APIPdfContentByte cb = writer.DirectContent;// 4. 存储所有合并后的书签List<Dictionary<string, object>> allBookmarks = new List<Dictionary<string, object>>();// 5. 当前页码计数器(从1开始)int currentPage = 1;// 6. 遍历每个输入文件foreach (string file in inputFiles){// 6.1 创建PDF阅读器对象PdfReader reader = new PdfReader(file);// 6.2 处理书签(目录)// SimpleBookmark.GetBookmark提取PDF中的书签结构IList<Dictionary<string, object>> bookmarks = SimpleBookmark.GetBookmark(reader);if (bookmarks != null){foreach (Dictionary<string, object> bookmark in bookmarks){// 6.2.1 调整书签页码偏移量// 原始书签页码格式示例:"1 Fit" 或 "5 XYZ 100 200 1"if (bookmark.ContainsKey("Page")){string[] parts = bookmark["Page"].ToString().Split(' ');int origPage = int.Parse(parts[1].Substring(1)); // 提取原始页码// 重新计算合并后的页码:当前偏移量 + 原始页码 - 1bookmark["Page"] = $"{parts[0]} {currentPage + origPage - 1}{parts[2]}";}allBookmarks.Add(bookmark);}}// 6.3 使用AddTemplate添加页面内容for (int i = 1; i <= reader.NumberOfPages; i++){document.NewPage(); // 创建新页面// 导入源PDF的指定页面PdfImportedPage page = writer.GetImportedPage(reader, i);// 将导入的页面添加到当前页面的内容中// 参数说明:0,0表示不进行缩放或偏移cb.AddTemplate(page, 0, 0);currentPage++; // 页码递增}reader.Close(); // 关闭当前PDF阅读器}// 7. 写入合并后的书签if (allBookmarks.Count > 0){writer.Outlines = allBookmarks; // 将处理后的书签写入输出PDF}// 8. 关闭文档(完成写入)document.Close();}
}
http://www.xdnf.cn/news/460927.html

相关文章:

  • 人体肢体工作识别-一步几个脚印从头设计数字生命——仙盟创梦IDE
  • 产品创新怎么算
  • MySQL主从复制与读写分离
  • 模糊综合评价模型建立
  • Leetcode刷题 | Day63_图论08_拓扑排序
  • Ubuntu 20.04 LTS 中部署 网页 + Node.js 应用 + Nginx 跨域配置 的详细步骤
  • x-file-storage
  • AI数字人融合VR全景:开启未来营销与交互新篇章
  • 每日算法 - 【Swift 算法】Two Sum 问题:从暴力解法到最优解法的演进
  • C#数据类型
  • 新能源汽车制动系统建模全解析——从理论到工程应用
  • 【系统架构师】2025论文《WEB系统性能优化技术》
  • Added non-passive event listener to a scroll-blocking
  • 大语言模型 07 - 从0开始训练GPT 0.25B参数量 - MiniMind 实机训练 预训练 监督微调
  • 【Python 面向对象】
  • Android Development Roadmap
  • 机器人弧焊二八混合气体节约
  • 报考机动车授权签字人需要具备哪些专业技能?
  • 讯联云库项目开发日志(二)AOP参数拦截
  • iOS视频封装步骤解析
  • Android开发-使用内容组件获取通讯信息
  • CertiK助力以太坊扩展战略,解析Pectra升级的变革与挑战
  • CNN 卷积神经网络详解及 PyTorch 实现
  • MySQL——1、数据库基础
  • Windows 环境下 Docker Desktop 安装 + 汉化
  • .NET 无侵入自动化探针原理与主流实现详解
  • 二叉树深搜:在算法森林中寻找路径
  • Docker容器镜像与容器常用操作指南
  • 从 Excel 到 Data.olllo:数据分析师的提效之路
  • 交通运输与能源融合发展——光储充在交通上的应用完整解决方案