iT邦幫忙

0

[C#]使用iTextSharp繪製PDF

  • 分享至 

  • xImage
  •  

iTextSharp套件經常被使用來產出PDF檔案,
且新版iTextSharp套件有支援將HTML直接轉換成PDF,使用上相當方便直覺,
但若使用4.1.6以上的版本,會有授權相關問題,
如果要應用在商業行為中,就要特別注意這個部分,
為了當一個快樂的免費仔,我們使用4.1.6版手繪產出需要的PDF格式。

在開始之前,請先下載iTextSharp套件,並將其加入參考:
(以下使用visual studio的NuGet套件管理員操作)
https://ithelp.ithome.com.tw/upload/images/20230501/20149099mFa0tl4Y5M.jpg

//加入參考
using iTextSharp.text.pdf;
using iTextSharp.text;

範例PDF

https://ithelp.ithome.com.tw/upload/images/20230501/20149099ed1RBMA51A.jpg

這個範例先不考慮如何將動態值塞入PDF中,僅針對文字及表格繪製做處理。
首先先建立一個新的空白文件,並設定需要使用的文字字體:

 //初始化
Document doc = new Document();
PdfWriter pdfWriter = PdfWriter.GetInstance(doc, stream);

//字型設定
string kaiu = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "KAIU.TTF");
string wingDing = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "WINGDNG2.TTF");
string sinhei = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "msjh.ttc,0");

BaseFont wingDings = BaseFont.CreateFont(wingDing, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font wingdins2 = new Font(wingDings, 14);
            
BaseFont bfChinese = BaseFont.CreateFont(kaiu, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font ChFont_Title = new Font(bfChinese, 24);
Font ChFont_Content = new Font(bfChinese, 12);
Font ChFont_Font18 = new Font(bfChinese, 18, 1);
Font ChFont_Font16 = new Font(bfChinese, 16);
Font ChFont_Font10 = new Font(bfChinese, 10);
Font ChFont_Font14_UnderLine = new Font(bfChinese, 14, Font.UNDERLINE);

BaseFont sinheiC = BaseFont.CreateFont(sinhei, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font sinhei_Title = new Font(sinheiC, 18);
Font sinhei_Content = new Font(sinheiC, 12);
Font sinhei_Content_red = new Font(sinheiC, 12, Font.NORMAL, Color.RED);

接下來開始在對應位置放上需要的物件:

doc.Open();
PdfContentByte cb = pdfWriter.DirectContent;       

//---畫左上角的框框----
cb.MoveTo(30, 820);
cb.LineTo(210, 820);
cb.MoveTo(210, 820);
cb.LineTo(210, 780);
cb.MoveTo(210, 780);
cb.LineTo(30, 780);
cb.MoveTo(30, 780);
cb.LineTo(30, 820);
cb.ClosePathStroke();
//---畫左上角的框框----

//第一個表格(放非表格的內容)
PdfPTable table = new PdfPTable(1);
table.TotalWidth = 500f;
table.LockedWidth = true;
Phrase doc_Id = new Phrase("申請單單號:" , ChFont_Content);
ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER, doc_Id, doc.Right / 2, doc.Top + 40, 0);//文字顯示於左上角
doc.Add(doc_Id);

PdfPCell header = new PdfPCell(new Phrase("測試申請單", ChFont_Title));
header.HorizontalAlignment = Element.ALIGN_CENTER;//文字置中
header.Border = PdfPCell.NO_BORDER; //不要有框線(因為是非表格的內容)
header.MinimumHeight = 20; //設定最小列高
table.AddCell(header); //把header的內容加到table中

//請辦事由
PdfPCell subject = new PdfPCell(new Phrase("主旨:測試申請單", ChFont_Font18));
subject.Border = PdfPCell.NO_BORDER;
subject.SetLeading(1.5f, 1.5f);
subject.MinimumHeight = 50;
table.AddCell(subject);

//回覆截止日
Paragraph paragraph1 = new Paragraph();
//"方框打勾"這個符號沒辦法直接輸出,所以用WINGDNG2字體的R代碼輸出     
Chunk c1 = new Chunk("R", wingdins2);
Chunk c2 = new Chunk("請於  112  年  5  月  15  日下班前回覆", ChFont_Font14_UnderLine);
paragraph1.Add(c1);
paragraph1.Add(c2);

PdfPCell dueDate = new PdfPCell(paragraph1);
dueDate.Border = PdfPCell.NO_BORDER;
dueDate.MinimumHeight = 50;
table.AddCell(dueDate);

//申請人
PdfPCell applyName = new PdfPCell(new Phrase("申請人:王小明", ChFont_Font16));
applyName.Border = PdfPCell.NO_BORDER;
dueDate.SetLeading(3f, 1.5f);
table.AddCell(applyName);

//分機
PdfPCell txt = new PdfPCell(new Phrase("分機:111" , ChFont_Font16));
txt.Border = PdfPCell.NO_BORDER;
txt.MinimumHeight = 80;
table.AddCell(txt);

doc.Add(table);

//第二個表格(真的表格)
PdfPTable table2 = new PdfPTable(2);
table.TotalWidth = 500f;
table.LockedWidth = true;
                
PdfPCell header2 = new PdfPCell(new Phrase("測試表格", sinhei_Title));
header2.Colspan = 2; //標頭要橫跨2欄,所以Colspan設定為2
header2.HorizontalAlignment = Element.ALIGN_CENTER;
table2.AddCell(header2);

PdfPCell test1 = new PdfPCell(new Phrase("111", sinhei_Content));
test1.Colspan = 1;
table2.AddCell(test1);

PdfPCell content = new PdfPCell(new Phrase("內容內容", sinhei_Content));
content.Colspan = 1;
table2.AddCell(content);

PdfPCell test2 = new PdfPCell(new Phrase("2222", sinhei_Content));
test2.Colspan = 1;
table2.AddCell(test2);

PdfPCell content2 = new PdfPCell(new Phrase("內容內容內容", sinhei_Content_red));
content2.Colspan = 1;
table2.AddCell(content2);

doc.Add(table2);
doc.Close();

這樣就能夠繪製出範例內容了!
上方非表格的內容同樣放進表格中,是覺得表格比較容易控制內容排版,
若要使用文字段落呈現也沒有問題~


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言