1. 程式人生 > >iTextSharp.dll生成pdf 實戰例項

iTextSharp.dll生成pdf 實戰例項

http://blog.csdn.net/jiangyu912/article/details/4969376

最近忙了兩個星期的任務了     iTextSharp.dll是個開源的用於生成pdf的類庫了  專案中我們只需要引用就可以了    說實話確實很好用   因為自己的英文水平實在有限    所以沒去看API了   找資料上費了不少功夫    因為網上的資料大部分都只是介紹一些基礎的應用   所以很多地方還得靠自己慢慢來摸索了    現在將自己生成的pdf程式碼奉獻給大家   希望對有用到的朋友一些幫助   給的程式碼中有些屬性和方法不明白的需要大家自己去找資料參考了    程式碼裡面就不解釋了   

  程式碼量有一些   可能還不是很完善  畢竟自己的能力還是很有限   所以程式碼部分還有一些需要優化    不過生成是沒問題的   就當給大家參考吧   當然有高人提些意見還是很不錯的  

   先看圖片吧 我需要生成的pdf是什麼樣的:

 

[c-sharp:nogutter] view plaincopy
  1. using iTextSharp.text;  
  2. using iTextSharp.text.pdf;  
  3. using System.IO;  
  4. using System.Text;  
  5. using System.Xml;  
  6. privatestaticfloat bankai;
    //頁面寬度的一半
  7.         privatestaticfloat bangao;//頁面高度的一半
  8.         privatestaticfloat[] left = { 75, 1100 };  
  9.         privatestaticfloat[] rightwidth = { 500, 675 };  
  10.         privatestaticfloat[] imageWidth = { 600, 0 };  
  11.         privatestaticfloat[] imgWidth = { 0, 600 };  
  12.         privatestaticbool boo = true;//當目錄數大於10則進行分欄
  13.         privatestaticint column = 0;//0為左邊1為右邊
  14. publicvoid CreatePDF(DataTable dt,string imagePath,string pdfPath)//第一個引數是是生成pdf所需要的內容,第二個是生成pdf所需要的圖片路徑,第三個是生成pdf後存放的路徑
  15.         {  
  16.             int status = 1;  
  17.             //獲取圖片路徑
  18.             string lift = imagePath+ @"/lift.jpg";  
  19.             string right = imagePath+ @"/right.jpg";  
  20.             string top1 = imagePath + @"/top1.jpg";  
  21.             string top2 = imagePath + @"/top2.jpg";  
  22.             Document document = new Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);//定義pdf大小,設定上下左右邊距
  23.             Rectangle rect = new Rectangle(1190, 841);//設定整個版面的寬度和高度
  24.             document.SetPageSize(rect);  
  25.             bankai = document.PageSize.Width / 2;  
  26.             bangao = document.PageSize.Height / 2;  
  27.             PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath + DateTime.Now.ToString("yyyyMMddhhmmss") + ".pdf", FileMode.Create));//生成pdf路徑,建立檔案流
  28.             document.Open();  
  29.             PdfContentByte cb = writer.DirectContent;  
  30.             ColumnText ct = new ColumnText(cb);  
  31.             iTextSharp.text.Image img4 = iTextSharp.text.Image.GetInstance(top1);//定位背景圖片1
  32.             img4.ScalePercent(48);  
  33.             cb.AddImage(img4, bankai, 0, 0, img4.ScaledHeight, 0, 715);  
  34.             iTextSharp.text.Image img5 = iTextSharp.text.Image.GetInstance(top2);//定位背景圖片2
  35.             img5.ScalePercent(48);  
  36.             cb.AddImage(img5, img5.ScaledWidth, 0, 0, img5.ScaledHeight, 0, 683);  
  37.             Color c = new Color(int.Parse("6c423c", System.Globalization.NumberStyles.AllowHexSpecifier));//設定顏色
  38.             BaseFont bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//設定字型
  39.             cb.Stroke();  
  40.             cb.BeginText();  
  41.             cb.SetFontAndSize(bf, 20);  
  42.             cb.SetColorFill(c);  
  43.             cb.SetTextMatrix(140, 610);  
  44.             cb.ShowText("卷一");//定位卷一
  45.             cb.EndText();  
  46.             int pagenum = 0;  
  47.             bool boo = true;//當目錄數大於10則進行分欄
  48.             bool bo = true;  
  49.             int newpage = 0;  
  50.             int newpageHeight = 1;  
  51.             int Count = 0;  
  52.             int PageIndex = 2;  
  53.             bool pageBool = false;  
  54.             //對標題數目進行判斷  當目錄大於左欄的時候  定位於右欄   當標題大於右欄時新建一個頁面  依次迴圈
  55.             for (int i = 0; i < dt.Rows.Count; i++)//當目錄數目過大,對目錄進行分頁
  56.             {  
  57.                 if (i != 0)  
  58.                 {  
  59.                     if (i % 10 == 0)//每一欄為10個目錄
  60.                     {  
  61.                         if (bo == false)//當目錄大於一頁的時候新建一個頁面
  62.                         {  
  63.                             boo = true;  
  64.                             cb.Stroke();  
  65.                             document.NewPage();  
  66.                             newpage = -i;  
  67.                             newpageHeight = 70;  
  68.                             iTextSharp.text.Image imglift = iTextSharp.text.Image.GetInstance(lift);//定位左邊的圖片
  69.                             imglift.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;  
  70.                             cb.AddImage(imglift, 21, 0, 0, 842, 30, -22);  
  71.                         }  
  72.                         else
  73.                         {  
  74.                             boo = false;  
  75.                             newpage = -i;  
  76.                         }  
  77.                     }  
  78.                 }  
  79.                 bo = boo;  
  80.                 //因為不確定標題的長度為多少 所以不能固定死  而且因為pdf裡面對字型的長度有限制比如-和字元在裡面的顯示長度是不同的   所以根據長度來顯示肯定不行了 
  81.                 //因此只能判斷他們在pdf中的畫素來確定他們的長度  我的辦法是先獲得-的畫素 然後獲得標題的畫素  然後用總畫素減去標題的畫素和頁碼畫素度再除以-的畫素
  82.                 //就得到-的個數 然後再新增到標題和頁碼中就可以了
  83.                 string fuhao = "-";  
  84.                 float fuhaochangdu = bf.GetWidthPoint(fuhao, (float)12);//得到-的畫素
  85.                 float biaotichangdu;  
  86.                 if (dt.Rows[i]["Title"].ToString().Length > 26)//判斷目錄長度是否大於30
  87.                 {  
  88.                     string jiequTitle = dt.Rows[i]["Title"].ToString().Substring(0, 26) + "……";//大於30加......
  89.                     biaotichangdu = bf.GetWidthPoint(jiequTitle, (float)12);//獲得標題的畫素
  90.                     cb.Stroke();  
  91.                     cb.BeginText();  
  92.                     cb.SetFontAndSize(bf, 12);  
  93.                     cb.SetColorFill(c);  
  94.                     if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//對標題進行定位,標題位於左欄
  95.                     else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//當標題大於左欄的時候定位於右欄
  96.                     cb.ShowText(jiequTitle);  
  97.                     cb.EndText();  
  98.                 }  
  99.                 else//如果標題長度大於30則新增......
  100.                 {  
  101.                     biaotichangdu = bf.GetWidthPoint(dt.Rows[i]["Title"].ToString(), (float)12);  
  102.                     cb.Stroke();  
  103.                     cb.BeginText();  
  104.                     cb.SetFontAndSize(bf, 12);  
  105.                     cb.SetColorFill(c);  
  106.                     if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//對標題進行定位
  107.                     else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }  
  108.                     cb.ShowText(dt.Rows[i]["Title"].ToString());//給目錄新增標題
  109.                     string abc = dt.Rows[i]["Title"].ToString();  
  110.                     cb.EndText();  
  111.                 }  
  112.                 int changdu = (int)((bankai - 210 - biaotichangdu) / fuhaochangdu);//獲得-的個數
  113.                 StringBuilder sb = new StringBuilder();  
  114.                 for (int j = 0; j < changdu; j++)//判斷標題與索引之間所需要的-
  115.                 {  
  116.                     sb.Append(fuhao);//依次新增-
  117.                 }  
  118.                 cb.Stroke();  
  119.                 cb.BeginText();  
  120.                 cb.SetFontAndSize(bf, 12);  
  121.                 cb.SetColorFill(c);  
  122.                 if (!bo) { cb.SetTextMatrix(140 + biaotichangdu + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左欄定位-
  123.                 else { cb.SetTextMatrix(140 + biaotichangdu, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右欄定位-
  124.                 cb.ShowText(sb.ToString());//給目錄中間新增-
  125.                 cb.EndText();  
  126.                 int page = PDFPageNum(dt, i);//獲得內容的頁碼
  127.                 cb.Stroke();  
  128.                 cb.BeginText();  
  129.                 cb.SetFontAndSize(bf, 10);  
  130.                 cb.SetColorFill(c);  
  131.                 if (!bo) { cb.SetTextMatrix(bankai - 70 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左欄定位頁碼
  132.                 else { cb.SetTextMatrix(bankai - 70, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右欄定位頁碼
  133.                 cb.ShowText((PageIndex).ToString());//顯示頁碼
  134.                 cb.EndText();  
  135.                 if (page == 1) { pagenum = 0; PageIndex += 2; }//給目錄新增頁碼
  136.                 elseif (page == 2) { pagenum = 1; PageIndex += 3; }  
  137.                 else { pagenum = 1; PageIndex += page + 1; }//目錄的頁數
  138.                 Color color = new Color(int.Parse("9f9fa0", System.Globalization.NumberStyles.AllowHexSpecifier));  
  139.                 cb.Stroke();  
  140.                 cb.BeginText();  
  141.                 cb.SetFontAndSize(bf, 10);  
  142.                 cb.SetColorFill(color);  
  143.                 if (!bo) { cb.SetTextMatrix(140 + bankai, 510 + newpageHeight - ((i - 1 + newpage) * 50)); }  
  144.                 else { cb.SetTextMatrix(140, 505 + newpageHeight - ((i - 1 + newpage) * 50)); }  
  145.                 cb.ShowText(dt.Rows[i]["banmianming"].ToString());//給目錄新增版面名稱
  146.                 cb.EndText();  
  147.             }  
  148.             //因為我的pdf要求是先版面然後文章了   如果目錄在左邊的話版面就在右邊了  第二頁左邊就為文章  右邊又為版面   一次類推了  如果目錄佔到了右邊
  149.             //那麼第二頁左邊為版面右邊為文章了  
  150.             if (!boo)//判斷目錄是否生成新的頁面
  151.             {  
  152.                 column = 1;  
  153.                 pageBool = false;  
  154.             }  
  155.             else//沒有生成頁面則新增版面和頁碼
  156.             {  
  157.                 iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, 0, 0);  
  158.                 cb.Stroke();  
  159.                 cb.BeginText();  
  160.                 cb.SetFontAndSize(bf, 11);  
  161.                 cb.SetTextMatrix(1147, 45);  
  162.                 cb.ShowText("1");  
  163.                 cb.EndText();  
  164.             }  

    後面將對這個目錄進行補充   關於其中的int page = PDFPageNum(dt, i);//獲得內容的頁碼  方法所要做的是什麼

這篇介紹的是對前篇目錄的補充也就是int page = PDFPageNum(dt, i);//獲得內容的頁碼   這個方法裡面的內容     這是我做pdf後遇到的最後一個問題了   因為頁面內容是變化的   我不確定每篇文章到底有多大  所以肯定不能固定死了     當初問了公司裡面的高手   給的意見就是弄一個控制檯程式也就是exe程式     對每篇文章大小內容進行判斷然後返回一個頁碼    個人感覺這樣太麻煩了   估計效率上肯定也會有問題    想了很久之後想到了這個辦法    弄一個方法  將每篇文章按照自己生成的格式來生成    不過我生成在記憶體中   然後對其進行判斷   生成多頁就返回它的頁碼

  1. //按照自己需要生成pdf的格式生成   對其頁碼進行判斷  返回給目錄進行新增
  2.         privateint PDFPageNum(DataTable dt, int i)//獲得內容的頁碼
  3.         {  
  4.             int pageNum = 1;  
  5.             Document document = new Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);  
  6.             Rectangle rect = new Rectangle(1190, 841);  
  7.             document.SetPageSize(rect);  
  8.             bankai = document.PageSize.Width / 2;//獲得欄的寬度
  9.             bangao = document.PageSize.Height / 2;//獲得頁面的半高
  10.             PdfWriter writer = PdfWriter.GetInstance(document, new MemoryStream());//寫入記憶體(重點就在這了)
  11.             document.Open();  
  12.             PdfContentByte cb = writer.DirectContent;  
  13.             BaseFont bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//設定字型
  14.             ColumnText ct = new ColumnText(cb);  
  15.             if (dt.Rows[i]["IntroTitle"].ToString() != "")//在左欄寫入引題
  16.             {  
  17.                 ct.AddText(new Paragraph(dt.Rows[i]["IntroTitle"].ToString(), BaseFontAndSize(0, 17, "9f9fa0")));  
  18.                 ct.Indent = 20;  
  19.                 ct.SetSimpleColumn(50, 100, 560, 760, 16, Element.ALIGN_CENTER);  
  20.                 ct.Go();  
  21.             }  
  22.             ct.AddText(new Paragraph(dt.Rows[i]["Title"].ToString() + "/n", BaseFontAndSize(0, 22, "000000")));//在左欄寫入標題
  23.             ct.Indent = 20;  
  24.             ct.SetSimpleColumn(50, 100, 560, 720, 16, Element.ALIGN_CENTER);  
  25.             ct.Go();  
  26.             int subHeight = 0;  
  27.             if (dt.Rows[i]["SubTitle"].ToString() != "")  
  28.             {  
  29.                 int subCount = dt.Rows[i]["SubTitle"].ToString().Length / 80;//判斷字串的長度
  30.                 ct.AddText(new Paragraph(dt.Rows[i]["SubTitle"].ToString(), BaseFontAndSize(0, 15, "9f9fa0")));//在左欄寫入副題
  31.                 ct.SetSimpleColumn(50, 60, 590, 675, 16, Element.ALIGN_CENTER);  
  32.                 ct.Go();  
  33.                 subHeight = (subCount + 1) * 50;//加高
  34.             }  
  35.             ct.AddText(new Paragraph(dt.Rows[i]["Author"].ToString(), BaseFontAndSize(0, 10, "000000")));//在左欄寫入作者
  36.             ct.SetSimpleColumn(0, 60, 590, 690 - subHeight, 16, Element.ALIGN_CENTER);  
  37.             ct.Go();  
  38.             int imageHeight = 0;  
  39.             int imageTwo = 0;  
  40.             int column = 0;  
  41.             bool boolNewPage = false;  
  42.             bool banmian = false;  
  43.             int newspagenum = 0;  
  44.             //文章裡面可能會有多張圖片  需要對其進行判斷  如果圖片大於一頁則需要新建一頁進行新增
  45.             if (dt.Rows[i]["Image"].ToString() != "")//在左欄寫入正文圖片
  46.             {  
  47.                 string[] image = dt.Rows[i]["Image"].ToString().Split(',');//獲取多張圖片路徑
  48.                 for (int j = 0; j < image.Length - 1; j++)//迴圈取得每張圖片路徑
  49.                 {  
  50.                     iTextSharp.text.Image imgzhengwen = iTextSharp.text.Image.GetInstance(image[j]);//新增圖片
  51.                     if (imgzhengwen.Width > bankai || imgzhengwen.Height > 690 - subHeight)//如果圖片的寬和高大於欄的寬和高則對圖片進行縮略,我這固定死了   正確的話應該是按照圖片的實際高度進行縮略
  52.                     {  
  53.                         imgzhengwen.ScalePercent(60);  
  54.                     }  
  55.                     imageHeight = (int)imgzhengwen.ScaledHeight;//獲得圖片的實際高度,因為圖片可能被縮略了
  56.                     imgzhengwen.Alignment = iTextSharp.text.Image.ALIGN_CENTER;//圖片居中,應該沒什麼用  因為採用的是絕對定位肯定會居中了  
  57.                     if (banmian)//判斷文章是否產生多欄
  58.                     {  
  59.                         if (imageHeight + imageTwo > 720 - subHeight)//多張圖片  如果圖片大於右欄則新建一個頁面繼續新增
  60.                         {  
  61.                             //因為不確定文章的大小 column為0的時候定位在左欄   column為1的時候定位在右欄
  62.                             if (column == 0) { column = 1; }  
  63.                             else { column = 0; }//因為到了下一個頁面 所以需要改變column的值
  64.                             if (column == 0)//因為column值本來為1也就是在右欄 當高度大於右欄的時候就需要新建一個頁面繼續添加了
  65.                             {  
  66.                                 document.NewPage();  
  67.                                 newspagenum += 1;  
  68.                             }  
  69.                             //下面這個變數存放的是每個圖片的高度  因為圖片定位的話是按照左邊距和下邊距來定位的  所以必須知道圖片 標題以及副標題的高度
  70.                             imageTwo = 0;  
  71.                             cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight);  
  72.                             imageTwo += imageHeight - 20;//因為這是在一篇文章裡面 第二頁的時候不需要標題  為了介面美觀 所以高度應該往上
  73.                             banmian = false;  
  74.                         }  
  75.                         else//沒有大於右欄的情況處理
  76.                         {  
  77.                             cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight - subHeight - imageTwo);  
  78.                             imageTwo += imageHeight + 20;  
  79.                         }  
  80.                     }  
  81.                     //文章可能只有一頁也有可能有多頁   不過是否產生多欄 都從左欄開始  因為前面做了判斷如果產生多欄則新建一個頁面
  82.                     else
  83.                     {  
  84.                         if (imageHeight + imageTwo > 656 - subHeight)//判斷圖片是否大於左欄 如果大於則新增到右欄
  85.                         {  
  86.                             //當一篇文章新建一頁哦   將圖片高度清空  繼續新增
  87.                             if (banmian) { } else { imageTwo = 0; }  
  88.                             cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + 600, 720 - imgzhengwen.ScaledHeight - subHeight - imageTwo);  
  89.                             imageTwo += imageHeight + 20;  
  90.                             banmian = true;//讓下次新增到右欄
  91.                             column = 1;  
  92.                             newspagenum += 1;//將頁碼次數加一
  93.                         }  
  94.                         else//沒有大於左欄就新增
  95.                         {  
  96.                             cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10, 660 - imgzhengwen.ScaledHeight - subHeight - imageTwo);  
  97.                             imageTwo += imageHeight + 20;  
  98.                         }  
  99.                     }  
  100.                 }  
  101.             }  
  102.             string kongge = " ";  
  103.             float konggechangdu = bf.GetWidthPoint(kongge, (float)12);//得到-的寬度
  104.             float banmianchangdu = bf.GetWidthPoint(dt.Rows[i]["banmianming"].ToString(), (float)12);  
  105.             StringBuilder stringBuilder = new StringBuilder();  
  106.             for (int j = 0; j < (420 - banmianchangdu) / konggechangdu; j++)  
  107.             {  
  108.                 stringBuilder.Append(kongge);  
  109.             }  
  110.             ct.AddText(new Paragraph("/r" + dt.Rows[i]["Content"].ToString(), BaseFontAndSize(2, 11, "000000")));//在左欄寫入正文
  111.             ct.AddText(new Paragraph("/n/r" + stringBuilder + dt.Rows[i]["banmianming"].ToString(), BaseFontAndSize(0, 11, "6c423c")));//在左欄寫入版面名稱
  112.             int status = 0;  
  113.             int pagenum = 1;  
  114.             //對內容進行判斷  因為內容也會產生多欄或者多頁的情況
  115.             while ((status & ColumnText.NO_MORE_TEXT) == 0)//對內容進行判斷
  116.             {  
  117.                 if (column == 1)//如果文章在右欄則新建一個頁面繼續新增
  118.                 {  
  119.                     ct.SetSimpleColumn(rightwidth[column], 60, left[column], 720 - subHeight - imageTwo, 16, Element.ALIGN_JUSTIFIED);  
  120.                     status = ct.Go();//iTextSharp裡面的一個方法  如果產生分欄則返回2如果不分欄返回1
  121.                     document.NewPage();//新建一個頁面
  122.                     imageTwo = 0;//圖片高度清空
  123.                 }  
  124.                 else//文章在左欄繼續新增
  125.                 {  
  126.                     //因為內容是跟在正文圖片後面的  所以必須減去圖片的高度  不然文字會定位在圖片上
  127.                     ct.SetSimpleColumn(rightwidth[column], 60, left[column], 660 - subHeight - imageTwo, 16, Element.ALIGN_JUSTIFIED);  
  128.                     status = ct.Go();  
  129.                 }  
  130.                 if ((status & ColumnText.NO_MORE_COLUMN) != 0)//判斷是否產生第二欄
  131.                 {  
  132.                     column++;  
  133.                     pagenum++;  
  134.                     if (column > 1)//如果column大於1則將它賦值為0 因為已經到了右欄
  135.                     {  
  136.                         column = 0;  
  137.                     }  
  138.                     imageTwo = 0;  
  139.                 }  
  140.             }  
  141.             pageNum = pagenum + newspagenum;//頁碼數等於正文圖片產生的頁碼數加上內容產生的頁碼數 因為只有這兩個才會產生多個頁碼
  142.             return pageNum;//返回頁碼
  143.         } 

生成pdf的重點了    先看圖片吧    可能會出現的情況  :

     正常情況下文章和圖片的排列

  當文章內容大於左欄的時候 

  圖片在左   文章在右

   正文圖片大於左欄甚至是右欄的情況

   文字在左   圖片在右

   下面貼程式碼   程式碼有點多    可能某些部分還不夠優化:

  1. int pageNum = 0;//根據是否分欄新增頁數
  2.     int newspagenum = 0;  
  3.     for (int i = 0; i < dt.Rows.Count; i++)//將所有的內容和版面進行輸出
  4.     {  
  5.         document.NewPage();//新建一個頁面
  6.         status = 0;  
  7.         if (dt.Rows[i]["IntroTitle"].ToString() != "")//在左欄寫入引題
  8.         {  
  9.             ct.AddText(new Paragraph(dt.Rows[i]["IntroTitle"].ToString(), BaseFontAndSize(0, 17, "9f9fa0")));  
  10.             ct.Indent = 20;  
  11.             ct.SetSimpleColumn(left[column], 100, rightwidth[column], 760, 16, Element.ALIGN_CENTER);  
  12.             ct.Go();  
  13.         }  
  14.         ct.AddText(new Paragraph(dt.Rows[i]["Title"].ToString() + "/n", BaseFontAndSize(0, 22, "000000")));//在左欄寫入標題
  15.         ct.Indent = 20;  
  16.         ct.SetSimpleColumn(left[column], 100, rightwidth[column], 720, 16, Element.ALIGN_CENTER);  
  17.         ct.Go();  
  18.         int subHeight = 0;  
  19.         if (dt.Rows[i]["SubTitle"].ToString() != "")  
  20.         {  
  21.             int subCount = dt.Rows[i]["SubTitle"].ToString().Length / 80;//判斷字串的長度
  22.             ct.AddText(new Paragraph(dt.Rows[i]["SubTitle"].ToString(), BaseFontAndSize(0, 15, "9f9fa0")));//在左欄寫入副題
  23.             ct.SetSimpleColumn(left[column], 60, rightwidth[column], 675, 16, Element.ALIGN_CENTER);  
  24.             ct.Go();  
  25.             subHeight = (subCount + 1) * 50;//加高
  26.         }  
  27.         ct.AddText(new Paragraph(dt.Rows[i]["Author"].ToString(), BaseFontAndSize(0, 10, "000000")));//在左欄寫入作者
  28.         ct.SetSimpleColumn(left[column], 60, rightwidth[column], 690 - subHeight, 16, Element.ALIGN_CENTER);  
  29.         ct.Go();  
  30.         int imageHeight = 0;  
  31.         int imageTwo = 0;  
  32.         bool banmian = false;  
  33.         bool boolNewPage = false;  
  34.         if (dt.Rows[i]["Image"].ToString() != "")//在左欄寫入正文圖片
  35.         {  
  36.             string[] image = dt.Rows[i]["Image"].ToString().Split(',');  
  37.             for (int j = 0; j < image.Length - 1; j++)  
  38.             {  
  39.                 iTextSharp.text.Image imgzhengwen = iTextSharp.text.Image.GetInstance(image[j]);  
  40.                 if (imgzhengwen.Width > bankai || imgzhengwen.Height > 690 - subHeight)  
  41.                 {  
  42.                     imgzhengwen.ScalePercent(60);  
  43.                 }  
  44.                 imageHeight = (int)imgzhengwen.ScaledHeight;  
  45.                 imgzhengwen.Alignment = iTextSharp.text.Image.ALIGN_CENTER;  
  46.                 if (banmian)  
  47.                 {  
  48.                     if (imageHeight + imageTwo > 720 - subHeight)  
  49.                     {  
  50.                         if (column == 0) { column = 1; }  
  51.                         else { column = 0; }  
  52.                         if (column == 0)  
  53.                         {  
  54.                             NewPageNum(lift, cb, bf, pageNum, newspagenum, i);  
  55.                             document.NewPage();  
  56.                             newsPageNum += 2;  
  57.                             NewPageNum(lift, cb, bf, pageNum, newspagenum, i);  
  58.                         }  
  59.                         imageTwo = 0;  
  60.                         cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight);  
  61.                         imageTwo += imageHeight - 20;  
  62.                         banmian = false;  
  63.                         pageBool = true;  
  64.                     }  
  65.                     else
  66.                     {  
  67.                         cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight - subHeight - imageTwo);  
  68.                         imageTwo += imageHeight + 20;  
  69.                     }  
  70.                 }  
  71.                 else
  72.                 {  
  73.                     if (imageHeight + imageTwo > 656 - subHeight)  
  74.                     {  
  75.                         if (boolNewPage)  
  76.                         {  
  77.                             if (pageBool)  
  78.                             { NewPageNum(lift, cb, bf, pageNum, newspagenum, i); }  
  79.                             else { NewPageNum(lift, cb, bf, -1, newspagenum, i); }  
  80.                             document.NewPage();  
  81.                             if (i == 0)  
  82.                             { newsPageNum = 1; }  
  83.                             else { newsPageNum += 2; }  
  84.                             NewPageNum(lift, cb, bf, pageNum, newspagenum, i);  
  85.                         }  
  86.                         if (column == 0) { column = 1; }  
  87.                         else { column = 0; }  
  88.                         if (banmian) { } else { imageTwo = 0; }  
  89.                         cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight - subHeight - imageTwo);  
  90.                         banmian = true;  
  91.                         imageTwo = 0;  
  92.                         imageTwo += imageHeight + 20;  
  93.                     }  
  94.                     else
  95.                     {  
  96.                         if (boolNewPage) { }  
  97.                         else
  98.                         {  
  99.                             if (column == 1)  
  100.                             {  
  101.                                 boolNewPage = true;  
  102.                                 iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, column, i);//新增版面圖
  103.                             }  
  104.                         }  
  105.                         cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 660 - imgzhengwen.ScaledHeight - subHeight - imageTwo);  
  106.                         imageTwo += imageHeight + 20;  
  107.                     }  
  108.                 }  
  109.             }  
  110.         }  
  111.         string kongge = " ";  
  112.         float konggechangdu = bf.GetWidthPoint(kongge, (float)12);//得到-的寬度
  113.         float banmianchangdu = bf.GetWidthPoint(dt.Rows[i]["banmianming"].ToString(),(float)12);  
  114.         StringBuilder stringBuilder = new StringBuilder();  
  115.         for (int j = 0; j < (420-banmianchangdu)/konggechangdu; j++)  
  116.         {  
  117.             stringBuilder.Append(kongge);  <