1. 程式人生 > >C# ITextSharp生成PDF

C# ITextSharp生成PDF

ITextSharp就不多介紹了,下面就把遇到的坑一一記錄下來,希望能夠幫助到正在使用它的開發者們。操作pdf的方法都被作者封裝好了,只是沒有註釋和說明,不過大部分的方法屬性還是能看懂的,看不懂的可以反編譯一下。

1.輸入文字不顯示中文,文字換行

2.文字加顏色、字型大小、加粗、斜體、居中等騷操作

3.表格行合併、表格列合併

4.新增新頁面

5.圖片等比縮放、頁面中心顯示

下面程式碼演示:

首先新增幾個dll

using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
private void SavePDF(HttpContext context)
        {
            Document document = new Document();
            //中文字型
            string chinese = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "KAIU.TTF");
            BaseFont baseFont = BaseFont.CreateFont(chinese, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            //文字大小12,文字樣式
            Font cn = new Font(baseFont, 12, Font.NORMAL);

            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(@"D:\temp.pdf", FileMode.Create));
            document.Open();
            //最後一個引數是顏色,這裡可以是rgb格式,也可以是預設定義的
            var title = new Paragraph("\n 這是一條標題0.0  hello ", new Font(baseFont, 14, Font.BOLD, BaseColor.RED));
            //居中
            title.Alignment = Element.ALIGN_CENTER;
            document.Add(title);

            Paragraph p = new Paragraph(" \n this is Second title \n ", cn);
            //Phrase p = new Phrase("這是一條標題0.0  hello", cn);
            p.Alignment = Element.ALIGN_CENTER;
            document.Add(p);

            //新增表格
            PdfPTable table = new PdfPTable(3);
            PdfPCell cell = new PdfPCell();

            table.AddCell("Row");
            cell = new PdfPCell(new Phrase("Cell"));
            cell.Colspan = 2;
            table.AddCell(cell);

            table.AddCell("row");
            cell = new PdfPCell(new Phrase("Cell"));
            cell.Colspan = 2;
            table.AddCell(cell);

            cell = new PdfPCell(new Phrase("Row"));
            cell.Rowspan = 2;
            table.AddCell(cell);
            table.AddCell("Cell");
            table.AddCell("Cell");
            table.AddCell("Cell");
            table.AddCell("Cell");

            table.HorizontalAlignment = Element.ALIGN_CENTER;
            document.Add(table);

            //新頁面
            document.NewPage();
            document.Add(new Paragraph("Second page pic", cn));
            Image img = Image.GetInstance("E:/VsTest/testWeb/testWeb/Files/ts20171204.002.jpeg");

            float percentage = 1;
            //這裡都是圖片最原始的寬度與高度  
            float resizedWidht = img.Width;
            float resizedHeight = img.Height;

            //這時判斷圖片寬度是否大於頁面寬度減去也邊距,如果是,那麼縮小,如果還大,繼續縮小,  
            //這樣這個縮小的百分比percentage會越來越小  
            while (resizedWidht > (document.PageSize.Width - document.LeftMargin - document.RightMargin) * 0.8)
            {
                percentage = percentage * 0.9f;
                resizedHeight = img.Height * percentage;
                resizedWidht = img.Width * percentage;
            }

            while (resizedHeight > (document.PageSize.Height - document.TopMargin - document.BottomMargin) * 0.8)
            {
                percentage = percentage * 0.9f;
                resizedHeight = img.Height * percentage;
                resizedWidht = img.Width * percentage;
            }

            //這裡用計算出來的百分比來縮小圖片  
            img.ScalePercent(percentage * 100);
            //圖片定位,頁面總寬283,高416;這裡設定0,0的話就是頁面的左下角 讓圖片的中心點與頁面的中心店進行重合  
            img.SetAbsolutePosition(document.PageSize.Width / 2 - resizedWidht / 2, document.PageSize.Height / 2 - resizedHeight / 2);
            writer.DirectContent.AddImage(img);

            document.Close();

        }

最後看看效果



下面是該dll裡面的字型和顏色集合

//public const int NORMAL = 0;
            //public const int BOLD = 1;
            //public const int ITALIC = 2;
            //public const int UNDERLINE = 4;
            //public const int STRIKETHRU = 8;
            //public const int BOLDITALIC = 3;
            //public const int UNDEFINED = -1;
            //public const int DEFAULTSIZE = 12;
            //public static readonly BaseColor WHITE;
            //public static readonly BaseColor BLUE;
            //public static readonly BaseColor CYAN;
            //public static readonly BaseColor MAGENTA;
            //public static readonly BaseColor GREEN;
            //public static readonly BaseColor ORANGE;
            //public static readonly BaseColor YELLOW;
            //public static readonly BaseColor RED;
            //public static readonly BaseColor BLACK;
            //public static readonly BaseColor DARK_GRAY;
            //public static readonly BaseColor GRAY;
            //public static readonly BaseColor LIGHT_GRAY;
            //public static readonly BaseColor PINK;

這裡說說表格裡面的PdfPTable,這個東西只能初始化他的列,表格裡面add的時候是從左到右一行一行裡面的單元格新增的,所以你新增的時候可以想象成輸出乘法表那樣。這裡合併行的方法就是Colspan,列就是Rowspan,但是這裡是屬性。。。int型別數字幾就是合併幾行或者幾列這樣。。。其實一開始我以為不管是行合併列合併都是合併,應該有一個cell.row.merge(2)什麼的,雖然不人性化但是習慣就好。

圖片image物件就有意思了,它有寬和長度屬性,但是長度是隻讀的,而且設定了寬度程式執行的時候會出錯,哈哈哈。。。。這就尷尬了,所以最後用image的ScalePercent方法。。