from:http://www.javashuo.com/article/p-ngayfobp-mo.htmlwindows
最近忙了兩個星期的任務了 iTextSharp.dll是個開源的用於生成pdf的類庫了 項目中咱們只須要引用就能夠了 說實話確實很好用 由於本身的英文水平實在有限 因此沒去看API了 找資料上費了很多功夫 由於網上的資料大部分都只是介紹一些基礎的應用 因此不少地方還得靠本身慢慢來摸索了 如今將本身生成的pdf代碼奉獻給你們 但願對有用到的朋友一些幫助 給的代碼中有些屬性和方法不明白的須要你們本身去找資料參考了 代碼裏面就不解釋了 字體
代碼量有一些 可能還不是很完善 畢竟本身的能力仍是頗有限 因此代碼部分還有一些須要優化 不過生成是沒問題的 就當給你們參考吧 固然有高人提些意見仍是很不錯的 優化
先看圖片吧 我須要生成的pdf是什麼樣的:ui
先看圖片吧 我須要生成的pdf是什麼樣的:spa
using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; using System.Text; using System.Xml; private static float bankai;//頁面寬度的一半 private static float bangao;//頁面高度的一半 private static float[] left = { 75, 1100 }; private static float[] rightwidth = { 500, 675 }; private static float[] imageWidth = { 600, 0 }; private static float[] imgWidth = { 0, 600 }; private static bool boo = true;//當目錄數大於10則進行分欄 private static int column = 0;//0爲左邊1爲右邊 public void CreatePDF(DataTable dt,string imagePath,string pdfPath)//第一個參數是是生成pdf所須要的內容,第二個是生成pdf所須要的圖片路徑,第三個是生成pdf後存放的路徑 { int status = 1; //獲取圖片路徑 string lift = imagePath+ @"/lift.jpg"; string right = imagePath+ @"/right.jpg"; string top1 = imagePath + @"/top1.jpg"; string top2 = imagePath + @"/top2.jpg"; Document document = new Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);//定義pdf大小,設置上下左右邊距 Rectangle rect = new Rectangle(1190, 841);//設置整個版面的寬度和高度 document.SetPageSize(rect); bankai = document.PageSize.Width / 2; bangao = document.PageSize.Height / 2; PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath + DateTime.Now.ToString("yyyyMMddhhmmss") + ".pdf", FileMode.Create));//生成pdf路徑,建立文件流 document.Open(); PdfContentByte cb = writer.DirectContent; ColumnText ct = new ColumnText(cb); iTextSharp.text.Image img4 = iTextSharp.text.Image.GetInstance(top1);//定位背景圖片1 img4.ScalePercent(48); cb.AddImage(img4, bankai, 0, 0, img4.ScaledHeight, 0, 715); iTextSharp.text.Image img5 = iTextSharp.text.Image.GetInstance(top2);//定位背景圖片2 img5.ScalePercent(48); cb.AddImage(img5, img5.ScaledWidth, 0, 0, img5.ScaledHeight, 0, 683); Color c = new Color(int.Parse("6c423c", System.Globalization.NumberStyles.AllowHexSpecifier));//設置顏色 BaseFont bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//設置字體 cb.Stroke(); cb.BeginText(); cb.SetFontAndSize(bf, 20); cb.SetColorFill(c); cb.SetTextMatrix(140, 610); cb.ShowText("卷一");//定位卷一 cb.EndText(); int pagenum = 0; bool boo = true;//當目錄數大於10則進行分欄 bool bo = true; int newpage = 0; int newpageHeight = 1; int Count = 0; int PageIndex = 2; bool pageBool = false; //對標題數目進行判斷 當目錄大於左欄的時候 定位於右欄 當標題大於右欄時新建一個頁面 依次循環 for (int i = 0; i < dt.Rows.Count; i++)//當目錄數目過大,對目錄進行分頁 { if (i != 0) { if (i % 10 == 0)//每一欄爲10個目錄 { if (bo == false)//當目錄大於一頁的時候新建一個頁面 { boo = true; cb.Stroke(); document.NewPage(); newpage = -i; newpageHeight = 70; iTextSharp.text.Image imglift = iTextSharp.text.Image.GetInstance(lift);//定位左邊的圖片 imglift.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE; cb.AddImage(imglift, 21, 0, 0, 842, 30, -22); } else { boo = false; newpage = -i; } } } bo = boo; //由於不肯定標題的長度爲多少 因此不能固定死 並且由於pdf裏面對字體的長度有限制好比-和字符在裏面的顯示長度是不一樣的 因此根據長度來顯示確定不行了 //所以只能判斷他們在pdf中的像素來肯定他們的長度 個人辦法是先得到-的像素 而後得到標題的像素 而後用總像素減去標題的像素和頁碼像素度再除以-的像素 //就獲得-的個數 而後再添加到標題和頁碼中就能夠了 string fuhao = "-"; float fuhaochangdu = bf.GetWidthPoint(fuhao, (float)12);//獲得-的像素 float biaotichangdu; if (dt.Rows[i]["Title"].ToString().Length > 26)//判斷目錄長度是否大於30 { string jiequTitle = dt.Rows[i]["Title"].ToString().Substring(0, 26) + "……";//大於30加...... biaotichangdu = bf.GetWidthPoint(jiequTitle, (float)12);//得到標題的像素 cb.Stroke(); cb.BeginText(); cb.SetFontAndSize(bf, 12); cb.SetColorFill(c); if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//對標題進行定位,標題位於左欄 else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//當標題大於左欄的時候定位於右欄 cb.ShowText(jiequTitle); cb.EndText(); } else//若是標題長度大於30則添加...... { biaotichangdu = bf.GetWidthPoint(dt.Rows[i]["Title"].ToString(), (float)12); cb.Stroke(); cb.BeginText(); cb.SetFontAndSize(bf, 12); cb.SetColorFill(c); if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//對標題進行定位 else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); } cb.ShowText(dt.Rows[i]["Title"].ToString());//給目錄添加標題 string abc = dt.Rows[i]["Title"].ToString(); cb.EndText(); } int changdu = (int)((bankai - 210 - biaotichangdu) / fuhaochangdu);//得到-的個數 StringBuilder sb = new StringBuilder(); for (int j = 0; j < changdu; j++)//判斷標題與索引之間所須要的- { sb.Append(fuhao);//依次添加- } cb.Stroke(); cb.BeginText(); cb.SetFontAndSize(bf, 12); cb.SetColorFill(c); if (!bo) { cb.SetTextMatrix(140 + biaotichangdu + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左欄定位- else { cb.SetTextMatrix(140 + biaotichangdu, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右欄定位- cb.ShowText(sb.ToString());//給目錄中間添加- cb.EndText(); int page = PDFPageNum(dt, i);//得到內容的頁碼 cb.Stroke(); cb.BeginText(); cb.SetFontAndSize(bf, 10); cb.SetColorFill(c); if (!bo) { cb.SetTextMatrix(bankai - 70 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左欄定位頁碼 else { cb.SetTextMatrix(bankai - 70, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右欄定位頁碼 cb.ShowText((PageIndex).ToString());//顯示頁碼 cb.EndText(); if (page == 1) { pagenum = 0; PageIndex += 2; }//給目錄添加頁碼 else if (page == 2) { pagenum = 1; PageIndex += 3; } else { pagenum = 1; PageIndex += page + 1; }//目錄的頁數 Color color = new Color(int.Parse("9f9fa0", System.Globalization.NumberStyles.AllowHexSpecifier)); cb.Stroke(); cb.BeginText(); cb.SetFontAndSize(bf, 10); cb.SetColorFill(color); if (!bo) { cb.SetTextMatrix(140 + bankai, 510 + newpageHeight - ((i - 1 + newpage) * 50)); } else { cb.SetTextMatrix(140, 505 + newpageHeight - ((i - 1 + newpage) * 50)); } cb.ShowText(dt.Rows[i]["banmianming"].ToString());//給目錄添加版面名稱 cb.EndText(); } //由於個人pdf要求是先版面而後文章了 若是目錄在左邊的話版面就在右邊了 第二頁左邊就爲文章 右邊又爲版面 一次類推了 若是目錄佔到了右邊 //那麼第二頁左邊爲版面右邊爲文章了 if (!boo)//判斷目錄是否生成新的頁面 { column = 1; pageBool = false; } else//沒有生成頁面則添加版面和頁碼 { iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, 0, 0); cb.Stroke(); cb.BeginText(); cb.SetFontAndSize(bf, 11); cb.SetTextMatrix(1147, 45); cb.ShowText("1"); cb.EndText(); }
後面將對這個目錄進行補充 關於其中的int page = PDFPageNum(dt, i);//得到內容的頁碼 方法所要作的是什麼
.net