【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.hqwc.cn/news/335882.html

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

相关文章

RK3568平台开发系列讲解(Linux系统篇)/dev/mem 物理内存映射到用户态

🚀返回专栏总目录 文章目录 一、/dev/mem 配置二、/dev/mem 设备的使用方法三、mmap 函数沉淀、分享、成长,让自己和他人都能有所收获!😄 一、/dev/mem 配置 /dev/mem 是 Linux 系统中的一个虚拟设备,通常与 mmap 结合使用,可以将设备的物理内存映射到用户态,以实现用…

[Docker] Mac M1系列芯片上完美运行Docker

docker pull qinchz/dm8-arm64 container_name: dm8ports:- "5236:5236"mem_limit: 1gmemswap_limit: 1gvolumes:- /data/dm8:/home/dmdba/data 数据库实例参数已修改&#xff0c;接近oracle使用习惯 #字符集 utf-8 CHARSET1 #VARCHAR 类型对象的长度以字符为单位 …

JDK21和 Flowable 7.0.0

JDK21和 Flowable 7.0.0 一.Flowable二.项目搭建1.依赖包2.数据库3.资源文件1.YML配置文件2.Drools kbase3.Drools rule4.DMN 决策表5.BPMN 流文件 4.BPMN 流程图绘制插件5.测试代码1.启动类2.Flowable 配置3.Camel 配置1.Camel 配置2.Camel Router 定义 4.扩展类监听1.外部工作…

WPS或word中英文字母自动调整大小写,取消自动首字母大写,全部英文单词首字母大小写变换方法

提示&#xff1a;写英文论文时&#xff0c;如何实现英文字母大小写的自动切换&#xff0c;不用再傻傻的一个字母一个字母的编辑了&#xff0c;一篇文章搞定WPS与Word中字母大小写切换 文章目录 一、WPS英文单词大小写自动修改与首字母大写调整英文字母全部由大写变成小写 或 小…

003集Class类应用实例—python基础入门实例

面向对象编程是一种编程方式&#xff0c;此编程方式的落地需要使用 “类” 和 “对象” 来实现&#xff0c;所以&#xff0c;面向对象编程其实就是对 “类” 和 “对象” 的使用。 类就是一个模板&#xff0c;模板里可以包含多个函数&#xff0c;函数里实现一些功能 对象则是根…

OpenFegin日志增强

OpenFeign配置日志增强功能 OpenFeign提供了日志打印功能&#xff0c;我们可以通过配置来调整日恙级别&#xff0c;从而了解Feign 中 Http请求的细节。 说白了就是对Feign接口的调用情况进行监控和输出 日志级别 NONE&#xff1a;默认的&#xff0c;不显示任何日志; BASIC&…

继承和多态的详解

文章目录 1. 继承1.1 继承的概念1.3 继承的语法1.3 父类成员访问1.3.1 子类中访问父类的成员变量1.3.2 子类中访问父类的成员方法 1.4 子类构造方法 2.super关键字2.1 super关键字的概念2.2 super和this的区别 3. 在继承中访问限定符的可见性4. 继承方式的分类5. 多态5.1 多态的…

ULINK2仿真器安装使用之工程设置

一、 ULINK2仿真器 ULINK2是ARM公司最新推出的配套RealView MDK使用的仿真器&#xff0c;是ULink仿真器的升级版本。ULINK2不仅具有ULINK仿真器的所有功能&#xff0c;还增加了串行调试&#xff08;SWD&#xff09;支持&#xff0c;返回时钟支持和实时代理等功能。开发工程师通…

Apache Doris (六十二): Spark Doris Connector - (2)-使用

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. 将编译jar包加入本地Maven仓库

Ps:图层样式 - 混合选项

“图层样式”对话框中的“混合选项” Blending Options提供了多种方式来控制图层的可视化效果以及如何与其他图层交互。 常规混合 General Blending 混合模式 Blend Mode 设置当前图层的混合模式。 即&#xff0c;“图层”面板上的混合模式选项。 图层混合模式仅影响图层的原有…

初学者的基本 Python 面试问题和答案

文章目录 专栏导读1、什么是Python&#xff1f;列出 Python 在技术领域的一些流行应用。2、在目前场景下使用Python语言作为工具有什么好处&#xff1f;3、Python是编译型语言还是解释型语言&#xff1f;4、Python 中的“#”符号有什么作用&#xff1f;5、可变数据类型和不可变…

Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用

分享一个有趣的小工具&#xff0c;10MB 身材的小工具&#xff0c;能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。 让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的&#xff0c;非 OpenAI 的 API 私有部署和使用起来。 写在前面 这个小工具软件写于两…