原文链接:https://www.cnblogs.com/yongsterZeroZeroOne/p/13738635.html
原文链接:https://www.cnblogs.com/AspDotNetMVC/p/3812157.html
一、合并pdf并添加页码
完整场景是这样:
1- 我把所有的PDF子文件存放的某个目录下
2-从数据库按条件查询出来的每个实体都带有一个字段,对应的是子pdf存放的位置pdf文件的名称,设为pdfName
3-需要把按条件查询出来的所有子pdf文件合并成一个大的pdf文件
4-合并的大的pdf文件,需要按要求加上页码
/// <summary>
/// 合并PDF并且产生页码
/// </summary>
/// <param name="data"></param>
void MergePDFFilesWithPageNumber(List<实体类> data)
{
string OrderNO = Request.QueryString["OrderNO"];
//最后合成的PDF文件要存放的文件目录
string reportPath = Server.MapPath("~/upload/Report/");
//最后合成的PDF文件的文件名
string reportName = "XXXXXX_Report.pdf";
//最后合并的PDF的完整地址
string mergePDFFiles = reportPath + reportName;
//如果目录不存在,创建目录
if (!Directory.Exists(reportPath))
{
Directory.CreateDirectory(reportPath);
}
//如果文件已存在,把原来的删除
if (File.Exists(reportPath + reportName))
{
File.Delete(reportPath + reportName);
}
//这是子pfd文件存放的文件目录地址(所有子pdf文件都存放在这个目录下)
string filePdfPath = Server.MapPath("~/upload/TemplateFile/PDF/" + OrderNO.Replace("*", "-"));
#region 使用iTextSharp合并PDF
//在总PDF的存放位置创建一个新的PDF
iTextSharp.text.Document DOC = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4.Rotate());
PdfWriter writer = PdfWriter.GetInstance(DOC, new FileStream(mergePDFFiles, FileMode.Create));
DOC.Open();
iTextSharp.text.Rectangle re;
PdfContentByte cb = writer.DirectContent;
PdfImportedPage newPage; //页码的字体,大小样式
BaseFont bfHei = BaseFont.CreateFont(@"C:\Windows\Fonts\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font font = new Font(bfHei, 10);
for (int i = 0; i < data.Count; i++)
{
//读取每个子PDF文件
PdfReader reader = new PdfReader(filePdfPath + "/" + data[i].pdfName);
//单个子PDF文件的页数
int iPageNum = reader.NumberOfPages;
//将每个子pdf的每一页插入到新创建的总PDF文件里,根据需要增加页面
for (int j = 1; j <= iPageNum; j++)
{
re = reader.GetPageSize(reader.GetPageN(j));
DOC.SetPageSize(re);
DOC.NewPage();
newPage = writer.GetImportedPage(reader, j);
cb.AddTemplate(newPage, 0, 0);
//增加页码-封面和底页都加
//Phrase header = new Phrase("第" + writer.PageNumber.ToString() + "页", font);
//页脚显示的位置
//ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, header, DOC.PageSize.Width / 2, DOC.Bottom, 0);
//增加页码-封面和底页不加
//if (writer.PageNumber != 1 && !(i == data.Count - 1 && j == iPageNum))
//{
// Phrase header = new Phrase("第" + (writer.PageNumber - 1).ToString() + "页", font);
// //页脚显示的位置
// ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, header, DOC.PageSize.Width / 2, DOC.Bottom, 0);
//}
//增加页码-封面不加,没有底页,封面只占一页
if (writer.PageNumber != 1)
{
Phrase header = new Phrase("第" + (writer.PageNumber - 1).ToString() + "页", font);
//页脚显示的位置
ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, header, DOC.PageSize.Width / 2, DOC.Bottom, 0);
}
}
}
DOC.Close();}
二、添加页码
static void SetAllHeaderFooter(string inputPath)
{
PdfReader reader=new PdfReader(inputPath);
PdfStamper stamp=new PdfStamper(reader , new FileStream(Guid.NewGuid().ToString("N")+".pdf" , FileMode.Create));
for(int i=1 ; i<=reader.NumberOfPages ; i++)
{
AddHeaderFooter(stamp , i , reader.NumberOfPages);
}
stamp.Close();
reader.Close();
}
static void AddHeaderFooter(PdfStamper stamp,int pageNum,int pageCount)
{
PdfContentByte cb =stamp.GetOverContent(pageNum);
Color green=new Color(0 , 131 , 34);
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA , BaseFont.CP1252 , BaseFont.NOT_EMBEDDED);
var header=new Rectangle(50 , 795 , 570 , 815);
header.BackgroundColor=green;
header.BorderColor=green;
cb.Rectangle(header);
cb.Stroke();
var footer=new Rectangle(50 , 35 , 570 , 55);
footer.BackgroundColor=green;
footer.BorderColor=green;
cb.Rectangle(footer);
cb.Stroke();
cb.SetRGBColorFill(255 , 255 , 255);
cb.BeginText();
cb.SetFontAndSize(bf , 12);
cb.SetTextMatrix(70 , 800);
cb.ShowText("U als ondernemer");
cb.SetTextMatrix(550-bf.GetWidthPoint("Resultaten" , 12) , 800);
cb.ShowText("Resultaten");
cb.EndText();
String pageText =string.Format("Page {0} of {1}",pageNum,pageCount);
float pageLen = bf.GetWidthPoint(pageText , 12);
cb.BeginText();
cb.SetFontAndSize(bf , 12);
cb.SetTextMatrix(280 , 40);
cb.ShowText(pageText);
cb.EndText();
cb.ResetRGBColorFill();
}