C# PDF附件生成
最近項目上需要生成行業某證件,查閱了一下,大體有兩個思路可以實現
1.圖片格式
2.PDF格式
使用圖片格式,GDI+繪圖的形式,GDI+繪圖相關庫資料比較多,難度也還好,問題是生成的證不是很好看,看上去別扭。最后還是決定用PDF格式生成
查閱了PDF生成相關資料,C#的相當相當少。已有的庫,查閱到了包括 Aspose.PDF,QuestPDF,IText7
Aspose.PDF是商業版,需要授權,資料很少,嘗試著寫了一點,不是很好實現。
QuestPDF,查了以下資料,讓人眼前一亮的寫法,全部靠lambda表達式的方式操作,使用起來較容易上手
本地寫完之后,放到IIS中,發現與IIS沖突,未查到解決資料。大體報的異常:
Unable to load library 'libSkiaSharp'
QuestPDF.Drawing.FontManager”的類型初始值設定項引發異常
只能放棄
因此,今天主要介紹iText7庫的使用。
一、iText7 生成PDF
1.iText7 字體處理
默認的字體,除了顯示不好看以外,還容易不顯示中文。一直覺得字體是最簡單,最常用的部分,應該類似 .setFont("宋體")的形式就可以實現,而pdf相關操作庫中,字體處理都稍微麻煩。
FontProgram fontProgram =FontProgramFactory.CreateFont(fontpath); PdfFont fontTitle = PdfFontFactory.CreateFont(fontProgram, PdfEncodings.IDENTITY_H);fontTitle對象可以在后續的代碼中直接使用。
說明:上面主要參數是 字體庫的路徑。此處需要注意,對于windows默認的字體,可以直接通過路徑 “C:/windows/Fonts/simhei.ttf” 引用,對于非操作系統自帶的字體,用戶自己安裝的字體,不能從?“C:/windows/Fonts"路徑找到安裝后的路徑加載,通過windows路徑加載,會產生如下錯誤:
System.IO.IOException:“C:\Windows\Fonts\方正大標宋簡體.ttf not found as file or resource.
?需要使用下載的原字體文件(比如:“D:\TEMP\fonts\SourceHanSansCN-Medium-2.otf”)進行直接加載。
另外,windows/fonts中,除了包含 .ttf的字體,還包括 .ttc的字體,該類字體大體是一種集合的形式,具體加載代碼如下:
PdfFont titleFont = PdfFontFactory.CreateFont(@"C:\Windows\Fonts\simsun.ttc,0",PdfEncodings.IDENTITY_H);以上路徑字符,第一個是字體路徑,第二個數值,代表的應該是字體在集合中的索引。
另外,關于字體版權,有些字體是需要授權的,不授權的話無法再pdf庫中使用,會報如下錯誤:
iText.Kernel.Exceptions.PdfException:“FZDBSJW--GB1-0Regular cannot be embedded due to licensing?
2.頁面設置
PdfWriter writer = new PdfWriter(@"D:\TEMP\nn.pdf"); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf); pdf.SetDefaultPageSize(PageSize.A4.Rotate());3.背景圖片設置
//背景圖片 PdfCanvas canvas = new PdfCanvas(pdf.AddNewPage()); canvas.AddImageFittedIntoRectangle(ImageDataFactory.Create(backgroundimg), PageSize.A4.Rotate(), false);4.表格相關
Table table = new Table(UnitValue.CreatePercentArray(new float[] { 3,5,4f,5})).UseAllAvailableWidth(); table.SetMarginLeft(120); table.SetMarginRight(100); table.SetMarginTop(16);第一行數組指代表格的列數,每列寬度所占比。Cell的SetWidth()方法測試無效(可能是我用法不對)
上述setMarginLeft之類的方法,與html中 margin類似
5.一個Paragraph中多個樣式
Paragraph py = new Paragraph("2023").SetFont(fontTNR).SetFontSize(valFontSize); Paragraph pyc = new Paragraph("年").SetFont(fontDX).SetFontSize(valFontSize); Paragraph pm = new Paragraph("05").SetFont(fontTNR).SetFontSize(valFontSize); Paragraph pmc = new Paragraph("月").SetFont(fontDX).SetFontSize(valFontSize); Paragraph groupPP = new Paragraph(); groupPP.Add(py).Add(pyc).Add(pm).Add(pmc);6.圖片插入
var ii = QRAssister.GetQRCode("http://www.baidu.com", 100, 100);Image img = new Image(ImageDataFactory.Create(ii, System.Drawing.Color.Transparent));img.SetWidth(70);img.SetHeight(70);img.SetMarginTop(-85);img.SetMarginLeft(190);document.Add(img);二、QuestPDF庫生成PDF
0.開始
QuestPDF庫通過lambda表達式的方式使用,代碼看上去比較神奇。
Document.Create(container =>{container.Page(page =>{//設置頁面page.Size(PageSizes.A4.Landscape());//設置內容page.Content().PaddingVertical(2, Unit.Centimetre).Column(x =>{x.Spacing(20);x.Item().AlignCenter().Text("此處寫入文字內容").FontSize(30).LetterSpacing(0.3f).Bold();});});});});}).GeneratePdf(pdfpath);1.字體處理
FontManager.RegisterFont(File.OpenRead(@"C:\Windows\Fonts\simhei.ttf")); //黑體 FontManager.RegisterFont(File.OpenRead(@"C:\Windows\Fonts\simsun.ttc")); //宋體 FontManager.RegisterFont(File.OpenRead(@"C:\Windows\Fonts\simfang.ttf")); //仿宋2.頁面設置
page.Size(PageSizes.A4.Landscape()); page.MarginTop(1, Unit.Centimetre); page.MarginBottom(1, Unit.Centimetre); page.MarginLeft(3, Unit.Centimetre); page.MarginRight(3, Unit.Centimetre); page.DefaultTextStyle(x => x.FontSize(20).FontFamily("黑體"));3.背景圖片
page.Background().Image(backgroundimg,ImageScaling.Resize);4.圖片插入
x.Item().Row(r => {var ii = r.ConstantItem(7, Unit.Centimetre).AlignLeft().PaddingLeft(10);ii.Image(qrpath, ImageScaling.FitHeight); });總結
以上是生活随笔為你收集整理的C# PDF附件生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python札记 -- 使用easy_i
- 下一篇: c# char unsigned_dll