PDF生成類庫

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

相關文章
相關標籤/搜索