网站首页 > 基础教程 正文
会点C#的话你就可以照着下面的代码自己写个非常实用的PDF拆分工具了,再也不用为了拆分PDF发愁了,可以实现只拆分PDF中的一页,也可以实现拆分PDF中连续的页,还能实现拆分不连续的多页,当然了不管是哪一种,每种都是按页拆分出单个的PDF文件,比如你选了连续页6-8,那么就会拆分出6,7,8三个PDF文件,并不是把6-8页拆出一个PDF文件。
界面规划
为了方便拆分带页码的PDF,这里增加了页偏移数这个东西,如果你的PDF没有页码或者第一页就是页码1,那么不用考虑这个页偏移数。
假如你的PDF页码是从第三页开始的,前两页就没有页码,那么这个页偏移数就是2,那么后面的页码范围就按你看到的页码填就行了,避免手动计算。
单页:就是把单独的一页拆分出来
页码范围:就是把连续的页拆分出多个PDF文件
不连续页:就是把你输入的多个不连续的页码拆分出多个PDF文件
代码实现
实现拆分的主代码,需要引用iTextsharp包,我们把需要拆分的页码信息保存在list<int>中,在进行拆分时,检查下用户输入的页码是否超出了PDF的最大页,不然的话会出错。
public void DoPDF(string filePath, List<int> Pages)
{
string newFile = "";
PdfReader reader = new PdfReader(path);
PdfReader.unethicalreading = true;
int n = reader.NumberOfPages;
iTextSharp.text.Rectangle pagesize = reader.GetPageSize(1);
float width = pagesize.Width;
float height = pagesize.Height;
int offset =Convert.ToInt32(txt_offset.Text.Trim().ToString());
foreach (int i in Pages)
{
if ((i+offset) == 0||(i+offset) > n)
{
continue;
}
// 创建一个文档变量
Document document = new Document(pagesize, 50, 50, 50, 50);
newFile = System.IO.Path.GetDirectoryName(filePath) + "\\" +i.ToString()+"_"+ Fname; ;
// 创建该文档
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(newFile, FileMode.Create));
// 打开文档
document.Open();
// 添加内容
PdfContentByte cb = writer.DirectContent;
document.NewPage();
PdfImportedPage page1 = writer.GetImportedPage(reader,i+offset );
cb.AddTemplate(page1, 1f, 0, 0, 1f, 0, 0);
// 关闭文档
document.Close();
}
ShowMessage("PDF文件已拆分完成,请打开原文件夹进行查看!");
}
然后针对不同的选择做不同的页码处理,这里有三种选择的模式,分别对应单页、多页、不连续页,其实就是怎么把页码信息保存到list<int>的问题。
int mode = 0;
List<int> pages = new List<int>();
if (path.Length < 1)
{
ShowMessage("请先选择一个需要移除密码的PDF文件哦!");
return;
}
mode = ModeSelect();
if (mode == 1)
{
int page =Convert.ToInt32(txt_dy.Value);
pages.Add(page);
DoPDF(path, pages);
}
if (mode == 2)
{
int p1=Convert.ToInt32(txt_begin.Text.ToString());
int p2=Convert.ToInt32(txt_end.Text.ToString());
if (p1 > p2)
{
ShowMessage("开始页不能大于结束页,请重新选择!");
return;
}
for (int i = p1; i <= p2; i++)
{
pages.Add(i);
}
DoPDF(path, pages);
}
if (mode == 3)
{
string SPage=txt_duoye.Text.ToString().Trim();
SPage = SPage.Replace(",", ",").Replace(";", ",").Replace(";",",").Replace("-",",").Replace("=",",");
string[] page = SPage.Split(',');
for (int i = 0; i < page.Length; i++)
{
string p=page[i];
bool isNumeric = int.TryParse(p, out int num);
if (!isNumeric)
{
ShowMessage("不连续页中有页码不是数字,请检查后再试!");
return;
}
pages.Add(num);
}
DoPDF(path, pages);
}
完美运行后它是下面这样子的,如果你想把上面的多页拆出来变成一个文件的话,只需要把创建文档的过程放在循环外执行就可以了。
看了后希望你也能动手做个自己的专属拆分小软件。
猜你喜欢
- 2024-12-26 C#如何获取计算机或硬件信息 c#获取其他程序界面内容
- 2024-12-26 C#中把PDF导出为图片的方法分享 c# 生成 pdf
- 2024-12-26 C# 操作Excel文件之NPOI (一) c#操作excel文件读写
- 2024-12-26 解释C#中的任务并?库(TPL)及其?途
- 2024-12-26 解释 C# 中的任务并?库是如何?作的
- 2024-12-26 NPOI在C#中的用法 c++ npoi
- 2024-12-26 C#程序员参考手册 高清版 c#程序设计实用教程
- 2024-12-26 C#远程唤醒指定客户端代码 c#远程通讯
- 2024-12-26 一起来看看C#的圈复杂度 c# :?
- 2024-12-26 TCP网络编程中connect()、listen()和accept()三者之间的关系
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)