C# 如何合并和拆分PDF文件
一、合并和拆分PDF文件的方式
PDF文件使用了工業(yè)標(biāo)準(zhǔn)的壓縮算法,易于傳輸與儲(chǔ)存。它還是頁獨(dú)立的,一個(gè)PDF文件包含一個(gè)或多個(gè)“頁“,可以單獨(dú)處理各頁,特別適合多處理器系統(tǒng)的工作。PDF文件結(jié)構(gòu)主要可以分為四個(gè)部分:首部、文件體、交叉引用表、尾部。PDF操作類庫(kù)非常多,如下圖所示,常用的類庫(kù)有:Spire.Pdf、iTextSharp。
二、使用 Spire.Pdf 合并和拆分PDF文件
使用 Nuget 添加Spire.Pdf 類庫(kù),然后添加如下代碼:
/// <summary> /// 合并PDF文件 /// </summary> /// <param name="files">待合并文件列表</param> /// <param name="outFile">合并生成的文件名稱</param> static void SpirePdfMerge(string[] files, string outFile) { var doc = Spire.Pdf.PdfDocument.MergeFiles(files); doc.Save(outFile, FileFormat.PDF); } /// <summary> /// 按每頁拆分PDF文件 /// </summary> /// <param name="inFile">待拆分PDF文件名稱</param> static void SpirePdfSplit(string inFile) { var doc = new Spire.Pdf.PdfDocument(inFile); doc.Split("SpirePdf_拆分-{0}.pdf"); doc.Close(); }
三、使用 iTextSharp 合并和拆分PDF文件
使用 Spire.Pdf 操作PDF文件,簡(jiǎn)單高效,但生成的PDF文件帶有水印,即使使用破解版在第一頁還是有水印,我們可以使用 iTextSharp 類庫(kù),該類庫(kù)生成的PDF無水印,具體使用如下:
/// <summary> /// 合并PDF文件 /// </summary> /// <param name="inFiles">待合并文件列表</param> /// <param name="outFile">合并生成的文件名稱</param> static void iTextSharpPdfMerge(List<String> inFiles, String outFile) { using (var stream = new FileStream(outFile, FileMode.Create)) { using (var doc = new Document()) { using (var pdf = new PdfCopy(doc, stream)) { doc.Open(); inFiles.ForEach(file => { var reader = new PdfReader(file); for (int i = 0; i < reader.NumberOfPages; i++) { var page = pdf.GetImportedPage(reader, i + 1); pdf.AddPage(page); } pdf.FreeReader(reader); reader.Close(); }); } } } } /// <summary> /// 按每頁拆分PDF文件 /// </summary> /// <param name="inFile">待拆分PDF文件名稱</param> static void iTextSharpPdfSplit(string inFile) { using (var reader = new PdfReader(inFile)) { // 注意起始頁是從1開始的 for (int i = 1; i <= new PdfReader(inFile).NumberOfPages; i++) { using (var sourceDocument = new Document(reader.GetPageSizeWithRotation(i))) { var pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream($"iTextSharp_拆分_{i}.pdf", System.IO.FileMode.Create)); sourceDocument.Open(); var importedPage = pdfCopyProvider.GetImportedPage(reader, i); pdfCopyProvider.AddPage(importedPage); } } } }
四、測(cè)試結(jié)果
完整代碼如下:
using Spire.Pdf; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Mime; using System.Text; using System.Threading.Tasks; using iTextSharp.text; using iTextSharp.text.pdf; using PdfDocument = iTextSharp.text.pdf.PdfDocument; namespace Pdf { class Program { static void Main(string[] args) { try { SpirePdfMerge(Directory.GetFiles("Merge"), "SpirePdfMerge.pdf"); Console.WriteLine("使用 Spire.Pdf 合并文件完成..."); SpirePdfSplit($"{AppDomain.CurrentDomain.BaseDirectory}Split\\1.pdf"); Console.WriteLine("使用 Spire.Pdf 拆分文件完成..."); iTextSharpPdfMerge(Directory.GetFiles("Merge").ToList(), "iTextSharpPdfMerge.pdf"); Console.WriteLine("使用 iTextSharp 合并文件完成..."); iTextSharpPdfSplit($"{AppDomain.CurrentDomain.BaseDirectory}Split\\2.pdf"); Console.WriteLine("使用 iTextSharp 拆分文件完成..."); } catch (Exception e) { Console.WriteLine(e); } finally { Console.ReadKey(); } } #region Spire.Pdf /// <summary> /// 合并PDF文件 /// </summary> /// <param name="files">待合并文件列表</param> /// <param name="outFile">合并生成的文件名稱</param> static void SpirePdfMerge(string[] files, string outFile) { var doc = Spire.Pdf.PdfDocument.MergeFiles(files); doc.Save(outFile, FileFormat.PDF); } /// <summary> /// 按每頁拆分PDF文件 /// </summary> /// <param name="inFile">待拆分PDF文件名稱</param> static void SpirePdfSplit(string inFile) { var doc = new Spire.Pdf.PdfDocument(inFile); doc.Split("SpirePdf_拆分-{0}.pdf"); doc.Close(); } #endregion #region iTextSharp.text.pdf /// <summary> /// 合并PDF文件 /// </summary> /// <param name="inFiles">待合并文件列表</param> /// <param name="outFile">合并生成的文件名稱</param> static void iTextSharpPdfMerge(List<String> inFiles, String outFile) { using (var stream = new FileStream(outFile, FileMode.Create)) { using (var doc = new Document()) { using (var pdf = new PdfCopy(doc, stream)) { doc.Open(); inFiles.ForEach(file => { var reader = new PdfReader(file); for (int i = 0; i < reader.NumberOfPages; i++) { var page = pdf.GetImportedPage(reader, i + 1); pdf.AddPage(page); } pdf.FreeReader(reader); reader.Close(); }); } } } } /// <summary> /// 按每頁拆分PDF文件 /// </summary> /// <param name="inFile">待拆分PDF文件名稱</param> static void iTextSharpPdfSplit(string inFile) { using (var reader = new PdfReader(inFile)) { // 注意起始頁是從1開始的 for (int i = 1; i <= new PdfReader(inFile).NumberOfPages; i++) { using (var sourceDocument = new Document(reader.GetPageSizeWithRotation(i))) { var pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream($"iTextSharp_拆分_{i}.pdf", System.IO.FileMode.Create)); sourceDocument.Open(); var importedPage = pdfCopyProvider.GetImportedPage(reader, i); pdfCopyProvider.AddPage(importedPage); } } } } #endregion } }
測(cè)試效果如下圖所示:
以上就是C# 如何合并和拆分PDF文件的詳細(xì)內(nèi)容,更多關(guān)于C# 合并和拆分PDF文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#實(shí)現(xiàn)讀取txt通用的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了C#讀取txt通用的方法,兼容所有的UTF-8、Unicode(Little Endian)、BigEndianUnicode,有需要的小伙伴可以了解下2024-01-01C#實(shí)現(xiàn)集合轉(zhuǎn)換成json格式數(shù)據(jù)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)集合轉(zhuǎn)換成json格式數(shù)據(jù)的方法,涉及C#針對(duì)dataTable、Enumerable及Json格式數(shù)據(jù)的遍歷及轉(zhuǎn)換操作相關(guān)技巧,需要的朋友可以參考下2016-07-07C#使用udp如何實(shí)現(xiàn)消息的接收和發(fā)送
這篇文章主要介紹了C#使用udp如何實(shí)現(xiàn)消息的接收和發(fā)送問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02C#中類成員的定義的修飾關(guān)鍵詞知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了關(guān)于C#中類成員的定義的修飾關(guān)鍵詞知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考下。2020-02-02