c# PDF文件合并工具

embedded/2025/1/22 15:43:24/

界面

主要用于发票PDF文件的合并。经常出差要报销的很有用。

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;
//using PdfSharp.Pdf;
//using PdfSharp.Pdf.IO;namespace PdfMergeApp
{public partial class Form1 : Form{public Form1(){InitializeComponent();btnOpenDir.Enabled = false;}private List<string> pdfList;private string outputPdfDir;private void bntSelectDir_Click(object sender, EventArgs e){FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();DialogResult dialogResult = folderBrowserDialog.ShowDialog();if (dialogResult == DialogResult.OK){string selectedFolderPath = folderBrowserDialog.SelectedPath;//Console.WriteLine("选择的目录是: " + selectedFolderPath);txtFileDir.Text = selectedFolderPath;pdfList = Directory.GetFiles(selectedFolderPath, "*.pdf").ToList();if (pdfList != null && pdfList.Count > 0){pdfList = pdfList.OrderBy(t => t).ToList();}addPdfList();}}private void addPdfList(){this.listViewWorkLogs.Items.Clear();int no = 1;foreach (var item in pdfList){ListViewItem lvItem = new ListViewItem();lvItem.ForeColor = Color.Blue;lvItem.Text = no.ToString();lvItem.StateImageIndex = 0;lvItem.Tag = no - 1;lvItem.SubItems.Add(item);this.listViewWorkLogs.Items.Add(lvItem);no++;}}/// <summary>/// 合并多个PDF文件为一个PDF文件/// </summary>/// <param name="inputFolderPath"></param>/// <param name="outputFolderPath"></param>/// <param name="outputPdfName"></param>public void MergePDFs(string outputFilePath, params string[] inputFilePaths){// 获取输入文件夹中所有的PDF文件  //string[] inputFiles = Directory.GetFiles(inputFolderPath, "*.pdf");// 创建输出PDF文件路径  //string outputPdfPath = Path.Combine(outputFolderPath, outputPdfName);// 检查新输出文件是否已存在  if (File.Exists(outputFilePath)){// 如果已存在,则删除旧文件并创建新文件  File.Delete(outputFilePath);}// 创建输出PDF文件  using (FileStream stream = new FileStream(outputFilePath, FileMode.Create)){Document pdfDoc = new Document();PdfCopy pdf = new PdfCopy(pdfDoc, stream);pdfDoc.Open();foreach (string file in inputFilePaths){// 读取每个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();}}/// <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);outputPdfPath.CreateDirectoryByPath();// 创建输出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");//string newOutputPdfPath = Path.Combine(outputFolderPath, outputPdfName);// 检查新输出文件是否已存在  if (File.Exists(newOutputPdfPath)){// 如果已存在,则删除旧文件并创建新文件  File.Delete(newOutputPdfPath);}// 重命名输出PDF文件  File.Move(outputPdfPath, newOutputPdfPath);}/// <summary>/// 合并多个PDF文件为一个PDF文件/// </summary>/// <param name="inputFolderPath"></param>/// <param name="outputFolderPath"></param>/// <param name="outputPdfName"></param>public bool MergePDFs(string outputFolderPath, string outputPdfName){var isOk = false;try{// 获取输入文件夹中所有的PDF文件  //string[] inputFiles = Directory.GetFiles(inputFolderPath, "*.pdf");// 创建输出PDF文件路径  string outputPdfPath = Path.Combine(outputFolderPath, outputPdfName);outputPdfPath.CreateDirectoryByPath();// 创建输出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 pdfList){// 读取每个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");//string newOutputPdfPath = Path.Combine(outputFolderPath, outputPdfName);// 检查新输出文件是否已存在  if (File.Exists(newOutputPdfPath)){// 如果已存在,则删除旧文件并创建新文件  File.Delete(newOutputPdfPath);}// 重命名输出PDF文件  File.Move(outputPdfPath, newOutputPdfPath);isOk = true;}catch (Exception ex){MessageBox.Show("合并异常:" + ex.Message);}return isOk;}private void btnMergePDF_Click(object sender, EventArgs e){if (pdfList != null && pdfList.Count > 0){var outputFilePath = txtFileDir.Text + "\\MergePDF_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";//MergePDFs(outputFilePath, pdfList.ToArray());var outputPdfName = "MergePDF_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";var outputPdfNameAll = txtFileDir.Text + "\\MergePDF\\" + outputPdfName;outputPdfDir = txtFileDir.Text + "\\MergePDF";//MergePDFs(txtFileDir.Text, txtFileDir.Text+ "\\MergePDF", outputPdfName);var isOk = MergePDFs(outputPdfDir, outputPdfName);if (isOk){lblResult.Text = "合并完成。输出文件目录:" + outputPdfNameAll;btnOpenDir.Enabled = true;MessageBox.Show("合并完成");}                }else{MessageBox.Show("你没有要合并的PDF文件");}}private void btnOpenDir_Click(object sender, EventArgs e){if (!string.IsNullOrEmpty(outputPdfDir)){OpenDirectory(outputPdfDir);}else{MessageBox.Show("合并文件没有生成");}}static void OpenDirectory(string path){ProcessStartInfo startInfo = new ProcessStartInfo{Arguments = path,FileName = "explorer.exe"};Process.Start(startInfo);}private void listViewWorkLogs_ItemCheck(object sender, ItemCheckEventArgs e){var listViewItem = sender as ListViewItem;var index = listViewItem.Tag;var a = 0;}private int selectIndex;private int newIndex;//private string selectFileName;private void listViewWorkLogs_SelectedIndexChanged(object sender, EventArgs e){if (listViewWorkLogs.SelectedItems.Count > 0){var listViewItem = listViewWorkLogs.SelectedItems[0];selectIndex = (int)listViewItem.Tag;newIndex = selectIndex;}}private void btnMoveUp_Click(object sender, EventArgs e){if (pdfList != null && pdfList.Count > 0){newIndex--;if (newIndex >= 0 && newIndex < pdfList.Count){var selectFileName = pdfList[selectIndex];pdfList[selectIndex] = pdfList[newIndex];pdfList[newIndex] = selectFileName;selectIndex = newIndex;addPdfList();}else{newIndex = 0;}}}private void btnMoveDown_Click(object sender, EventArgs e){if (pdfList != null && pdfList.Count > 0){newIndex++;if (newIndex < pdfList.Count){var selectFileName = pdfList[selectIndex];pdfList[selectIndex] = pdfList[newIndex];pdfList[newIndex] = selectFileName;selectIndex = newIndex;addPdfList();}else{newIndex = pdfList.Count - 1;}}}}
}

UI代码


namespace PdfMergeApp
{partial class Form1{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要修改/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){this.label1 = new System.Windows.Forms.Label();this.txtFileDir = new System.Windows.Forms.TextBox();this.button1 = new System.Windows.Forms.Button();this.bntSelectDir = new System.Windows.Forms.Button();this.btnMergePDF = new System.Windows.Forms.Button();this.groupBox1 = new System.Windows.Forms.GroupBox();this.listViewWorkLogs = new System.Windows.Forms.ListView();this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));this.groupBox2 = new System.Windows.Forms.GroupBox();this.lblResult = new System.Windows.Forms.Label();this.btnOpenDir = new System.Windows.Forms.Button();this.btnMoveUp = new System.Windows.Forms.Button();this.btnMoveDown = new System.Windows.Forms.Button();this.groupBox1.SuspendLayout();this.groupBox2.SuspendLayout();this.SuspendLayout();// // label1// this.label1.AutoSize = true;this.label1.Location = new System.Drawing.Point(12, 9);this.label1.Name = "label1";this.label1.Size = new System.Drawing.Size(75, 15);this.label1.TabIndex = 0;this.label1.Text = "选择目录:";// // txtFileDir// this.txtFileDir.Location = new System.Drawing.Point(90, 6);this.txtFileDir.Name = "txtFileDir";this.txtFileDir.ReadOnly = true;this.txtFileDir.Size = new System.Drawing.Size(491, 25);this.txtFileDir.TabIndex = 1;// // button1// this.button1.Location = new System.Drawing.Point(120, 141);this.button1.Name = "button1";this.button1.Size = new System.Drawing.Size(8, 8);this.button1.TabIndex = 2;this.button1.Text = "button1";this.button1.UseVisualStyleBackColor = true;// // bntSelectDir// this.bntSelectDir.Location = new System.Drawing.Point(600, 6);this.bntSelectDir.Name = "bntSelectDir";this.bntSelectDir.Size = new System.Drawing.Size(118, 35);this.bntSelectDir.TabIndex = 3;this.bntSelectDir.Text = "选择目录";this.bntSelectDir.UseVisualStyleBackColor = true;this.bntSelectDir.Click += new System.EventHandler(this.bntSelectDir_Click);// // btnMergePDF// this.btnMergePDF.Location = new System.Drawing.Point(724, 7);this.btnMergePDF.Name = "btnMergePDF";this.btnMergePDF.Size = new System.Drawing.Size(94, 32);this.btnMergePDF.TabIndex = 3;this.btnMergePDF.Text = "合并PDF";this.btnMergePDF.UseVisualStyleBackColor = true;this.btnMergePDF.Click += new System.EventHandler(this.btnMergePDF_Click);// // groupBox1// this.groupBox1.Controls.Add(this.listViewWorkLogs);this.groupBox1.Location = new System.Drawing.Point(15, 49);this.groupBox1.Name = "groupBox1";this.groupBox1.Size = new System.Drawing.Size(764, 589);this.groupBox1.TabIndex = 4;this.groupBox1.TabStop = false;this.groupBox1.Text = "文件列表";// // listViewWorkLogs// this.listViewWorkLogs.BackColor = System.Drawing.SystemColors.InactiveCaption;this.listViewWorkLogs.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {this.columnHeader1,this.columnHeader2});this.listViewWorkLogs.Dock = System.Windows.Forms.DockStyle.Fill;this.listViewWorkLogs.FullRowSelect = true;this.listViewWorkLogs.GridLines = true;this.listViewWorkLogs.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;this.listViewWorkLogs.HideSelection = false;this.listViewWorkLogs.ImeMode = System.Windows.Forms.ImeMode.NoControl;this.listViewWorkLogs.LabelWrap = false;this.listViewWorkLogs.Location = new System.Drawing.Point(3, 21);this.listViewWorkLogs.MultiSelect = false;this.listViewWorkLogs.Name = "listViewWorkLogs";this.listViewWorkLogs.Size = new System.Drawing.Size(758, 565);this.listViewWorkLogs.TabIndex = 2;this.listViewWorkLogs.UseCompatibleStateImageBehavior = false;this.listViewWorkLogs.View = System.Windows.Forms.View.Details;this.listViewWorkLogs.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.listViewWorkLogs_ItemCheck);this.listViewWorkLogs.SelectedIndexChanged += new System.EventHandler(this.listViewWorkLogs_SelectedIndexChanged);// // columnHeader1// this.columnHeader1.Text = "序号";this.columnHeader1.Width = 50;// // columnHeader2// this.columnHeader2.Text = "文件名";this.columnHeader2.Width = 580;// // groupBox2// this.groupBox2.Controls.Add(this.lblResult);this.groupBox2.Controls.Add(this.btnOpenDir);this.groupBox2.Location = new System.Drawing.Point(15, 644);this.groupBox2.Name = "groupBox2";this.groupBox2.Size = new System.Drawing.Size(809, 68);this.groupBox2.TabIndex = 5;this.groupBox2.TabStop = false;this.groupBox2.Text = "合并结果";// // lblResult// this.lblResult.AutoSize = true;this.lblResult.Location = new System.Drawing.Point(17, 34);this.lblResult.Name = "lblResult";this.lblResult.Size = new System.Drawing.Size(55, 15);this.lblResult.TabIndex = 0;this.lblResult.Text = "label2";// // btnOpenDir// this.btnOpenDir.Location = new System.Drawing.Point(709, 24);this.btnOpenDir.Name = "btnOpenDir";this.btnOpenDir.Size = new System.Drawing.Size(94, 32);this.btnOpenDir.TabIndex = 3;this.btnOpenDir.Text = "查看文件";this.btnOpenDir.UseVisualStyleBackColor = true;this.btnOpenDir.Click += new System.EventHandler(this.btnOpenDir_Click);// // btnMoveUp// this.btnMoveUp.Location = new System.Drawing.Point(785, 141);this.btnMoveUp.Name = "btnMoveUp";this.btnMoveUp.Size = new System.Drawing.Size(33, 42);this.btnMoveUp.TabIndex = 6;this.btnMoveUp.Text = "上移";this.btnMoveUp.UseVisualStyleBackColor = true;this.btnMoveUp.Click += new System.EventHandler(this.btnMoveUp_Click);// // btnMoveDown// this.btnMoveDown.Location = new System.Drawing.Point(785, 224);this.btnMoveDown.Name = "btnMoveDown";this.btnMoveDown.Size = new System.Drawing.Size(33, 42);this.btnMoveDown.TabIndex = 6;this.btnMoveDown.Text = "下移";this.btnMoveDown.UseVisualStyleBackColor = true;this.btnMoveDown.Click += new System.EventHandler(this.btnMoveDown_Click);// // Form1// this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(836, 724);this.Controls.Add(this.btnMoveDown);this.Controls.Add(this.btnMoveUp);this.Controls.Add(this.groupBox2);this.Controls.Add(this.groupBox1);this.Controls.Add(this.btnMergePDF);this.Controls.Add(this.bntSelectDir);this.Controls.Add(this.button1);this.Controls.Add(this.txtFileDir);this.Controls.Add(this.label1);this.Name = "Form1";this.Text = "PDF文件合并";this.groupBox1.ResumeLayout(false);this.groupBox2.ResumeLayout(false);this.groupBox2.PerformLayout();this.ResumeLayout(false);this.PerformLayout();}#endregionprivate System.Windows.Forms.Label label1;private System.Windows.Forms.TextBox txtFileDir;private System.Windows.Forms.Button button1;private System.Windows.Forms.Button bntSelectDir;private System.Windows.Forms.Button btnMergePDF;private System.Windows.Forms.GroupBox groupBox1;private System.Windows.Forms.ListView listViewWorkLogs;private System.Windows.Forms.ColumnHeader columnHeader1;private System.Windows.Forms.ColumnHeader columnHeader2;private System.Windows.Forms.GroupBox groupBox2;private System.Windows.Forms.Label lblResult;private System.Windows.Forms.Button btnOpenDir;private System.Windows.Forms.Button btnMoveUp;private System.Windows.Forms.Button btnMoveDown;}
}

程序下载

https://download.csdn.net/download/cjh16606260986/90289204


http://www.ppmy.cn/embedded/156086.html

相关文章

ucharts 使用

1.使用 ucharts 在微信小程序中 层级过高 导致布局错乱 添加&#xff1a;canvas2d true 发布到线上即可 开启后本地看到的话会混乱 但线上没问题 我看百度上搜的 说再加一个canvasId"myCanvasId" 要随便写一个 id <qiun-data-chartstype"ring":opts&…

【Nacos】健康检查机制(附实操案例)

目录 Nacos的两种健康检查机制服务实例类型注意事项实操演示 Nacos的两种健康检查机制 Nacos作为一个服务注册中心&#xff0c;需要感知服务的状态&#xff0c;才能为服务调用方提供良好的服务&#xff0c;而它自身提供了两种健康检查机制&#xff1a; 客户端主动上报机制&am…

【Postgres_Python】使用python脚本批量创建和导入多个PG数据库

之前批量创建和导入数据库分为2个python脚本进行&#xff0c;现整合优化代码合并为一个python脚本&#xff0c;可同步实现数据库的创建和数据导入。之前的文章链接&#xff1a; 【Postgres_Python】使用python脚本批量创建PG数据库 【Postgres_Python】使用python脚本将多个.S…

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…

C++类型转换总结

类型转换 隐式转换 C自动执行很多类型转换&#xff1a; 将一种算术类型的值赋给另一种算术类型的变量时&#xff0c;C将对值进行转换&#xff1b; 表达式中包含不同的类型时&#xff0c;C将对值进行转换&#xff1b; 将参数传递给函数时&#xff0c;C将对值进行转换。 C类…

【BUUCTF】[RCTF2015]EasySQL1

二次注入原理 是一种比较隐蔽的 SQL 注入类型 用户输入的数据先被存储到数据库中&#xff08;此时可能未被恶意利用&#xff09;&#xff0c;后续应用程序从数据库中读取该数据并再次使用在 SQL 查询中&#xff0c;而此时就可能导致 SQL 注入问题。 如&#xff0c;用户注册时…

【Node.js]

一、概述 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 &#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c; 让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。 官网地…

搭建一个基于Spring Boot的书籍学习平台

搭建一个基于Spring Boot的书籍学习平台可以涵盖多个功能模块&#xff0c;例如用户管理、书籍管理、学习进度跟踪、笔记管理、评论和评分等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的书籍学习平台。 — 1. 项目初始化 使用 Spring Initializr 生成一个…