文章目录
一、下载iTextSharp.dll
下载iTextSharp.dll
可使用联机方式或者文件下载方式。
命名空间引入
代码开始时引入了一些命名空间,这些命名空间包含了程序运行所需的类和方法。
- System、System.Collections.Generic、System.ComponentModel等是.NET框架的核心命名空间。
- iTextSharp.text 和 iTextSharp.text.pdf 是用于处理PDF文件的库。
- System.IO 是用于文件和目录操作的命名空间。
- Microsoft.Win32 是用于访问Windows注册表的命名空间。
- System.Diagnostics 是用于诊断和调试的命名空间。
csharp
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;
二、界面设计
三、代码
全局变量
定义了三个静态字符串变量,用于存储上次选择的文件夹路径、输入文件夹路径和输出文件夹路径。
csharp
// 全局变量
private static string lastFolderPath = ""; // 记录上次选择文件夹的路径
private static string inputFolderPath = ""; // 输入文件夹路径
private static string outputFolderPath = ""; // 输出文件夹路径
选择文件夹的按钮
从Windows注册表中读取上次选择的文件夹路径。
显示一个文件夹选择对话框,让用户选择包含PDF文件的文件夹。
如果用户选择了一个文件夹,将该路径存储在inputFolderPath变量中,并创建(如果不存在)一个名为"Output"的子文件夹作为输出路径。
将选择的路径显示在文本框txtPath中。
csharp
/// <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文件,并显示一个消息告知用户合并已完成,然后打开导出的文件夹供用户查看。
csharp
/// <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"。
csharp
/// <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文件导出。
五、完整源码
csharp
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);
}
}
}