C#使用iTextSharp操作PDF文件


由於最近項目中要生成比較復雜的PDF文件,所以對於iTextSharp組建研究了一下,最終成功實現了想要的效果,發現這個組件功能非常強大,剛開始不熟悉該組件的代碼所以遇到很多問題(基本都是內容格式上的問題),借由這篇博客記錄一下。

1.首先下載該組件並添加引用,這里是使用VS自帶的NuGet來進行安裝的,鍵項目選擇管理NuGet程序包,搜索iTextSharp選擇合適版本安裝即可,安裝完成會自動添加引用。

2.在使用的文件里面引入命名空間

using iTextSharp.text;
using iTextSharp.text.pdf;

3.簡單的生成PDF文件,其中Fname為生成文件存放的路徑。

簡單說一下:

Rectangle對象是用來設置PDF頁面尺寸的。

Document對象為頁面對象,就像是HTML里面的頁面對象一樣,用於操作頁面內容和格式。

PdfWriter對象是用於將Document對象寫入PDF文件。

Rectangle pageSize = new Rectangle(1000, 500);
Document document = new Document(pageSize, 10, 10, 120, 80);
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(Fname, FileMode.Create));
document.Open();
document.Add(new iTextSharp.text.Paragraph("Hello World! Hello People! " +
            "Hello Sky! Hello Sun! Hello Moon! Hello Stars!"));
document.Close();
writer.Close();

4.設置PDF文檔信息,利用Document對象。

document.AddTitle("這里是標題");
document.AddSubject("主題");
document.AddKeywords("關鍵字");
document.AddCreator("創建者");
document.AddAuthor("作者");

5.向PDF里面添加圖片,Fimg為圖片路徑,創建一個iTextSharp.text.Image對象,將該對象添加到文檔里面,SetAbsolutePosition方法是設置圖片出現的位置。

string imgurl = @System.Web.HttpContext.Current.Server.MapPath(Fimg);
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(imgurl);
img.SetAbsolutePosition(0, 0);
writer.DirectContent.AddImage(img);

6.向PDF里面添加表格,表格對象為PdfTable對象,該類的構造函數可以設置表格的列數,new float[] { 180, 140, 140, 160, 180, 140, 194 }里面是每列的寬度,也可在構造函數里面直接寫列數如:new PdfPTable(3);

接下來需要造單元格扔到表格里面,單元格為PdfPCell對象,構造函數里面可以寫入單元格要顯示的文本信息,其中fontb為字體,如果是顯示中文必須創建中文字體:

BaseFont bsFont = BaseFont.CreateFont(@System.Web.HttpContext.Current.Server.MapPath("./upload/fonts/MSYH.TTC") + ",0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font fontb = new Font(bsFont, Tab_Content_FontSize, Font.BOLD, new BaseColor(0xFF, 0xFF, 0xFF));

單元格創建出來扔到表格中排列方式類似與HTML里面的流式布局,沒有行一說,所以造的單元格數量和列數相掛鈎才能顯示正確。

單元格格式可以進行設置:

HorizontalAlignment:代表單元格內文本的對齊方式

PaddingBottom和PaddingTop:為單元格內間距(下,上)

BorderColor:邊框顏色

SetLeading():該方法設置單元格內多行文本的行間距

PdfPTable tablerow1 = new PdfPTable(new float[] { 180, 140, 140, 160, 180, 140, 194 });
tablerow1.TotalWidth = 1000; //表格寬度
tablerow1.LockedWidth = true;

//造單元格
PdfPCell cell11 = new PdfPCell(new Paragraph("單元格內容", fontb));
cell11.HorizontalAlignment = 1;
cell11.PaddingBottom = 10;
cell11.PaddingTop = 10;
cell11.BorderColor = borderColor;
cell11.SetLeading(1.2f, 1.2f);
tablerow1.AddCell(cell11);//將單元格添加到表格中
           
document.Add(tablerow1);//將表格添加到pdf文檔中

7.將文本放到頁面指定位置PdfContentByte獲取寫入的文件流,將文本放到指定位置,位置為x和y坐標,其中y坐標是從下面往上走的。

PdfContentByte cb = writer.DirectContent;
Phrase txt = new Phrase("測試文本", fontb);
ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT, txt,
                   425, 460, 0);

8.創建新的頁面,如果想要創建出新一頁的話需要使用代碼:

document.NewPage();

如果創建的新頁面需要重新開始計算頁數的話,在創建新頁面之前:

document.ResetPageCount();

9.添加頁眉頁腳及水印,頁腳需要顯示頁數,如果正常添加很簡單,但需求里面要求有背景色,有水印,而且背景色在最底層,水印在上層,文字表格等在最上層,處理這個需求是整個iTextSharp最難的地方。

先分析一下,如果在創建Rectangle對象的時候添加背景色,那么接下來加水印有兩種可選情況:

1.水印加在內容下面,可選,但水印會加到背景色的下面導致水印不顯示。

2.水印加在內容上面,不可選,水印會覆蓋最上層的文字,實現的效果不好。

為了解決這個問題,找到了iTextSharp提供的一個接口IPdfPageEvent及PdfPageEventHelper,該接口里面有一個方法可以實現,該方法為:OnEndPage當頁面創建完成時觸發執行。

那么就利用這個方法來實現:先添加背景色,再添加水印,添加在內容下方即可。

實現該方法需要一個類來實現接口:

writer.PageNumber.ToString()為頁碼。

public class IsHandF : PdfPageEventHelper, IPdfPageEvent
{
        /// <summary>
        /// 創建頁面完成時發生  
        /// </summary>
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            base.OnEndPage(writer, document);

            //頁眉頁腳使用字體
            BaseFont bsFont = BaseFont.CreateFont(@System.Web.HttpContext.Current.Server.MapPath("./upload/fonts/MSYH.TTC") + ",0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            iTextSharp.text.Font fontheader = new iTextSharp.text.Font(bsFont, 30, iTextSharp.text.Font.BOLD);
            iTextSharp.text.Font fontfooter = new iTextSharp.text.Font(bsFont, 20, iTextSharp.text.Font.BOLD);
            //水印文件地址
            string syurl = "./upload/images/sys/black.png";
              
            //獲取文件流
            PdfContentByte cbs = writer.DirectContent;
cbs.SetCharacterSpacing(1.3f); //設置文字顯示時的字間距 Phrase header = new Phrase("頁眉", fontheader); Phrase footer = new Phrase(writer.PageNumber.ToString(), fontfooter); //頁眉顯示的位置 ColumnText.ShowTextAligned(cbs, Element.ALIGN_CENTER, header, document.Right / 2, document.Top + 40, 0); //頁腳顯示的位置 ColumnText.ShowTextAligned(cbs, Element.ALIGN_CENTER, footer, document.Right / 2, document.Bottom - 40, 0); //添加背景色及水印,在內容下方添加 PdfContentByte cba = writer.DirectContentUnder; //背景色 Bitmap bmp = new Bitmap(1263, 893); Graphics g = Graphics.FromImage(bmp); Color c = Color.FromArgb(0x33ff33); SolidBrush b = new SolidBrush(c);//這里修改顏色 g.FillRectangle(b, 0, 0, 1263, 893); System.Drawing.Image ig = bmp; iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(ig, new BaseColor(0xFF, 0xFF, 0xFF)); img.SetAbsolutePosition(0, 0); cba.AddImage(img); //水印 iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(@System.Web.HttpContext.Current.Server.MapPath(syurl)); image.RotationDegrees = 30;//旋轉角度 PdfGState gs = new PdfGState(); gs.FillOpacity = 0.1f;//透明度 cba.SetGState(gs); int x = -1000; for (int j = 0; j < 15; j++) { x = x + 180; int a = x; int y = -170; for (int i = 0; i < 10; i++) { a = a + 180; y = y + 180; image.SetAbsolutePosition(a, y); cba.AddImage(image); } } } }

該類創建完成后,在需要添加頁眉頁腳水印的頁面代碼位置添加如下代碼,整個文檔生成過程中添加一次即可,確保該事件可以觸發,添加該代碼后在剩余的頁面都會觸發生成頁眉頁腳:

writer.PageEvent = new IsHandF();

 

以上即為該組件的基本用法,利用該組件可以對PDF文件進行各種各樣的操作,當然還有加密PDF文件等比較簡單本文就不做詳細說明了。

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM