专业编程基础技术教程

网站首页 > 基础教程 正文

拆分PDF还得充会员,看看C#怎么实现花式拆分

ccvgpt 2024-12-26 12:10:46 基础教程 10 ℃

会点C#的话你就可以照着下面的代码自己写个非常实用的PDF拆分工具了,再也不用为了拆分PDF发愁了,可以实现只拆分PDF中的一页,也可以实现拆分PDF中连续的页,还能实现拆分不连续的多页,当然了不管是哪一种,每种都是按页拆分出单个的PDF文件,比如你选了连续页6-8,那么就会拆分出6,7,8三个PDF文件,并不是把6-8页拆出一个PDF文件。

界面规划

为了方便拆分带页码的PDF,这里增加了页偏移数这个东西,如果你的PDF没有页码或者第一页就是页码1,那么不用考虑这个页偏移数。

拆分PDF还得充会员,看看C#怎么实现花式拆分

假如你的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);
 }

完美运行后它是下面这样子的,如果你想把上面的多页拆出来变成一个文件的话,只需要把创建文档的过程放在循环外执行就可以了。

看了后希望你也能动手做个自己的专属拆分小软件。

Tags:

最近发表
标签列表