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

iText7画发票PDF——小tips

itext7教程:

1、https://blog.csdn.net/allway2/article/details/124295097
2、https://max.book118.com/html/2017/0720/123235195.shtm
3、https://www.cnblogs.com/fonks/p/15090635.html
4、https://www.cnblogs.com/sky-chen/p/13026203.html
5、官方:https://api.itextpdf.com/iText/dotnet/8.0.2/classi_text_1_1_layout_1_1_splitting_1_1_keep_all_split_characters.html
6、git:https://github.com/itext/itext7-dotnet

1.毫米转换磅
itext中是用磅值作为像素位置点的。为方便画PDF,则需要把常规毫米转换成磅值;
转换规则:毫米/10/2.54f*72

2.添加每页的固定表头
(给pdf添加AddEventHandler)

  • 创建类PdfEventHandler
    (在PdfEventHandler中将每页要重复的部分画进去。)
PdfEventHandler handler = new PdfEventHandler(model, KT, ST, CN);//
  • pdf增加Event,将创建的类新增到pdf中:
pdf.AddEventHandler(PdfDocumentEvent.START_PAGE, handler);

3.金额转换成中文大写金额

 /// <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"));}}

4、画双横线
在这里插入图片描述

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();

5、创作二维码

//设置扫描二维码后显示的文字或内容
string code = $"01,{发票票种model},," + 发票号码model + "," + 价税合计model + "," + DateTime.Parse(开票日期model).ToString("yyyyMMdd") + ",,";
//将code与转换为CRC16编码后的字节链接
code = code + CRC16(System.Text.Encoding.UTF8.GetBytes(code));
//将链接好的字符串转换为二维码字节
model.qrCode = GetQrCode(code);//model.qrCode为byte[]类型
//在Canvas中添加动态二维码(具体实现可参考下一篇笔记(iText7——画发票PDF(完整)))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("E://图片//发票图片//Shui.png")).SetWidth(computeValue.computeUnit(4)).SetHeight(computeValue.computeUnit(4));
canvas.Add(S.SetFixedPosition(1, computeValue.computeUnit(15), computeValue.computeUnit((float)279)));/// <summary>
/// CRC16编码
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static string CRC16(byte[] data)
{ushort crc = 0xFFFF;int len = data.Length;for (int i = 0; i < len; i++){crc = (ushort)((crc >> 8) ^ data[i]);for (int j = 0; j < 8; j++)crc = (crc & 1) == 1 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);}return string.Format("{0:X}", crc).PadLeft(4, '0');
}/// <summary>
/// 生成发票二维码
/// </summary>
/// <returns></returns>
private static byte[] GetQrCode(string codeValue)
{// 设定二维码大小QrCodeEncodingOptions qrCode = new QrCodeEncodingOptions();qrCode.ErrorCorrection = ErrorCorrectionLevel.M;qrCode.CharacterSet = "UTF-8";qrCode.Height = 180;qrCode.Width = 180;qrCode.Margin = 1;// 生成二维码BarcodeWriter writer = new BarcodeWriter();writer.Format = BarcodeFormat.QR_CODE;writer.Options = qrCode;writer.Options.PureBarcode = true; // 不显示条码下面的数据Bitmap bitmap = writer.Write(codeValue);MemoryStream ms = new MemoryStream();bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);byte[] arr = new byte[ms.Length];ms.Position = 0;ms.Read(arr, 0, (int)ms.Length);ms.Close();return arr;
}

相关文章:

  • QT:day1
  • Java:111-SpringMVC的底层原理(中篇)
  • 热门开源项目ChatTTS: 国内语音技术突破,实现弯道超车
  • WPF/C#:异常处理
  • 如何使用new和delete操作符进行动态内存分配和释放?
  • 《C语言》文件操作
  • 细说MCU修改回调函数调用模式的方法
  • 爬虫可以不必自己写,使用ChatGPT编写抓取电影评论数据脚本
  • leetcode198 打家劫舍
  • VBA实现关闭Excel自动计算,关闭屏幕刷新
  • 我的创作纪念日(1825天)
  • OrangePi AIpro小试牛刀-目标检测(YoloV5s)
  • docker 容器 network host 模式启动
  • 揭开 Docker 容器的神秘面纱:深入理解容器原理
  • vue3+ele-plus+sortableJs对el-table使用sortableJs插件对表格拖拽时限定某列或某行不允许拖拽
  • chrome扩展demo1-小时钟
  • EventListener原理
  • HTTP请求重发
  • javascript面向对象之创建对象
  • Logstash 参考指南(目录)
  • NSTimer学习笔记
  • php的插入排序,通过双层for循环
  • Python学习笔记 字符串拼接
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 记一次删除Git记录中的大文件的过程
  • 简单基于spring的redis配置(单机和集群模式)
  • 蓝海存储开关机注意事项总结
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何在 Tornado 中实现 Middleware
  • 深度学习在携程攻略社区的应用
  • 双管齐下,VMware的容器新战略
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 【云吞铺子】性能抖动剖析(二)
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • $ git push -u origin master 推送到远程库出错
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (30)数组元素和与数字和的绝对差
  • (pojstep1.3.1)1017(构造法模拟)
  • (八)c52学习之旅-中断实验
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • *Django中的Ajax 纯js的书写样式1
  • ./configure、make、make install 命令
  • .gitignore
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core跨平台微服务学习资源
  • .NET 快速重构概要1
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET分布式缓存Memcached从入门到实战