[itextsharp][003]新增段落文字到pdf(Chunk,Phrase,Paragraph類別)

新增段落文字到pdf(Phrase,Paragraph類別) , itextsharp

在pdf裡面要新增文字的話,大致上就是要使用三種類別:chunk, phrase, paragraph

以唸書時寫作文的角度來看的話:

一個段落就代表一個paragraph,一句話就代表一個phrase,名詞形容詞動詞片語就代表chunk

以下介紹三種基本的方式加入文字到pdf:

1.簡單3句話:利用phrase類別製作兩句話,可用\n斷行,再加入到paragraph變成一個段落

2.一句話有各種字型變化以及字型大小:可利用chunk類別製作名詞動詞,加入到phrase變成一句話,最後加入到paragraph變成一個段落

3.將整個段落置中置左置右,以及設定行距(每行之間的距離)

4.設定段落左右上下留白的空間以及首行的縮排

開始介紹之前,先簡單介紹文件大小以及中文字體設定,文件大小是A7,字體則是設定為windows內建的中易黑體:

//設定一個長度寬度很小的文件
Document doc = new Document(PageSize.A7);
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("ChunkPhraseParagraph.pdf", FileMode.Create));            
doc.Open();

//設定中文字體
string chFontPath = "c:\\windows\\fonts\\simhei.ttf";//windows內建的SimHei字體(中易黑體)                            
BaseFont chBaseFont = BaseFont.CreateFont(chFontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font chFont = new iTextSharp.text.Font(chBaseFont,12);

然後介紹第一種:簡單3句話:利用phrase類別製作兩句話,可用\n斷行,再加入到paragraph變成一個段落:

首先利用Phrase類別新增簡單的幾句話,例如:

Phrase simplePhr1 = new Phrase("簡單3句話,這是第1句。。。", chFont);
Phrase simplePhr2 = new Phrase("簡單3句話,這是第2句。。。", chFont);
Phrase simplePhr3 = new Phrase("簡單3句話,這是第3句,此句前面有手動加上斷行,此句後面就是Paragraph的結尾,一定會有斷行!", chFont);

再利用Paragraph類別新增一個段落,並且把剛才幾句話加入進去,想要斷行的話可利用\n:

Paragraph simplePara = new Paragraph();
simplePara.Add(simplePhr1);
simplePara.Add(simplePhr2);
simplePara.Add("\n");
simplePara.Add(simplePhr3);
//pdf文件加入簡單3句話
doc.Add(simplePara);

然後pdf內容就會產生如下:

然後介紹第二種:一句話有各種字型變化以及字型大小:可利用chunk類別製作名詞動詞,加入到phrase變成一句話,最後加入到paragraph變成一個段落:

先利用Chunk類別製作出不同字體、字型大小、還有加上底線的片語:

Chunk simpleChunk = new Chunk("一般的文字+", chFont);
Chunk underLineChunk = new Chunk("加底線的文字+", chFont) ;
//style =1:粗體
Chunk boldChunk = new Chunk("粗體的文字", new iTextSharp.text.Font(chBaseFont,12,1));
underLineChunk.SetUnderline(0.2f, -2f);

然後把他加入phrase中,變成一句話:

Phrase complicatedPhrase = new Phrase();
complicatedPhrase.Add(simpleChunk);
complicatedPhrase.Add(underLineChunk);
complicatedPhrase.Add(boldChunk);

最後再加入到一個Paragraph物件中變成一個段落:

Paragraph complicatedPara = new Paragraph();
complicatedPara.Add(complicatedPhrase);
//pdf文件加入複雜的一句話
doc.Add(complicatedPara);

執行結果:

然後介紹第三種:將整個段落置中置左置右,以及設定行距(每行之間的距離):

透過Paragra.Alignment即可設定段落至左置中置右,透過Paragraph.Leading屬性即可設定每行之間的距離

//將整個段落置中置左置右並設定行高
Phrase alignAndLeadingPhrase = new Phrase("簡單置中的文字",chFont);
Phrase alignAndLeadingPhrase1 = new Phrase("簡單置中的文字第二行", chFont);
Phrase alignAndLeadingPhrase2 = new Phrase("簡單置中的文字第三行", chFont);
Paragraph alignAndLeadingPara = new Paragraph();
alignAndLeadingPara.Leading = 30; //設定行距(每行之間的距離)            
alignAndLeadingPara.Alignment = Element.ALIGN_CENTER;
alignAndLeadingPara.Add(alignAndLeadingPhrase);
alignAndLeadingPara.Add("\n");
alignAndLeadingPara.Add(alignAndLeadingPhrase1);
alignAndLeadingPara.Add("\n");
alignAndLeadingPara.Add(alignAndLeadingPhrase2);

執行結果:發現跟之前的測試文字比較起來,每一行之間的距離變的很大了!

4.然後介紹第四種:設定段落左右上下留白的空間以及首行的縮排:

段落之前(上方)想要留的空白只要利用SpacingBefore屬性即可,如:

doc.Add(new Paragraph("When this Paragraph.SpacingBefore is set to 1") { SpacingBefore = 1 });
doc.Add(new Paragraph("When this Paragraph.SpacingBefore is set to 35") { SpacingBefore = 35 });

執行出來就會發現段落上方的空白有變化了:

同理可得段落後面的空白可利用SpacingAfter屬性去設定,就不多做示範了。

如果要設定整個段落的左方留空白,利用Paragraph.IndentationLeft屬性即可,如:

doc.Add(new Paragraph("When this Paragraph.IndentationLeft is set to 35") { IndentationLeft = 25 });

執行出來的段落整段就會左邊留空白:

同理可得如何在段落的整個右方都留空白,便不重複示範。

然後如果要在該段落的第一行設定縮排,只要利用Paragraph.FirstLineIndent屬性即可,如:

doc.Add(new Paragraph("When this Paragraph.FirstLineIndent is set to 35") { FirstLineIndent = 25 });

執行出來的段落的第一行就會有縮排了:

完整程式碼:

//設定一個長度寬度很小的文件
Document doc = new Document(PageSize.A7);
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("ChunkPhraseParagraph.pdf", FileMode.Create));            
doc.Open();

//設定中文字體
string chFontPath = "c:\\windows\\fonts\\simhei.ttf";//windows內建的SimHei字體(中易黑體)                            
BaseFont chBaseFont = BaseFont.CreateFont(chFontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font chFont = new iTextSharp.text.Font(chBaseFont,12);

//簡單2句話:利用phrase類別製作兩句話,可用\n斷行,再加入到paragraph變成一個段落
Phrase simplePhr1 = new Phrase("簡單3句話,這是第1句。。。", chFont);
Phrase simplePhr2 = new Phrase("簡單3句話,這是第2句。。。", chFont);
Phrase simplePhr3 = new Phrase("簡單3句話,這是第3句,此句前面有手動加上斷行,此句後面就是Paragraph的結尾,一定會有斷行!", chFont);
Paragraph simplePara = new Paragraph();
simplePara.Add(simplePhr1);
simplePara.Add(simplePhr2);
simplePara.Add("\n");
simplePara.Add(simplePhr3);


//一句話有各種字型變化以及字型大小:可利用chunk類別製作名詞動詞,加入到phrase變成一句話,最後加入到paragraph變成一個段落            
Chunk simpleChunk = new Chunk("一般的文字+", chFont);
Chunk underLineChunk = new Chunk("加底線的文字+", chFont) ;
Chunk boldChunk = new Chunk("粗體的文字", new iTextSharp.text.Font(chBaseFont,12,1));
underLineChunk.SetUnderline(0.2f, -2f);
Phrase complicatedPhrase = new Phrase();
complicatedPhrase.Add(simpleChunk);
complicatedPhrase.Add(underLineChunk);
complicatedPhrase.Add(boldChunk);
Paragraph complicatedPara = new Paragraph();
complicatedPara.Add(complicatedPhrase);

//將整個段落置中置左置右並設定行高
Phrase alignAndLeadingPhrase = new Phrase("簡單置中的文字",chFont);
Phrase alignAndLeadingPhrase1 = new Phrase("簡單置中的文字第二行", chFont);
Phrase alignAndLeadingPhrase2 = new Phrase("簡單置中的文字第三行", chFont);
Paragraph alignAndLeadingPara = new Paragraph();
alignAndLeadingPara.Leading = 30; //設定行距(每行之間的距離)            
alignAndLeadingPara.Alignment = Element.ALIGN_CENTER;
alignAndLeadingPara.Add(alignAndLeadingPhrase);
alignAndLeadingPara.Add("\n");
alignAndLeadingPara.Add(alignAndLeadingPhrase1);
alignAndLeadingPara.Add("\n");
alignAndLeadingPara.Add(alignAndLeadingPhrase2);



//pdf文件加入簡單2句話
doc.Add(simplePara);
//pdf文件加入複雜的一句話
doc.Add(complicatedPara);
//pdf文件加入一段置中的文字
doc.Add(alignAndLeadingPara);
//pdf測試spacing        
doc.Add(new Paragraph("When this Paragraph.SpacingBefore is set to 1") { SpacingBefore = 1 });
doc.Add(new Paragraph("When this Paragraph.SpacingBefore is set to 35") { SpacingBefore = 35 });
doc.Add(new Paragraph("When this Paragraph.IndentationLeft is set to 35") { IndentationLeft = 25 });
doc.Add(new Paragraph("When this Paragraph.FirstLineIndent is set to 35") { FirstLineIndent = 25 });            
doc.Close();

iTextSharp_4_1_6測試結果:

程式碼都不用修改,可產出一樣的結果。

這篇大概是這樣。。。

參考資料:

itext Chunk Phrase Paragraph区别

paragraph spacing in pdf itextsharp RSS - StackOverFlow