当前位置: 首页 > news >正文

C#版 iText7——画发票PDF(完整)

显示描述:
1、每页显示必须带有发票头、“销售方和购买方信息”
2、明细填充为:当n≤8 行时,发票总高度140mm,每条发票明细行款高度4.375mm;
当8<n≤12行时,发票高度增加17.5mm,不换页;
以此类推
根据实际情况能放下“应税明细信息”和“票尾”信息后换页,注意是否为最后一行
3、超过一页,则每页显示小计

显示效果:
1、只有一页的情况:
在这里插入图片描述
2、有两页的且刚好能放下所有明细的情况(超过一页后,开票日期下显示页数):
这是第一页
在这里插入图片描述

代码实现:

步骤一、创建主方法,可传入需要的参数模型

public static void InvoicePage(NaturalSystemPdfModel model) //NaturalSystemPdfModel为传入的需要用到的参数模型
{//创建pdf的保存位置//model.filePath为传入模型中存放的文件保存路径,model.kprq为开票日期,model.fileName为文件名//model.filePath = Path.Combine(_webHostEnvironment.WebRootPath, “.pdf”);获取当前服务器下的文件路径string outputPath = Path.Combine(model.filePath,model.kprq.ToString("yyyyMMdd"), model.fileName + ".pdf");//判断文件夹是否存在,不存在则创建一个新的if (!Directory.Exists(Path.Combine(model.filePath, model.kprq.ToString("yyyyMMdd"))))Directory.CreateDirectory(Path.Combine(model.filePath, model.kprq.ToString("yyyyMMdd")));// 创建一个新的PDF文档var cc = new PdfWriter(outputPath);//设置 PdfStream默认压缩级别。cc.SetCompressionLevel(CompressionConstants.BEST_COMPRESSION);PdfDocument pdf = new PdfDocument(cc);model.jshjdx = MoneyToUpper(model.jshj.ToString()); //价税合计大写转换(转换方法MoneyToUpper())model.gmfmc = model.gmfmc == "个人" ? model.gmfmc + "(个人)" : model.gmfmc;//购方名称字体//model.webHost为模型中的发布服务器中的文件所在位置:IWebHostEnvironment _webHostEnvironment.WebRootPathPdfFont KT = PdfFontFactory.CreateFont(System.IO.Path.Combine(model.webHost, "fonts", "SIMKAI.TTF"), PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_NOT_EMBEDDED);PdfFont ST = PdfFontFactory.CreateFont(System.IO.Path.Combine(model.webHost, "fonts", "SIMFANG.TTF"), PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_NOT_EMBEDDED);PdfFont CN = PdfFontFactory.CreateFont(System.IO.Path.Combine(model.webHost, "fonts", "COUR.TTF"), PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_NOT_EMBEDDED);//添加页眉页脚||或者需要每页显示的票头//创建类PdfEventHandler,在步骤二中PdfEventHandler handler = new PdfEventHandler(model, KT, ST, CN);//发票中的票头、购买方信息、表头都放在PdfEventHandler类中pdf.AddEventHandler(PdfDocumentEvent.START_PAGE, handler);ComputeValue computeValue = new ComputeValue();try{using (Document document = new Document(pdf, iText.Kernel.Geom.PageSize.A4, false)){//document.SetMargins(0, 0, 0, 0);//默认宽210mm=8.2677英寸=595磅//默认高29.7mm=11.6929英寸=842磅//默认边距36磅=0.5英寸=12.7mm// 定义自定义RGB颜色(例如,红色)DeviceRgb customColor = new DeviceRgb(128, 0, 0);//发票固定高度pt:票头,ht:购买方信息,et:票尾备注,kp:开票人float pt = 30, ht = 22, et = 20, kp = 8.5f;//下面代码中大量用到的computeValue.computeUnit()方法作用为:毫米转换磅#region 表中列表 //添加表格Table BodyTable = new Table(9, false);Cell cel11 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetWidth(computeValue.computeUnit(37)).SetHeight(computeValue.computeUnit(4.5f)).SetBorderRight(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("项目名称"));Cell cel12 = new Cell(1, 2).SetTextAlignment(TextAlignment.LEFT).SetWidth(computeValue.computeUnit(24)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("规格型号"));Cell cel13 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetWidth(computeValue.computeUnit(12)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("单位"));Cell cel14 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(25)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("数量"));Cell cel15 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(25)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("单价"));Cell cel16 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(26)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("金额"));Cell cel17 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetBorder(Border.NO_BORDER).SetWidth(computeValue.computeUnit(25)).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("税率/征收率"));Cell cel18 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(27)).SetBorderLeft(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("税额"));BodyTable.AddCell(cel11.SetBorder(new SolidBorder(customColor, 1)));BodyTable.AddCell(cel12);BodyTable.AddCell(cel13);BodyTable.AddCell(cel14);BodyTable.AddCell(cel15);BodyTable.AddCell(cel16);BodyTable.AddCell(cel17);BodyTable.AddCell(cel18.SetBorder(new SolidBorder(customColor, 1)));BodyTable.StartNewRow();//合计小计列//合计Cell cel41 = new Cell(1, 2).SetTextAlignment(TextAlignment.CENTER).SetHeight(computeValue.computeUnit(4.5f)).SetPaddingBottom(-5).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("合\t\t计").SetFixedLeading(11));Cell cel42 = new Cell(1, 5).SetTextAlignment(TextAlignment.RIGHT).SetHeight(computeValue.computeUnit(4.5f)).SetFont(ST).SetFontSize(9).Add(new Paragraph("¥" + model.hjje).SetFixedLeading(11));Cell cel43 = new Cell(1, 2).SetTextAlignment(TextAlignment.RIGHT).SetHeight(computeValue.computeUnit(4.5f)).SetFont(ST).SetFontSize(9).Add(new Paragraph("¥" + model.hjse).SetFixedLeading(11));//价税合计大小写ImageData data = ImageDataFactory.Create(Path.Combine(model.webHost, "images", "jiashuiheji.png"));Image img = new Image(data).SetWidth(15).SetHeight(15);Cell cel51 = new Cell(1, 2).SetHeight(computeValue.computeUnit(8)).SetWidth(computeValue.computeUnit(50)).SetBorderBottom(Border.NO_BORDER).SetVerticalAlignment(VerticalAlignment.MIDDLE).SetTextAlignment(TextAlignment.CENTER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("价税合计(大写)"));Cell cel53 = new Cell(1, 4).SetBorderLeft(Border.NO_BORDER).SetBorderRight(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetHeight(computeValue.computeUnit(8)).SetVerticalAlignment(VerticalAlignment.MIDDLE).SetTextAlignment(TextAlignment.LEFT).Add(new Paragraph(model.jshjdx).SetFont(ST).SetFontSize(10).SetFirstLineIndent(18)).Add(new Image(ImageDataFactory.Create(Path.Combine(model.webHost, "images", "jiashuiheji.png"))).SetWidth(15).SetHeight(15));Cell cel55 = new Cell(1, 1).SetBorderLeft(Border.NO_BORDER).SetBorderRight(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetVerticalAlignment(VerticalAlignment.MIDDLE).SetHeight(computeValue.computeUnit(8)).SetTextAlignment(TextAlignment.RIGHT).Add(new Paragraph("(小写)").SetFont(KT).SetFontSize(9).SetFontColor(customColor));Cell cel54 = new Cell(1, 2).SetBorderLeft(Border.NO_BORDER).SetHeight(computeValue.computeUnit(8)).SetBorderBottom(Border.NO_BORDER).SetVerticalAlignment(VerticalAlignment.MIDDLE).SetTextAlignment(TextAlignment.LEFT).Add(new Paragraph("¥" + model.jshj).SetFont(ST).SetFontSize(10));#region 表尾//添加表格Table endTable = new Table(2, false);Cell cel61 = new Cell(1, 1).SetWidth(computeValue.computeUnit(6)).SetHeight(computeValue.computeUnit(20)).SetVerticalAlignment(VerticalAlignment.MIDDLE).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("备注"));Cell cel62 = new Cell(1, 8).SetTextAlignment(TextAlignment.LEFT).SetVerticalAlignment(VerticalAlignment.MIDDLE).SetWidth(computeValue.computeUnit(195)).SetHeight(computeValue.computeUnit(20)).SetFont(ST).SetFontSize(10).Add(new Paragraph(model.bz));#endregion#region 开票人// 添加发票内容Paragraph ending = new Paragraph().Add("开票人:").SetFont(KT).SetFontSize(9).SetFontColor(customColor).SetTextAlignment(TextAlignment.LEFT);Paragraph endingname = new Paragraph().Add( model.kpr).SetFont(ST).SetFontSize(10).SetTextAlignment(TextAlignment.LEFT);#endregion//循环存放数据int i = 0, j = model.medis.Count;float XJJE=0,XJSE=0,sumh=0,oldsumh=0;float gh = pt + ht + et + kp;bool flag=false;for (i = 0; i < j; i++){//计算每行高度//商品名长度int mcleng =computeValue.GetStrLength(model.medis[i].xmmc)-1;//方法computeValue.GetStrLength()作用为获取字符串长度int ggleng= computeValue.GetStrLength(model.medis[i].ggxh);float higth = (mcleng % 8 == 0 ? mcleng / 8 : mcleng / 8 + 1)>(ggleng % 6 == 0 ? ggleng / 6 : ggleng / 6 + 1)? (mcleng % 8 == 0 ? mcleng / 8 : mcleng / 8 + 1): (ggleng % 6 == 0 ? ggleng / 6 : ggleng / 6 + 1);sumh += higth;Cell cel121 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetWidth(computeValue.computeUnit(37)).SetHeight(computeValue.computeUnit((float)(higth * 4.375))).SetFont(ST).SetFontSize(10).Add(new Paragraph(model.medis[i].xmmc).SetFixedLeading(12));Cell cel122 = new Cell(1, 2).SetTextAlignment(TextAlignment.LEFT).SetWidth(computeValue.computeUnit(24)).SetHeight(computeValue.computeUnit((float)(higth * 4.375))).SetFont(ST).SetFontSize(10).SetSplitCharacters(new KeepAllSplitCharacters()).Add(new Paragraph(model.medis[i].ggxh).SetFixedLeading(12).SetWidth(computeValue.computeUnit(24)));Cell cel123 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetWidth(computeValue.computeUnit(12)).SetHeight(computeValue.computeUnit((float)(higth * 4.375))).SetFont(ST).SetFontSize(10).Add(new Paragraph(model.medis[i].dw).SetFixedLeading(12));Cell cel124 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(25)).SetHeight(computeValue.computeUnit((float)(higth * 4.375))).SetFont(ST).SetFontSize(10).Add(new Paragraph(model.medis[i].sl).SetFixedLeading(12));Cell cel125 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(25)).SetHeight(computeValue.computeUnit((float)(higth * 4.375))).SetFont(ST).SetFontSize(10).Add(new Paragraph(model.medis[i].dj).SetFixedLeading(12));Cell cel126 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(26)).SetHeight(computeValue.computeUnit((float)(higth * 4.375))).SetFont(ST).SetFontSize(10).Add(new Paragraph(model.medis[i].je).SetFixedLeading(12));Cell cel127 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetWidth(computeValue.computeUnit(25)).SetHeight(computeValue.computeUnit((float)(higth * 4.375))).SetFont(ST).SetFontSize(10).Add(new Paragraph(model.medis[i].slv).SetFixedLeading(12));Cell cel128 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(27)).SetHeight(computeValue.computeUnit((float)(higth * 4.375))).SetFont(ST).SetFontSize(10).Add(new Paragraph(model.medis[i].se).SetFixedLeading(12));BodyTable.AddCell(cel121.SetBorder(new SolidBorder(customColor, 1)).SetBorderRight(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER));BodyTable.AddCell(cel122.SetBorder(Border.NO_BORDER));BodyTable.AddCell(cel123.SetBorder(Border.NO_BORDER));BodyTable.AddCell(cel124.SetBorder(Border.NO_BORDER));BodyTable.AddCell(cel125.SetBorder(Border.NO_BORDER));BodyTable.AddCell(cel126.SetBorder(Border.NO_BORDER));BodyTable.AddCell(cel127.SetBorder(Border.NO_BORDER));BodyTable.AddCell(cel128.SetBorder(new SolidBorder(customColor, 1)).SetBorderLeft(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER));BodyTable.StartNewRow();//创建新行// 添加分页//不足一页或刚好一页得情况//小计XJJE += float.Parse(model.medis[i].je);XJSE+= float.Parse(model.medis[i].se);if (sumh <= 35&& i+1==j){//中间高度float nh = 140 - gh + 25;//有分页的情况if (flag){//中间高度加8//小计Cell cel411 = new Cell(1, 2).SetTextAlignment(TextAlignment.CENTER).SetHeight(computeValue.computeUnit(4.5f)).SetFont(KT).SetFontSize(9).SetFontColor(customColor).SetPaddingBottom(-5).Add(new Paragraph("小\t\t计").SetFixedLeading(11));Cell cel421 = new Cell(1, 5).SetBorder(Border.NO_BORDER).SetTextAlignment(TextAlignment.RIGHT).SetHeight(computeValue.computeUnit(4.5f)).SetFont(ST).SetFontSize(9).Add(new Paragraph("¥" + XJJE).SetFixedLeading(11));Cell cel431 = new Cell(1, 2).SetTextAlignment(TextAlignment.RIGHT).SetHeight(computeValue.computeUnit(4.5f)).SetFont(ST).SetFontSize(9).Add(new Paragraph("¥" + XJSE).SetFixedLeading(11));//合计小计列BodyTable.AddCell(cel411.SetBorder(new SolidBorder(customColor, 1)).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER).SetBorderRight(Border.NO_BORDER));BodyTable.AddCell(cel421.SetBorder(Border.NO_BORDER));BodyTable.AddCell(cel431.SetBorder(new SolidBorder(customColor, 1)).SetBorderLeft(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER));BodyTable.StartNewRow();}//不够一页的情况//合计列BodyTable.AddCell(cel41.SetBorder(new SolidBorder(customColor, 1)).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER).SetBorderRight(Border.NO_BORDER));BodyTable.AddCell(cel42.SetBorder(Border.NO_BORDER));BodyTable.AddCell(cel43.SetBorder(new SolidBorder(customColor, 1)).SetBorderLeft(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER));BodyTable.StartNewRow();//新增行//价税合计大小写BodyTable.AddCell(cel51.SetBorder(new SolidBorder(customColor, 1)));//BodyTable.AddCell(cel52.SetBorder(new SolidBorder(customColor, 1)));BodyTable.AddCell(cel53.SetBorder(new SolidBorder(customColor, 1)));BodyTable.AddCell(cel55.SetBorder(new SolidBorder(customColor, 1)));BodyTable.AddCell(cel54.SetBorder(new SolidBorder(customColor, 1)));BodyTable.StartNewRow();//新增行float lasth=0;if (sumh <= 8){lasth = 8-sumh;}else if (sumh <= 12){nh += 17.5f*1;lasth = 12 - sumh;}else if (sumh <= 16){nh += 17.5f * 2;lasth = 16 - sumh;}else if (sumh <= 20){nh += 17.5f * 3;lasth = 20 - sumh;}else if (sumh <= 24){nh += 17.5f * 4;lasth = 24 - sumh;}else if (sumh <= 28){nh += 17.5f * 5;lasth = 28 - sumh;}else if (sumh <= 32){nh += 17.5f * 6;lasth = 32 - sumh;}else if (sumh <= 36){nh += 17.5f * 7;lasth = 36 - sumh;}else if (sumh <= 40){nh += 17.5f * 8;lasth = 40 - sumh;}//设置最后一行行高,因为不足一页时,最后一行可能需要占用多行行高var bzh = computeValue.computeUnit((higth + lasth) * 4.375f);cel121.SetHeight(bzh);cel122.SetHeight(bzh);cel123.SetHeight(bzh);cel124.SetHeight(bzh);cel125.SetHeight(bzh);cel126.SetHeight(bzh);cel127.SetHeight(bzh);cel128.SetHeight(bzh);BodyTable.SetHeight(computeValue.computeUnit(nh));//给表设置高度document.Add(BodyTable.SetFixedPosition(computeValue.computeUnit(4.5f), computeValue.computeUnit(243- nh) , computeValue.computeUnit(201)));//表尾备注endTable.AddCell(cel61.SetBorder(new SolidBorder(customColor, 1)));endTable.AddCell(cel62.SetBorder(new SolidBorder(customColor, 1)));float b = computeValue.computeUnit(241 - 20- nh) ;document.Add(endTable.SetFixedPosition(computeValue.computeUnit(4.5f), b, computeValue.computeUnit(201)));//价税合计图片//document.Add(img.SetFixedPosition(computeValue.computeUnit(51.5f), b + computeValue.computeUnit(24)));//开票人document.Add(ending.SetFixedPosition(computeValue.computeUnit(18), b - computeValue.computeUnit((float)8.5), computeValue.computeUnit(183)));document.Add(endingname.SetFixedPosition(computeValue.computeUnit(29), b - computeValue.computeUnit((float)8.5), computeValue.computeUnit(183)));sumh = 0;}//分页的情况else if (((sumh-higth >= 36) && (sumh - higth <= 39)&& i != 0 && i + 1 != j)|| (sumh>= 33)&& i + 2 == j){//小计Cell cel411 = new Cell(1, 2).SetTextAlignment(TextAlignment.CENTER).SetHeight(computeValue.computeUnit(4.5f)).SetFont(KT).SetFontSize(9).SetFontColor(customColor).SetPaddingBottom(-5).Add(new Paragraph("小\t\t计").SetFixedLeading(11));Cell cel421 = new Cell(1, 5).SetBorder(Border.NO_BORDER).SetTextAlignment(TextAlignment.RIGHT).SetHeight(computeValue.computeUnit(4.5f)).SetFont(ST).SetFontSize(9).Add(new Paragraph("¥" + XJJE).SetFixedLeading(11));Cell cel431 = new Cell(1, 2).SetTextAlignment(TextAlignment.RIGHT).SetHeight(computeValue.computeUnit(4.5f)).SetFont(ST).SetFontSize(9).Add(new Paragraph("¥" +XJSE).SetFixedLeading(11));//合计小计列BodyTable.AddCell(cel411.SetBorder(new SolidBorder(customColor, 1)).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER).SetBorderRight(Border.NO_BORDER));BodyTable.AddCell(cel421.SetBorder(Border.NO_BORDER));BodyTable.AddCell(cel431.SetBorder(new SolidBorder(customColor, 1)).SetBorderLeft(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER));BodyTable.StartNewRow();BodyTable.AddCell(cel41.SetBorder(new SolidBorder(customColor, 1)).SetBorderTop(Border.NO_BORDER).SetBorderRight(Border.NO_BORDER));BodyTable.AddCell(cel42.SetBorder(new SolidBorder(customColor, 1)).SetBorderLeft(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER).SetBorderRight(Border.NO_BORDER));BodyTable.AddCell(cel43.SetBorder(new SolidBorder(customColor, 1)).SetBorderLeft(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER));BodyTable.StartNewRow();//float nh =(sumh-oldsumh)*4.375f+13.5f+38;//判断中间列表占用高度--> i * computeValue.computeUnit(10):每行数据的高度;+ computeValue.computeUnit(10):表头高度+合计行的高度;(i*15):每行数据的行间距float nh = (sumh) * 4.375f + 13.5f + 38;BodyTable.SetHeight(computeValue.computeUnit(nh));BodyTable.SetBorderBottom(new SolidBorder(customColor, 1));document.Add(BodyTable.SetFixedPosition(computeValue.computeUnit(4.5f), computeValue.computeUnit(243- nh) , computeValue.computeUnit(201)));//开票人document.Add(ending.SetFixedPosition(computeValue.computeUnit(18), computeValue.computeUnit(243- nh- 9) , computeValue.computeUnit(183)));document.Add(endingname.SetFixedPosition(computeValue.computeUnit(29), computeValue.computeUnit(243- nh- 9) , computeValue.computeUnit(183)));//分页document.Add(new AreaBreak());BodyTable = new Table(9, false);#region 表头Cell cel110 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetWidth(computeValue.computeUnit(37)).SetHeight(computeValue.computeUnit(4.5f)).SetBorderRight(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("项目名称"));Cell cel120 = new Cell(1, 2).SetTextAlignment(TextAlignment.LEFT).SetWidth(computeValue.computeUnit(24)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("规格型号"));Cell cel130 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetWidth(computeValue.computeUnit(12)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("单位"));Cell cel140 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(25)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("数量"));Cell cel150 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(25)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("单价"));Cell cel160 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(26)).SetBorder(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("金额"));Cell cel170 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetBorder(Border.NO_BORDER).SetWidth(computeValue.computeUnit(25)).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("税率/征收率"));Cell cel180 = new Cell(1, 1).SetTextAlignment(TextAlignment.RIGHT).SetWidth(computeValue.computeUnit(27)).SetBorderLeft(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER).SetBorderTop(Border.NO_BORDER).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Paragraph("税额"));BodyTable.AddCell(cel110.SetBorder(new SolidBorder(customColor, 1)));BodyTable.AddCell(cel120);BodyTable.AddCell(cel130);BodyTable.AddCell(cel140);BodyTable.AddCell(cel150);BodyTable.AddCell(cel160);BodyTable.AddCell(cel170);BodyTable.AddCell(cel180.SetBorder(new SolidBorder(customColor, 1)));BodyTable.StartNewRow();#endregionXJJE = 0; XJSE = 0;//oldsumh = sumh;sumh = 0;flag = true;continue;}//添加页码int n=pdf.GetNumberOfPages();if (n>1){for (int p = 2; p <= n; p++){document.ShowTextAligned(new Paragraph(String.Format("共" + n + "页 第" + p+"页")).SetFontSize(10).SetFont(ST),computeValue.computeUnit(200), computeValue.computeUnit(272), p, TextAlignment.RIGHT,VerticalAlignment.TOP, 0);}}// 关闭文档document.Close();Console.WriteLine("PDF发票已生成:" + outputPath);}}catch (Exception e){Console.WriteLine(e.Message);throw;}}/// <summary>
/// 金额转换成中文大写金额
/// </summary>
/// <param name="LowerMoney">eg:10.74</param>
/// <returns></returns>
private static string MoneyToUpper(string LowerMoney)
{string functionReturnValue = null;bool IsNegative = false; // 是否是负数if (LowerMoney.Trim().Substring(0, 1) == "-"){// 是负数则先转为正数LowerMoney = LowerMoney.Trim().Remove(0, 1);IsNegative = true;}string strLower = null;string strUpart = null;string strUpper = null;int iTemp = 0;// 保留两位小数 123.489→123.49  123.4→123.4LowerMoney = Math.Round(double.Parse(LowerMoney), 2).ToString();if (LowerMoney.IndexOf(".") > 0){if (LowerMoney.IndexOf(".") == LowerMoney.Length - 2){LowerMoney = LowerMoney + "0";}}else{LowerMoney = LowerMoney + ".00";}strLower = LowerMoney;iTemp = 1;strUpper = "";while (iTemp <= strLower.Length){switch (strLower.Substring(strLower.Length - iTemp, 1)){case ".":strUpart = "圆";break;case "0":strUpart = "零";break;case "1":strUpart = "壹";break;case "2":strUpart = "贰";break;case "3":strUpart = "叁";break;case "4":strUpart = "肆";break;case "5":strUpart = "伍";break;case "6":strUpart = "陆";break;case "7":strUpart = "柒";break;case "8":strUpart = "捌";break;case "9":strUpart = "玖";break;}switch (iTemp){case 1:strUpart = strUpart + "分";break;case 2:strUpart = strUpart + "角";break;case 3:strUpart = strUpart + "";break;case 4:strUpart = strUpart + "";break;case 5:strUpart = strUpart + "拾";break;case 6:strUpart = strUpart + "佰";break;case 7:strUpart = strUpart + "仟";break;case 8:strUpart = strUpart + "万";break;case 9:strUpart = strUpart + "拾";break;case 10:strUpart = strUpart + "佰";break;case 11:strUpart = strUpart + "仟";break;case 12:strUpart = strUpart + "亿";break;case 13:strUpart = strUpart + "拾";break;case 14:strUpart = strUpart + "佰";break;case 15:strUpart = strUpart + "仟";break;case 16:strUpart = strUpart + "万";break;default:strUpart = strUpart + "";break;}strUpper = strUpart + strUpper;iTemp = iTemp + 1;}strUpper = strUpper.Replace("零拾", "零");strUpper = strUpper.Replace("零佰", "零");strUpper = strUpper.Replace("零仟", "零");strUpper = strUpper.Replace("零零零", "零");strUpper = strUpper.Replace("零零", "零");strUpper = strUpper.Replace("零角零分", "整");strUpper = strUpper.Replace("零分", "整");strUpper = strUpper.Replace("零角", "零");strUpper = strUpper.Replace("零亿零万零圆", "亿圆");strUpper = strUpper.Replace("亿零万零圆", "亿圆");strUpper = strUpper.Replace("零亿零万", "亿");strUpper = strUpper.Replace("零万零圆", "万圆");strUpper = strUpper.Replace("零亿", "亿");strUpper = strUpper.Replace("零万", "万");strUpper = strUpper.Replace("零圆", "圆");strUpper = strUpper.Replace("零零", "零");Console.WriteLine("零角零分");// 对壹圆以下的金额的处理if (strUpper.Substring(0, 1) == "圆"){strUpper = strUpper.Substring(1, strUpper.Length - 1);}if (strUpper.Substring(0, 1) == "零"){strUpper = strUpper.Substring(1, strUpper.Length - 1);}if (strUpper.Substring(0, 1) == "角"){strUpper = strUpper.Substring(1, strUpper.Length - 1);}if (strUpper.Substring(0, 1) == "分"){strUpper = strUpper.Substring(1, strUpper.Length - 1);}if (strUpper.Substring(0, 1) == "整"){strUpper = "零圆整";}functionReturnValue = strUpper;if (IsNegative == true){return "负" + functionReturnValue;}else{return string.Format(functionReturnValue, Encoding.GetEncoding("GB2312"));}
}public class ComputeValue
{/// <summary>/// 毫米转换磅/// </summary>/// <param name="millimetre"></param>/// <returns></returns>public float computeUnit(float millimetre){return millimetre / 10 / 2.54f * 72;}/// <summary>/// 获取字符串长度/// </summary>/// <param name="str"></param>/// <returns></returns>public int GetStrLength(string str){double length = 0;str = str.Replace(" ", "");for (int i = 0; i < str.Length; i++) {if (str[i] >= 0x4E00 && str[i] <= 0x9FA5){length += 1;}else{length += 0.5;}}return (int)Math.Ceiling(length);}
}

步骤二:创建PdfEventHandler类:

/// <summary>
/// 需要继承IEventHandler
/// </summary>
public class PdfEventHandler : IEventHandler
{private NaturalSystemPdfModel _model;private PdfFont KT;private PdfFont ST;private PdfFont CN;//构造方法:带入模型以及字体public PdfEventHandler(NaturalSystemPdfModel model, PdfFont kt, PdfFont st, PdfFont cn) {_model = model;KT = kt;ST = st;CN = cn;}public void HandleEvent(Event e){PdfDocumentEvent docEvent = (PdfDocumentEvent)e;PdfDocument pdfDoc = docEvent.GetDocument();PdfPage page = docEvent.GetPage();PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);Rectangle pageSize = page.GetPageSize();ComputeValue computeValue = new ComputeValue();// 定义自定义RGB颜色(例如,红色)DeviceRgb customColor = new DeviceRgb(128, 0, 0);Canvas canvas = new Canvas(pdfCanvas, pageSize);#region 票头#region 双横线//添加横线pdfCanvas.MoveTo(computeValue.computeUnit(141), computeValue.computeUnit(278.5f));pdfCanvas.LineTo(computeValue.computeUnit(69), computeValue.computeUnit(278.5f));pdfCanvas.SetStrokeColor(new DeviceRgb(128, 0, 0));pdfCanvas.MoveTo(computeValue.computeUnit(141), computeValue.computeUnit(277.5f));pdfCanvas.LineTo(computeValue.computeUnit(69), computeValue.computeUnit(277.5f));pdfCanvas.SetStrokeColor(new DeviceRgb(128, 0, 0));pdfCanvas.ClosePathStroke();#endregion#region 票头左边 二维码、标签码// 添加动态二维码Image EWM = new Image(ImageDataFactory.Create(_model.qrCode)).SetWidth(computeValue.computeUnit(20)).SetHeight(computeValue.computeUnit(20));canvas.Add(EWM.SetFixedPosition(1, computeValue.computeUnit(7), computeValue.computeUnit(271)));//二维码中间的“税”字图标Image S = new Image(ImageDataFactory.Create(System.IO.Path.Combine(_model.webHost, "images", "Shui.png"))).SetWidth(computeValue.computeUnit(4)).SetHeight(computeValue.computeUnit(4));canvas.Add(S.SetFixedPosition(1, computeValue.computeUnit(15), computeValue.computeUnit((float)279)));//Image EWM = new BarcodeQRCode("", 54, 56, null);//添加标签//Image BQM = new Image(ImageDataFactory.Create("E://111.png"))//    .SetWidth(computeValue.computeUnit(28))//    .SetHeight(computeValue.computeUnit(20));//canvas.Add(BQM.SetFixedPosition(1, computeValue.computeUnit(29), computeValue.computeUnit(271)));#endregion#region 票头文字及印章// 添加发票内容Paragraph heading = new Paragraph(_model.type).SetTextAlignment(TextAlignment.CENTER).SetFont(KT).SetFontColor(customColor).SetFontSize(19);if (_model.type.Contains("增值税")){canvas.Add(heading.SetFixedPosition(computeValue.computeUnit(56), computeValue.computeUnit(280.35f), computeValue.computeUnit(100)));}else {canvas.Add(heading.SetFixedPosition(computeValue.computeUnit(72), computeValue.computeUnit(280.35f), computeValue.computeUnit(70)));}// 添加发票章图片./Images/fapiaozhang.pngImage stamp = new Image(ImageDataFactory.Create(System.IO.Path.Combine(_model.webHost, "images", "fapiaozhang.png"))).SetWidth(computeValue.computeUnit(28)).SetHeight(computeValue.computeUnit(20));canvas.Add(stamp.SetFixedPosition(1, computeValue.computeUnit(92), computeValue.computeUnit(269)));#endregion#region 票头右上角信息// 发票号码:Paragraph invoiceInfo_Num = new Paragraph().Add("发票号码:").SetFont(KT).SetFontSize(9).SetFontColor(customColor).SetTextAlignment(TextAlignment.LEFT);canvas.Add(invoiceInfo_Num.SetFixedPosition(computeValue.computeUnit(155), computeValue.computeUnit(280.65f), computeValue.computeUnit(19.06f)));Paragraph invoiceInfo_Numc = new Paragraph().Add(_model.fphm).SetFont(ST).SetFontSize(9).SetTextAlignment(TextAlignment.LEFT);canvas.Add(invoiceInfo_Numc.SetFixedPosition(computeValue.computeUnit(170), computeValue.computeUnit(280.65f), computeValue.computeUnit(33.36f)));// 开票日期:Paragraph invoiceInfo_Date = new Paragraph().Add("开票日期: ").SetFont(KT).SetFontSize(9).SetFontColor(customColor).SetTextAlignment(TextAlignment.LEFT);canvas.Add(invoiceInfo_Date.SetFixedPosition(computeValue.computeUnit(155), computeValue.computeUnit(274.5f), computeValue.computeUnit(19.06f)));Paragraph invoiceInfo_Datec = new Paragraph().Add(_model.kprq.ToString("yyyy年MM月dd日")).SetFont(ST).SetFontSize(9).SetTextAlignment(TextAlignment.LEFT);canvas.Add(invoiceInfo_Datec.SetFixedPosition(computeValue.computeUnit(170), computeValue.computeUnit(274.5f), computeValue.computeUnit(33.36f)));#endregion#endregion#region 购买方信息//添加表格Table HeadTable = new Table(4, false);Cell cel01 = new Cell(1, 1).SetTextAlignment((TextAlignment)TextAlignment.CENTER).SetWidth(computeValue.computeUnit(6)).SetHeight(computeValue.computeUnit(22)).Add(new Paragraph("购买方信息").SetFixedLeading(12).SetFontColor(customColor).SetFont(KT).SetFontSize(9).SetFontColor(customColor));Cell cel02 = new Cell(1, 1).SetTextAlignment(TextAlignment.LEFT).SetVerticalAlignment(VerticalAlignment.MIDDLE).SetWidth(computeValue.computeUnit(94.5f)).SetHeight(computeValue.computeUnit(22)).Add(new Paragraph("名称:").SetFontColor(customColor).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Text(_model.gmfmc).SetFontSize(10).SetFont(ST).SetFontColor(ColorConstants.BLACK))).Add(new Paragraph("统一社会信用代码/纳税人识别号:").SetFontColor(customColor).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Text(_model.gmfnsrsbh).SetFontSize(10).SetFont(ST).SetFontColor(ColorConstants.BLACK)));Cell cel03 = new Cell(1, 1).SetTextAlignment(TextAlignment.CENTER).SetWidth(computeValue.computeUnit(6)).SetHeight(computeValue.computeUnit(22)).Add(new Paragraph("销售方信息").SetFixedLeading(12).SetFontColor(customColor).SetFont(KT).SetFontSize(9).SetFontColor(customColor));Cell cel04 = new Cell(1, 1).SetTextAlignment(TextAlignment.LEFT).SetVerticalAlignment(VerticalAlignment.MIDDLE).SetWidth(computeValue.computeUnit(94.5f)).SetHeight(computeValue.computeUnit(22)).Add(new Paragraph("名称:").SetFontColor(customColor).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Text(_model.xsfmc).SetFontSize(10).SetFont(ST).SetFontColor(ColorConstants.BLACK))).Add(new Paragraph("统一社会信用代码/纳税人识别号:").SetFontColor(customColor).SetFont(KT).SetFontSize(9).SetFontColor(customColor).Add(new Text(_model.xsfnsrsbh).SetFontSize(10).SetFont(ST).SetFontColor(ColorConstants.BLACK)));HeadTable.AddCell(cel01.SetBorder(new SolidBorder(customColor, 1)));HeadTable.AddCell(cel02.SetBorder(new SolidBorder(customColor, 1)));HeadTable.AddCell(cel03.SetBorder(new SolidBorder(customColor, 1)));HeadTable.AddCell(cel04.SetBorder(new SolidBorder(customColor, 1)));canvas.Add(HeadTable.SetFixedPosition(computeValue.computeUnit(4.5f), computeValue.computeUnit(243), computeValue.computeUnit(201)));#endregion// 添加页脚页码//if (pdfDoc.GetNumberOfPages() > 1)//{//    #region 页眉//    Paragraph p = new Paragraph("共" + pdfDoc.GetNumberOfPages() + "页 第" + pdfDoc.GetPageNumber(page) + "页")//    .SetFontSize(9)//    .SetFont(ST)//    .SetFixedPosition(computeValue.computeUnit(186), computeValue.computeUnit(266.5f), computeValue.computeUnit(141));//    canvas.Add(p);//    #endregion//}//canvas.Add(p);canvas.Close();}
}

完成!(创作不易,点赞鼓励_

相关文章:

  • 多种异构数据的分析设计方案1:使用策略模式+函数式接口
  • 微服务项目雪崩的解决思路
  • 【吉林大学Java程序设计】第7章:对象的容纳
  • 了解Java的LinkedBlockingQueue
  • 什么是模板字符串?
  • Mathf.Approximately
  • grafana连接influxdb2.x做数据大盘
  • 深入学习html的步骤
  • 重磅新闻!狂揽120台订单!大运重卡唐山销服一体运营店盛大开业
  • nginx脚本原理if指令实现详解
  • Apache Doris 基础 -- 数据表设计(分层存储)
  • js原型链原理与查找机制
  • 2024年十大数据集成工具和软件应用场景解析
  • 将Typora中图片从指定路径移动到当前文件夹下(准确位置为:XX.md文件所在目录/XX.assets/)
  • 如何正确操作工业高温烤箱
  • “大数据应用场景”之隔壁老王(连载四)
  • 「面试题」如何实现一个圣杯布局?
  • 2017-08-04 前端日报
  • EOS是什么
  • java小心机(3)| 浅析finalize()
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • PV统计优化设计
  • React中的“虫洞”——Context
  • REST架构的思考
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 离散点最小(凸)包围边界查找
  • 微服务入门【系列视频课程】
  • 异常机制详解
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #微信小程序(布局、渲染层基础知识)
  • #微信小程序:微信小程序常见的配置传值
  • (5)STL算法之复制
  • (a /b)*c的值
  • (C语言)fgets与fputs函数详解
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (转)C#调用WebService 基础
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET MVC第三章、三种传值方式
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .net/c# memcached 获取所有缓存键(keys)
  • .net中应用SQL缓存(实例使用)
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • /proc/vmstat 详解
  • @hook扩展分析
  • [ 转载 ] SharePoint 资料
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [bzoj 3534][Sdoi2014] 重建
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [c#基础]值类型和引用类型的Equals,==的区别