当前位置: 首页 > 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();}
}

相关文章:

  • 从AlphaGo到ChatGPT:AI技术如何一步步改变世界?
  • 使用 Apache POI 生成 Word 文档
  • 第 83 场周赛:较大分组的位置、隐藏个人信息、连续整数求和、统计子串中的唯一字符
  • WordPress_Relevanssi Sql注入漏洞复现(CVE-2025-4396)
  • 2025最新ChatGPT Plus令牌(Token)限制完全指南:每日/每月用量详解与突破方法
  • 国产化Word处理控件Spire.Doc教程:通过C# 删除 Word 文档中的超链接
  • 网络安全-等级保护(等保) 2-5 GB/T 25070—2019《信息安全技术 网络安全等级保护安全设计技术要求》-2019-05-10发布【现行】
  • 2023CCPC河南省赛暨河南邀请赛个人补题ABEFGHK
  • Spark SQL 之 Analyzer
  • 基于vue3的权限管理系统脚手架搭建项目实战(二):登录与路由权限控制
  • 一个基于 Spring Boot 的实现,用于代理百度 AI 的 OCR 接口
  • React与Docker中的MySQL进行交互
  • DeepSeek执行流程加速指南:跨框架转换与编译优化的核心策略全解析
  • Python60日基础学习打卡D26
  • 记一次bug排查(.exe链接mysql失败)-每天学习一点点
  • 【知识聚合】Java相关技术网址聚合
  • Java详解LeetCode 热题 100(17):LeetCode 41. 缺失的第一个正数(First Missing Positive)详解
  • 【kafka】基本命令
  • [吾爱出品] pdf提取工具,文本、表格、图片提取
  • 从算力困境到创新突破:GPUGEEK如何重塑我的AI开发之旅
  • 《上海市建筑信息模型技术应用指南(2025版)》发布
  • 丹麦外交大臣拉斯穆森将访华
  • 体坛联播|博洛尼亚时隔51年再夺意杯,皇马逆转马洛卡
  • 朝着解决问题的正确方向迈进——中美经贸高层会谈牵动世界目光
  • 十大券商看后市|A股中枢有望逐步震荡抬升,把握结构性行情
  • “不为一时一事所惑,不为风高浪急所扰”——习近平主席对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典纪实