class PDFHelper
{
/// <summary>
/// 读取合并的pdf文件名称
/// </summary>
/// <param name="Directorypath">目录</param>
/// <param name="outpath">导出的路径</param>
public static void MergePDF(string pdfpath, string outpath)
{
if (File.Exists(outpath))
{
File.Delete(outpath);
}
List<string> pdfFileLst = new List<string>();
DirectoryInfo dirInfo = new DirectoryInfo(pdfpath);
FileInfo[] fInfoArr = dirInfo.GetFiles("*.pdf");
BubbleSort(fInfoArr);
foreach (FileInfo fInfo in fInfoArr)
{
pdfFileLst.Add(pdfpath + "\\" + fInfo.Name);
}
MergePDFFilesToMultiple(pdfFileLst,outpath);
//MergePDFFilesToSingle(pdfFileLst, outpath);
//DeleteAllPdf(pdfpath);
}
/// <summary>
/// 冒泡排序
/// </summary>
/// <param name="arr">文件名数组</param>
private static void BubbleSort(FileInfo[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
for (int j = i; j < arr.Length; j++)
{
if (arr[i].LastWriteTime > arr[j].LastWriteTime)//按创建时间(升序)
{
FileInfo temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
/// <summary>
/// 合成pdf文件,多个PDF文件合并成一个PDF多页
/// </summary>
/// <param name="pdfFileLst">pdf文件名集合</param>
/// <param name="outMergeFile">合并后的输出路径</param>
public static void MergePDFFilesToMultiple(List<string> pdfFileLst, string outMergeFile)
{
PdfReader reader;
Rectangle rec = new Rectangle(1660, 1000);//尺寸单位磅,一磅等于0.3527毫米
Document document = new Document(rec);
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outMergeFile, FileMode.Create));
document.Open();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage newPage;
for (int i = 0; i < pdfFileLst.Count; i++)
{
reader = new PdfReader(pdfFileLst[i]);
int iPageNum = reader.NumberOfPages;
for (int j = 1; j <= iPageNum; j++)
{
document.SetPageSize(reader.GetPageSizeWithRotation(j));
document.NewPage();
newPage = writer.GetImportedPage(reader, j);
float pageHeight = reader.GetPageSizeWithRotation(j).Height;
float pageWidth = reader.GetPageSizeWithRotation(j).Width;
int rotation= reader.GetPageRotation(j);
switch (rotation)
{
case 0:
cb.AddTemplate(newPage, 1f, 0, 0, 1f, 0, 0);
break;
case 90:
cb.AddTemplate(newPage, 0, -1f, 1f, 0, 0, pageHeight);
break;
case 180:
cb.AddTemplate(newPage, -1f, 0, 0, -1f, pageWidth, pageHeight);
break;
case 270:
//cb.AddTemplate(newPage, 0, 1f, -1f, 0, pageHeight, 0);
cb.AddTemplate(newPage, 0, 1f, -1f, 0, pageWidth, 0);
break;
default:
throw new InvalidOperationException(string.Format("Unexpected page rotation: [{0}].", rotation));
}
//页码的样式
BaseFont bfHei = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font font = new Font(bfHei, 8);
//增加页码
Phrase header = new Phrase("第" + (writer.PageNumber) + "页", font);
//页脚显示的位置
ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, header,
document.PageSize.Width / 2, document.Bottom, 0);
}
}
document.Close();
}
/// <summary>
/// 合成pdf文件,多个PDF文件合并成一个PDF一页
/// </summary>
/// <param name="pdfFileLst">文件名list</param>
/// <param name="outMergeFile">输出路径</param>
public static void MergePDFFilesToSingle(List<string> pdfFileLst, string outMergeFile)
{
PdfReader reader;
//Rectangle rec1 = new Rectangle(1660, 1000);//尺寸单位磅,一磅等于0.3527毫米
Rectangle rec = GetPdfRectangle(pdfFileLst[1]);
Document document = new Document(rec.Rotate());
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outMergeFile, FileMode.Create));
document.Open();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage newPage;
for (int i = 0; i < pdfFileLst.Count; i++)
{
reader = new PdfReader(pdfFileLst[i]);
int iPageNum = reader.NumberOfPages;
for (int j = 1; j <= iPageNum; j++)
{
newPage = writer.GetImportedPage(reader, j);
cb.AddTemplate(newPage, 0, 0);
}
}
document.Close();
}
/// <summary>
/// 获取PDF范围
/// </summary>
/// <param name="pdfFile"></param>
/// <returns></returns>
public static Rectangle GetPdfRectangle(string pdfFile)
{
PdfReader reader = new PdfReader(pdfFile);
int pageNum = reader.NumberOfPages;
PdfDictionary pdfDict = reader.GetPageN(pageNum);
Rectangle rect = reader.GetPageSize(pageNum);
return rect;
}
/// <summary>
/// 删除一个文件里所有的文件
/// </summary>
/// <param name="pdfpath">文件夹路径</param>
public static void DeleteAllPdf(string pdfpath)
{
DirectoryInfo di = new DirectoryInfo(pdfpath);
if (di.Exists)
{
FileInfo[] fInfoArr = di.GetFiles("*.pdf");
foreach (FileInfo fInfo in fInfoArr)
{
File.Delete(pdfpath + "\\" + fInfo.Name);
}
}
}
/// <summary>
/// 合并PDF,并且增加页码
/// </summary>
/// <param name="documents">PDF文件集合</param>
/// <param name="outMergeFile">合并之后的PDF文件路径</param>
/// <param name="startPageNum">从哪一页开始增加页码</param>
public void Merge(List<PdfReader> documents, string outMergeFile, int startPageNum)
{
int rotation = 0;
Document newDocument = null;
try
{
//页码的样式
BaseFont bfHei = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font font = new Font(bfHei, 8);
//开始增加页码的页数
int num = 0;
newDocument = new Document();
PdfWriter pdfWriter = PdfWriter.GetInstance(newDocument, new FileStream(outMergeFile, FileMode.Create));
//pdfWriter.SetPageAction
newDocument.Open();
PdfContentByte pdfContentByte = pdfWriter.DirectContent;
foreach (PdfReader pdi in documents)
{
PdfReader pdfReader = pdi;
int iPageNum = pdfReader.NumberOfPages;
for (int j = 1; j <= iPageNum; j++)
{
num++;
newDocument.SetPageSize(pdfReader.GetPageSizeWithRotation(j));
newDocument.NewPage();
PdfImportedPage importedPage = pdfWriter.GetImportedPage(pdfReader, j);
rotation = pdfReader.GetPageRotation(j);
pdfContentByte.AddTemplate(importedPage, 0, 0);
if (num > startPageNum)
{
//增加页码
Phrase header = new Phrase("第" + (pdfWriter.PageNumber - startPageNum) + "页", font);
//页脚显示的位置
ColumnText.ShowTextAligned(pdfWriter.DirectContent, Element.ALIGN_CENTER, header,
newDocument.PageSize.Width / 2, newDocument.Bottom, 0);
}
}
}
}
finally
{
if (newDocument != null)
{
newDocument.Close();
}
}
}
}
C#引用第三方库iTextSharp.dll 合并PDF
最新推荐文章于 2025-04-15 12:02:49 发布