源码下载:iTextSharp实现PDF的合并与分卷https://download.youkuaiyun.com/download/xjzdr/85519979
在做一个项目时,涉及到大量的PDF文件(几千甚至上万个),用户需要将所有的PDF进行打印装订,为省去用户的麻烦,程序需要按指定的顺序进行合并,然后方便用户打印。
在合并过程中,又涉及到另外一个问题,PDF文件超过4G后,保存就出现问题。又需要将分成多个PDF。
下面的代码演示如何合并PDf,并分成多个PDF文件。
新建一项目,添加 iTextSharp引用:
核心代码:
for (int i = 0; i < files_pdf.Length; i++)
{
#region
try
{
pdfreader = new PdfReader( files_pdf[i]);
pdfreader.ConsolidateNamedDestinations();
n = pdfreader.NumberOfPages;//PDF的页数
tempBookmarks = SimpleBookmark.GetBookmark(pdfreader);
//此处也可以改为根据合并后PDF的文件大小分割
if (i % 10 == 0)//每10个PDF合并成一个PDF文件,如果需要改为每100个PDF合并成一个,改为: if (i % 100 == 0)
{
firstpage = true;
if (pdfCpy != null)
{
pdfCpy.Outlines = bookmarks;//必须要此行代码,否则,生成的PDF无法打开
}
if (document.IsOpen())
document.Close();
outputPdf = Application.StartupPath + "/合并后的PDF-" + "-" + list_Pdf.Count + ".pdf";
list_Pdf.Add(outputPdf);
}
else
firstpage = false;
if (firstpage == true)
{
document = new iTextSharp.text.Document(pdfreader.GetPageSizeWithRotation(1));
pdfCpy = new PdfCopy(document, new FileStream(outputPdf, FileMode.Create));
document.Open();
SimpleBookmark.ShiftPageNumbers(tempBookmarks, page_offset, null);
page_offset += n;
if (tempBookmarks != null)
bookmarks.AddRange(tempBookmarks);
totalPages = n;
}
else
{
SimpleBookmark.ShiftPageNumbers(tempBookmarks, page_offset, null);
if (tempBookmarks != null)
bookmarks.AddRange(tempBookmarks);
page_offset += n;
totalPages += n;
}
for (int j = 1; j <= n; j++)
{
if (pdfCpy != null)
{
pdfimportpage = pdfCpy.GetImportedPage(pdfreader, j);
pdfCpy.AddPage(pdfimportpage);
}
else
{
//log.Debug("pdfCpy==null, j="+ j.ToString()+",");
}
}
pdfreader.Close();
//if(i>0 && i%100==0)
//{
// list_Pdf.Add(outputPdf);
// outputPdf= Application.StartupPath + "/temp/附件-" + FileBase +"-"+ list_Pdf .Count+ ".pdf";
// log.Info("开始合并到文件:"+ outputPdf);
// AppendText("开始合并到文件:" + outputPdf);
// //if (document.IsOpen())
// // document.Close();
//}
}
catch (Exception ex1)
{
MessageBox.Show(ex1.Message);
}
#endregion
}
运行效果:
源码下载: