新增段落文字到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測試結果:
程式碼都不用修改,可產出一樣的結果。
這篇大概是這樣。。。
參考資料: