我的需求是:把文件夹的的PDF合成一个PDF文件,然后保存到指定文件,然后再根据这个指定文件(已存在的PDF文件),添加页码,添加水印
- 效果图
- 引用ITextSharp
- Main函数调用PDFControler方法的测试案例
- 创建一个操作PDF的类,类名:PDFControler
- 创建一个参数对象类,类名:PDFObj
class Program
{
static void Main(string[] args)
{
//PDFControler类测试,首先你需要在E盘创建一个PDF文件夹,然后PDF文件夹里面存在PDF文件
PDFController pDFControler = new PDFController();
PDFObj myPDFObj = new PDFObj();
myPDFObj.FooterFontSize = 15;
//PDF合并,并添加页码
pDFControler.PDFMergeAddPageNumbers(@"E:\PDF", @"C: \Users\Administrator\Desktop\CUIText.pdf", myPDFObj);
}
}
using System;
using System.IO;
using System.Linq;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.Collections.Generic;
public class PDFController
{
public PDFController() {
}
/// <summary>
/// 合并多个PDF文件并添加页码
/// </summary>
/// <param name="directoryPath">需要合并的PDF文件夹</param>
/// <param name="outMergeFile">合并PDF文件之后保存的路径</param>
public void PDFMergeAddPageNumbers(string directoryPath, string outMergeFile)
{
PDFMergeAddPageNumbers(directoryPath, outMergeFile, new PDFObj());
}
/// <summary>
/// 合并多个PDF文件并添加页码
/// </summary>
/// <param name="directoryPath">需要合并的PDF文件夹</param>
/// <param name="outMergeFile">合并PDF文件之后保存的路径</param>
/// <param name="pdfObj">PDFObj对象</param>
public void PDFMergeAddPageNumbers(string directoryPath, string outMergeFile, PDFObj pdfObj)
{
try
{
PDFMergeFiles(directoryPath, outMergeFile, pdfObj);
PDFSetPageNumber(outMergeFile, pdfObj);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 合并多个PDF文件为一个PDF文件
/// </summary>
/// <param name="directoryPath">需要合并的PDF文件夹</param>
/// <param name="outMergeFile">合并PDF文件之后保存的路径</param>
public void PDFMergeFiles(string directoryPath, string outMergeFile)
{
PDFMergeFiles(directoryPath, outMergeFile, new PDFObj());
}
/// <summary>
/// 合并多个PDF文件为一个PDF文件
/// </summary>
/// <param name="directoryPath">需要合并的PDF文件夹</param>
/// <param name="outMergeFile">合并PDF文件之后保存的路径</param>
/// <param name="pdfObj">PDFObj对象</param>
public void PDFMergeFiles(string directoryPath, string outMergeFile, PDFObj pdfObj)
{
try
{
List<string> fileList = new List<string>();
DirectoryInfo PDFDirectoryPath = new DirectoryInfo(directoryPath);//获取PDF的文件夹
FileInfo[] filePattern = PDFDirectoryPath.GetFiles("*.pdf");//获取文件夹里面的PDF类型的文件
BubbleSort(filePattern);//按照时间排序,合并PDF
foreach (FileInfo temp in filePattern)//把已经按照时间分类的PDF文件,获取文件地址放到list集合里面
{
fileList.Add(directoryPath + "\\" + temp.Name);
}
MergePDFFiles(fileList, directoryPath, outMergeFile, pdfObj);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 合并多个PDF文件为一个PDF文件
/// </summary>
/// <param name="fileList">需要合并的PDF集合</param>
/// <param name="directoryPath">需要合并的PDF路径</param>
/// <param name="outMergeFile">合并PDF之后保存的路径</param>
/// <param name="pdfObj">PDFObj对象</param>
private void MergePDFFiles(List<string> fileList,string directoryPath, string outMergeFile, PDFObj pdfObj)
{
PdfReader reader = null;
List<PdfReader> readers = new List<PdfReader>();
FileStream fileStream = new FileStream(outMergeFile, FileMode.Create);
Document document=new Document(PageSize.A4);
try
{
Rectangle pdfSize = PageSize.A4;
if (pdfObj.PdfWidth != 0 && pdfObj.PdfHeight != 0)
{
pdfSize = new Rectangle(pdfObj.PdfWidth, pdfObj.PdfHeight);
}
else
{
if (pdfObj.pdfPagetype == PDFObj.PdfPageType.Default)
{
Rectangle size = GetExistPDFFilePageSize(directoryPath);
pdfSize = new Rectangle(size.Width, size.Height);
}
else
{
Rectangle size = GetPageSize(pdfObj);
pdfSize = new Rectangle(size.Width, size.Height);
}
}
document = new Document(pdfSize);
PdfWriter writer = PdfWriter.GetInstance(document, fileStream);//获取实例,该实例指定高宽的PDF,并创建了写入PDF的方法,已获取PDF的路径,然后新建写入文本
document.Open();//实例化指定高宽的PDF页,然后打开
PdfContentByte cb = writer.DirectContent;//对指定PDF文件(合并所有PDF的文件)写入内容
PdfImportedPage newPage;
for (int i = 0; i < fileList.Count; i++)//循环PDF集合
{
reader = new PdfReader(fileList[i]);//获取单个PDF文件比如文件310.pdf
int iPageNum = reader.NumberOfPages;//获取PDF的页数
for (int j = 1; j <= iPageNum; j++)//循环获取单个PDF的具体页
{
document.NewPage();//添加PDF具体页
newPage = writer.GetImportedPage(reader, j);//获取是哪个的那页
cb.AddTemplate(newPage, pdfObj.PdfXMargin, pdfObj.PdfYMargin);//往文件中添加PDF页,X Y值,是页边距,控制PDF表格的位置
}
readers.Add(reader);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
document.Close();
fileStream.Close();
for (int i = 0; i < readers.Count; i++)
readers[i].Close();
}
}
/// <summary>
/// PDF文件添加页码的方法
/// </summary>
/// <param name="outMergeFile">PDF添加页码之后保存的路径</param>
public void PDFSetPageNumber(string outMergeFile)
{
PDFSetPageNumber(outMergeFile, new PDFObj());
}
/// <summary>
/// PDF文件添加页码的方法
/// </summary>
/// <param name="outMergeFile">PDF添加页码之后保存的路径</param>
/// <param name="pdfObj">PDFObj对象</param>
public void PDFSetPageNumber(string outMergeFile, PDFObj pdfObj)
{
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
string tempPath = Path.GetDirectoryName(outMergeFile) + "\\" + Path.GetFileNameWithoutExtension(outMergeFile) + "_temp.pdf";
try
{
BaseColor baseColor = GetPageNumberColor(pdfObj);
pdfReader = new PdfReader(outMergeFile);
pdfStamper = new PdfStamper(pdfReader, new FileStream(tempPath, FileMode.Create