【C#】C#实现PDF合并

文章目录

    • 一、下载iTextSharp.dll
      • 下载iTextSharp.dll
      • 命名空间引入
    • 二、界面设计
    • 三、代码
      • 全局变量
      • 选择文件夹的按钮
      • 确认合并的按钮
    • 四、导出结果
    • 五、完整源码


一、下载iTextSharp.dll

下载iTextSharp.dll

可使用联机方式或者文件下载方式。
在这里插入图片描述

命名空间引入

代码开始时引入了一些命名空间,这些命名空间包含了程序运行所需的类和方法。

  • System、System.Collections.Generic、System.ComponentModel等是.NET框架的核心命名空间。
  • iTextSharp.text 和 iTextSharp.text.pdf 是用于处理PDF文件的库。
  • System.IO 是用于文件和目录操作的命名空间。
  • Microsoft.Win32 是用于访问Windows注册表的命名空间。
  • System.Diagnostics 是用于诊断和调试的命名空间。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using Microsoft.Win32;
using System.Diagnostics;

二、界面设计

在这里插入图片描述

三、代码

全局变量

定义了三个静态字符串变量,用于存储上次选择的文件夹路径、输入文件夹路径和输出文件夹路径。

// 全局变量private static string lastFolderPath = ""; // 记录上次选择文件夹的路径private static string inputFolderPath = ""; // 输入文件夹路径private static string outputFolderPath = ""; // 输出文件夹路径

选择文件夹的按钮

从Windows注册表中读取上次选择的文件夹路径。
显示一个文件夹选择对话框,让用户选择包含PDF文件的文件夹。
如果用户选择了一个文件夹,将该路径存储在inputFolderPath变量中,并创建(如果不存在)一个名为"Output"的子文件夹作为输出路径。
将选择的路径显示在文本框txtPath中。

/// <summary>/// 按钮,选择文件夹路径/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSelectPath_Click(object sender, EventArgs e){// 读取上次选择的文件夹路径  string registryKey = "Software\\PDF合并"; // 用您自己的应用程序名称替换YourAppName  if (Registry.CurrentUser.OpenSubKey(registryKey) != null){lastFolderPath = Registry.CurrentUser.OpenSubKey(registryKey).GetValue("LastFolder") as string;}// 创建并显示一个选择文件夹的对话框  FolderBrowserDialog folderDialog = new FolderBrowserDialog();folderDialog.Description = "选择包含PDF文件的文件夹:";folderDialog.SelectedPath = lastFolderPath; // 设置默认路径为用户上次选择的文件夹  if (folderDialog.ShowDialog() == DialogResult.OK){// 获取用户选择的文件夹路径  inputFolderPath = folderDialog.SelectedPath;// 创建输出文件夹路径(如果它不存在则创建它)  outputFolderPath = Path.Combine(inputFolderPath, "Output");if (!Directory.Exists(outputFolderPath)){Directory.CreateDirectory(outputFolderPath);}}txtPath.Text = inputFolderPath;}

确认合并的按钮

简而言之,当用户点击“确认合并PDF”按钮时,此方法首先检查用户是否已选择了一个路径。如果没有,它会提示用户选择一个路径;如果已选择,它会调用一个方法来合并PDF文件,并显示一个消息告知用户合并已完成,然后打开导出的文件夹供用户查看。

/// <summary>/// 按钮,确认合并PDF/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnOK_Click(object sender, EventArgs e){if (txtPath.Text == string.Empty){MessageBox.Show("请选择要合并的文件夹路径!");}else{// 调用合并PDF的方法  MergePDFs(inputFolderPath, outputFolderPath, "123");MessageBox.Show("合并完成!");// 打开导出的文件夹路径  Process.Start(outputFolderPath);}}
  • 合并PDF的处理函数
    定义方法:public void MergePDFs(string inputFolderPath, string outputFolderPath, string outputPdfName)
    获取输入文件夹中所有的PDF文件,并将它们存储在inputFiles字符串数组中。
    创建输出PDF文件的路径,使用Path.Combine方法将输出文件夹路径和输出PDF文件名称组合起来。
    创建一个新的文件流stream,并使用FileStream类以写入模式打开它,准备写入输出PDF文件。
    创建一个新的Document对象pdfDoc,表示输出PDF文件。
    创建一个新的PdfCopy对象pdf,用于将内容复制到输出PDF文件中。
    打开输出PDF文档以进行写入。
    遍历所有输入的PDF文件,并使用PdfReader对象读取每个PDF文件。
    对于每个输入的PDF文件,获取其页面数,并使用for循环遍历每个页面。
    将每个输入PDF文件的页面添加到输出PDF文件中。
    检查输出PDF文档是否为空,如果不为空则关闭它。
    关闭文件流。
    创建新输出PDF文件的完整路径。
    检查新输出文件是否已存在,如果已存在则删除它。
    将原输出文件移动到新位置并重命名为"AllPDF_Merged.pdf"。
 /// <summary>/// 合并多个PDF文件为一个PDF文件/// </summary>/// <param name="inputFolderPath"></param>/// <param name="outputFolderPath"></param>/// <param name="outputPdfName"></param>public void MergePDFs(string inputFolderPath, string outputFolderPath, string outputPdfName){// 获取输入文件夹中所有的PDF文件  string[] inputFiles = Directory.GetFiles(inputFolderPath, "*.pdf");// 创建输出PDF文件路径  string outputPdfPath = Path.Combine(outputFolderPath, outputPdfName);// 创建输出PDF文件  using (FileStream stream = new FileStream(outputPdfPath, FileMode.Create)){Document pdfDoc = new Document();PdfCopy pdf = new PdfCopy(pdfDoc, stream);pdfDoc.Open();foreach (string file in inputFiles){// 读取每个PDF文件并将其页面添加到输出PDF中  PdfReader reader = new PdfReader(file);int n = reader.NumberOfPages;for (int i = 1; i <= n; i++){pdf.AddPage(pdf.GetImportedPage(reader, i));}reader.Close();}if (pdfDoc != null) pdfDoc.Close();stream.Close();}string newOutputPdfPath = Path.Combine(outputFolderPath, "AllPDF_Merged.pdf");// 检查新输出文件是否已存在  if (File.Exists(newOutputPdfPath)){// 如果已存在,则删除旧文件并创建新文件  File.Delete(newOutputPdfPath);}// 重命名输出PDF文件  File.Move(outputPdfPath, newOutputPdfPath);}

四、导出结果

可将一个文件夹内的所有PDF合并成一个PDF文件导出。

在这里插入图片描述

五、完整源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using Microsoft.Win32;
using System.Diagnostics;namespace PDF合并
{public partial class Form1 : Form{public Form1(){InitializeComponent();}// 全局变量private static string lastFolderPath = ""; // 记录上次选择文件夹的路径private static string inputFolderPath = ""; // 输入文件夹路径private static string outputFolderPath = ""; // 输出文件夹路径/// <summary>/// 按钮,选择文件夹路径/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSelectPath_Click(object sender, EventArgs e){// 读取上次选择的文件夹路径  string registryKey = "Software\\PDF合并"; // 用您自己的应用程序名称替换YourAppName  if (Registry.CurrentUser.OpenSubKey(registryKey) != null){lastFolderPath = Registry.CurrentUser.OpenSubKey(registryKey).GetValue("LastFolder") as string;}// 创建并显示一个选择文件夹的对话框  FolderBrowserDialog folderDialog = new FolderBrowserDialog();folderDialog.Description = "选择包含PDF文件的文件夹:";folderDialog.SelectedPath = lastFolderPath; // 设置默认路径为用户上次选择的文件夹  if (folderDialog.ShowDialog() == DialogResult.OK){// 获取用户选择的文件夹路径  inputFolderPath = folderDialog.SelectedPath;// 创建输出文件夹路径(如果它不存在则创建它)  outputFolderPath = Path.Combine(inputFolderPath, "Output");if (!Directory.Exists(outputFolderPath)){Directory.CreateDirectory(outputFolderPath);}}txtPath.Text = inputFolderPath;}/// <summary>/// 按钮,确认合并PDF/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnOK_Click(object sender, EventArgs e){if (txtPath.Text == string.Empty){MessageBox.Show("请选择要合并的文件夹路径!");}else{// 调用合并PDF的方法  MergePDFs(inputFolderPath, outputFolderPath, "123");MessageBox.Show("合并完成!");// 打开导出的文件夹路径  Process.Start(outputFolderPath);}}/// <summary>/// 合并多个PDF文件为一个PDF文件/// </summary>/// <param name="inputFolderPath"></param>/// <param name="outputFolderPath"></param>/// <param name="outputPdfName"></param>public void MergePDFs(string inputFolderPath, string outputFolderPath, string outputPdfName){// 获取输入文件夹中所有的PDF文件  string[] inputFiles = Directory.GetFiles(inputFolderPath, "*.pdf");// 创建输出PDF文件路径  string outputPdfPath = Path.Combine(outputFolderPath, outputPdfName);// 创建输出PDF文件  using (FileStream stream = new FileStream(outputPdfPath, FileMode.Create)){Document pdfDoc = new Document();PdfCopy pdf = new PdfCopy(pdfDoc, stream);pdfDoc.Open();foreach (string file in inputFiles){// 读取每个PDF文件并将其页面添加到输出PDF中  PdfReader reader = new PdfReader(file);int n = reader.NumberOfPages;for (int i = 1; i <= n; i++){pdf.AddPage(pdf.GetImportedPage(reader, i));}reader.Close();}if (pdfDoc != null) pdfDoc.Close();stream.Close();}string newOutputPdfPath = Path.Combine(outputFolderPath, "AllPDF_Merged.pdf");// 检查新输出文件是否已存在  if (File.Exists(newOutputPdfPath)){// 如果已存在,则删除旧文件并创建新文件  File.Delete(newOutputPdfPath);}// 重命名输出PDF文件  File.Move(outputPdfPath, newOutputPdfPath);}}
}

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

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

相关文章

Android Studio导入项目 下载gradle很慢或连接超时

AS最常见的问题之一就是下载gradle非常慢&#xff0c;还经常出现下载失败的情况&#xff0c;没有gradle就无法build项目&#xff0c;所以一定要先解决gradle的下载问题&#xff0c;下面教大家两种常用方法。 因为我的项目绝大多数使用的是gradle-5.6.4-all&#xff0c;下面就以…

【搜索引擎设计:信息搜索怎么避免大海捞针?

在前面我们提到了网页爬虫设计&#xff1a;如何下载千亿级网页&#xff1f;中&#xff0c;我们讨论了大型分布式网络爬虫的架构设计&#xff0c;但是网络爬虫只是从互联网获取信息&#xff0c;海量的互联网信息如何呈现给用户&#xff0c;还需要使用搜索引擎完成。因此&#xf…

MYSQL分表分库 详解

目录 一、垂直拆分于水平拆分的区别&#xff1f; 垂直拆分 水平拆分 二、分表分库有哪些策略&#xff1f; Hash分片策略 枚举分片策略 日期分片策略 范围分片策略&#xff08;用的较多&#xff09; 三、分表分库之后&#xff0c;如何查询的呢&#xff1f; 四、分表分…

【RHEL】Vivado调用VCS+Verdi联合仿真报错解决

问题描述 在使用VCS Verdi仿真Vivado工程时&#xff0c;点击行为仿真按钮进度条窗口消失后&#xff0c;Verdi窗口并未出现&#xff0c;查看消息报错如下&#xff1a; vcs: line 34205: 119837 Segmentation fault (core dumped) ${TOOL_HOME}/bin/cfs_ident_exec -f ${X…

网络安全已死,趁早转行?

近年来&#xff0c;曾经被寄予厚望的网络安全行业似乎正逐渐失去昔日的辉煌。曾经一度备受瞩目的网络安全专业&#xff0c;如今却面临着降薪、裁员的困境。许多公司对网络安全的重视程度不高&#xff0c;网络安全岗位成了背锅的代名词。在这样的环境下&#xff0c;有人开始质疑…

智能小车项目(七)通过PID实现给定和实际速度值计算PWM输出

我们先看大脑&#xff08;上位机nano&#xff09; keybord_ctrl节点发布’cmd_vel’消息消息类型为Twist队列大小为1 pub rospy.Publisher(cmd_vel, Twist, queue_size1)if not stop: pub.publish(twist)driver_node订阅这个消息 当有消息时cmd_vel_callback回掉函数处理消息…

感染嗜肺军团菌是什么感觉?

记录一下最近生病的一次经历吧&#xff0c;可能加我好友的朋友注意到了&#xff0c;前几天我发了个圈&#xff0c;有热心的朋友还专门私信了我说明了他自己的情况和治疗经验&#xff0c;感谢他们。 ​ 那么关于这次生病的经历&#xff0c;给大家分享一下。 首先&#xff0c;这次…

redis夯实之路-持久化之RDB与AOF详解

数据库 初始化服务器时会根据redisServer的dbnum属性来决定创建多少个数据库&#xff0c;默认为16 使用select切换数据库 客服端状态redisClient结构的db属性记录了当前的目标数据库 RedisDb结构的dict字典保存了数据库的所有键值对&#xff0c;这个字典被称为键空间。 cru…

C++I/O流——(2)预定义格式的输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

【MySQL】MySQL表的约束-空属性/默认值/列属性/zerofill/主键/自增长/唯一键/外键

文章目录 表的约束1.空属性 --null && not null2.默认值 -- default3.列描述4.zerofill5.主键6.自增长7.唯一键8.外键 表的约束 表的约束&#xff1a;表中一定要有各种约束&#xff0c;通过约束&#xff0c;让我们未来插入数据库表中的数据是符合预期的。约束的本质是…

【QT】多层QTreeWidget与QStackedWidget的关联操作

通过点击多层QTreeWidget来控制QStackedWidget中的page页面切换 treeWidget设计 treeWidget设计&#xff1a; // treeWidget设计ui->treeWidget->clear();ui->treeWidget->setColumnCount(1);//第一层QStringList l;l<<"管理系统";QTreeWid…

iPhone“查找”最多可添加32个物品!

对于那些丢三落四的果粉来说&#xff0c;苹果的“查找”功能是一大福音。不管是丢失了iPhone、iPad、Mac、AirPods还是AirTag&#xff0c;都可以通过“查找”功能在地图上追踪设备的位置&#xff0c;甚至是远程锁定或抹掉设备的数据。 那么&#xff0c;iPhone的查找一次能支持添…

LeetCode 38 外观数列

题目描述 外观数列 给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列&#xff1a; countAndSay(1) "1…

软件测试|解决Github port 443 : Timed out连接超时的问题

前言 GitHub是全球最大的开源代码托管平台之一&#xff0c;许多开发者和团队使用它来管理和协作开源项目。但在当下&#xff0c;我们在clone或者提交代码时会经常遇到"GitHub Port 443: Timed Out"错误&#xff0c;这意味着我们的电脑无法建立与GitHub服务器的安全连…

UniRepLKNet实战:使用UniRepLKNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集一些问题 摘要 大核卷积神经网络&#xff08;ConvNets&#xff09;近年来受到广泛关注&#xff0c;但仍存在两个关键问题需要进一步研究。首先&#xff0c;目前的大型卷积神经网络架构大…

Spring Boot - Application Events 同步 VS 异步 发布订阅事件实战

文章目录 PreCode基础工程启动类切入口事件 发布事件同步 Listener异步Listener增加EnableAsync增加 Async 测试 Pre Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEv…

Android Lint的使用

代码检查方式一&#xff1a; Android Studio使用Lint进行代码检查 找到Analyze目录下的Inspect Code检查代码选项点击然后弹出下面这个框框&#xff0c;在这个列表选项中我们可以选择Inspect Code的范围&#xff0c;点击OK 待分析完毕后&#xff0c;我们可以在Inspection栏目中…

安装、运行和控制AI apps在您的计算机上一键式

pinokio 你是否曾为安装、运行和自动化 AI 应用程序和大模型而感到困惑&#xff1f;是否希望有一个简单而强大的工具来满足你的需求&#xff1f;如果是这样&#xff0c;那么 Pinokio 将会是你的理想选择&#xff01;Pinokio 是一款革命性的人工智能浏览器&#xff0c;是一个开…

Nocalhost 为 KubeSphere 提供更强大的云原生开发环境

1 应用商店安装 Nocalhost Server 已集成在 KubeSphere 应用商店&#xff0c;直接访问&#xff1a; 设置应用「名称」&#xff0c;确认应用「版本」和部署「位置」&#xff0c;点击「下一步」&#xff1a; 在「应用设置」标签页&#xff0c;可手动编辑清单文件或直接点击「安装…

HCIP-1

一、网络类型&#xff1a; 点到点 BMA&#xff1a;广播型多路访问 – 在一个MA网络中同时存在广播&#xff08;洪泛&#xff09;机制 NBMA&#xff1a;非广播型多路访问—在一个MA网络中&#xff0c;没有洪泛机制 MA&#xff1a;多路访问 在一个网段内&#xff0c;存在的节…