C# 使用iText 编辑PDF

embedded/2025/1/11 6:17:57/

NetCore 创建、编辑PDF插入表格、图片、文字
NetCore 创建、编辑PDF插入表格、图片、文字(二)
NetCore 创建、编辑PDF插入表格、图片、文字(三)

1,.net8 环境,引入 包
itext7
itext7.bouncy-castle-adapter
2,直接上代码

   public class PDFEditor{public static void ExportFile(string outputPath, PDFEditorPdfModle m){// 创建PDF文档using (PdfWriter writer = new PdfWriter(outputPath)){using (PdfDocument pdf = new PdfDocument(writer)){iText.Layout.Document document = new iText.Layout.Document(pdf);// 加载支持中文的字体文件(例如:微软雅黑)string fontPath = @"Fonts\msyh.ttf"; // 字体文件路径PdfFont chineseFont = PdfFontFactory.CreateFont(fontPath, PdfEncodings.IDENTITY_H);// 创建页头表格Table headerTable = new Table(new float[] { 1, 1 }) // 两列,宽度均分.UseAllAvailableWidth() // 使用全部可用宽度.SetMarginTop(0).SetMarginBottom(1); // 设置下边距// 第一列:左边写10个汉字,居左对齐Cell leftCell = new Cell().Add(new Paragraph("红外热成像检测报告").SetFont(chineseFont) // 设置中文字体.SetTextAlignment(TextAlignment.LEFT)) // 居左对齐.SetBorder(Border.NO_BORDER); // 隐藏单元格边框// 第二列:右边写10个汉字,居右对齐Cell rightCell = new Cell().Add(new Paragraph($"检测机构: {m.HospitalName}").SetFont(chineseFont) // 设置中文字体.SetTextAlignment(TextAlignment.RIGHT)) // 居右对齐.SetBorder(Border.NO_BORDER); // 隐藏单元格边框// 将单元格添加到表格中headerTable.AddCell(leftCell);headerTable.AddCell(rightCell);// 将页头表格添加到文档中document.Add(headerTable);Text spaceText = new Text("   "); // 空格Text nameText = new Text(@"姓名:  "); // 正常文本Text nameTextVal = new Text($@"  {m.Name}    "); // 正常文本nameTextVal.SetUnderline(1f,-5f);Text sexText = new Text(@"性别:  "); //  Text sexTextVal = new Text($@"  {m.Sex}    "); //  sexTextVal.SetUnderline(1f,-5f);Text ageText = new Text(@"年龄:  "); //  Text ageTextVal = new Text($@"  {m.Age}    "); //  ageTextVal.SetUnderline(1f,-5f);Text dateText = new Text(@"检查日期:  "); //  Text dateTextVal = new Text($@"  {m.Date}    "); //  dateTextVal.SetUnderline(1f,-5f);Text departmentText = new Text(@"科室:  "); //  Text departmentTextVal = new Text($@"  {m.Department}    "); //  departmentTextVal.SetUnderline(1f,-5f);// 添加文字Paragraph paragraph = new Paragraph( ).Add(nameText).Add(nameTextVal).Add(spaceText).Add(sexText).Add(sexTextVal).Add(spaceText).Add(ageText).Add(ageTextVal).Add(spaceText).Add(dateText).Add(dateTextVal).Add(spaceText).Add(departmentText).Add(departmentTextVal).SetFont(chineseFont) // 设置中文字体.SetTextAlignment(TextAlignment.LEFT).SetFontSize(11).SetMarginTop(16); // 设置上边距document.Add(paragraph);document.Add(new Paragraph("热图所见:").SetFont(chineseFont) // 设置中文字体.SetTextAlignment(TextAlignment.LEFT).SetFontSize(14).SetMarginTop(20));// 定义图片宽度和高度float imageWidth = 150; // 图片宽度float imageHeight = 200; // 图片高度// 创建一个2行2列的表格,设置列宽为图片宽度//Table table = new Table(new float[] { imageWidth, imageWidth }) // 两列,每列宽度为图片宽度//    .UseAllAvailableWidth(); // 不使用全部可用宽度List<float> tableColWidth = new List<float>();tableColWidth.Add(1f);if (m.Images.Count > 1)tableColWidth.Add(1f);Table table = new Table(tableColWidth.ToArray()).SetMarginBottom(10)// 设置下边距.UseAllAvailableWidth();table.SetBorder(Border.NO_BORDER);  // 隐藏表格线for (int i = 0; i < m.Images.Count; i++){string imagePath = m.Images[i]; // 图片路径,假设图片名为 sample1.jpg, sample2.jpg, 等等ImageData imageData = ImageDataFactory.Create(imagePath);iText.Layout.Element.Image image = new iText.Layout.Element.Image(imageData).SetWidth(imageWidth) // 设置图片宽度.SetHeight(imageHeight); // 设置图片高度// 创建一个 Paragraph 包裹图片,并设置对齐方式Paragraph imageParagraph = new Paragraph().Add(image).SetTextAlignment(i % 2 == 1 ? TextAlignment.LEFT : TextAlignment.RIGHT); // 第一列居右,第二列居左   if (m.Images.Count == 1){imageParagraph.SetTextAlignment(TextAlignment.CENTER);}// 将图片添加到单元格中Cell cell = new Cell().Add(imageParagraph).SetBorder(Border.NO_BORDER); //table.AddCell(cell);}// 创建一个 Div 容器,用于居中表格Div div = new Div().SetTextAlignment(TextAlignment.CENTER) // 设置内容居中.SetWidth(UnitValue.CreatePercentValue(100)) // 设置 Div 宽度占满页面//.SetBorder(new SolidBorder(ColorConstants.BLACK, 1)) // 设置 Div 边框.SetPadding(10) // 设置 Div 内边距.Add(table); // 将表格添加到 Div 中// 将 Div 添加到文档中document.Add(div);document.Add(new Paragraph("检查描述:").SetFont(chineseFont) // 设置中文字体.SetTextAlignment(TextAlignment.LEFT).SetFontSize(14).SetMarginTop(20));document.Add(new Paragraph(m.CheckDescription).SetFont(chineseFont) // 设置中文字体.SetTextAlignment(TextAlignment.LEFT).SetFontSize(9).SetMarginTop(10));document.Add(new Paragraph("分析结论:").SetFont(chineseFont) // 设置中文字体.SetTextAlignment(TextAlignment.LEFT).SetFontSize(14).SetMarginTop(20));document.Add(new Paragraph().Add(new Text(m.ConclusionAndAnalysis)).SetFont(chineseFont) // 设置中文字体.SetTextAlignment(TextAlignment.LEFT).SetFontSize(9).SetMarginTop(10));document.Add(new Paragraph($"报告时间:{m.Datetime}   检查医师:{m.DoctorName}    审核医师:").SetFont(chineseFont) // 设置中文字体.SetTextAlignment(TextAlignment.LEFT).SetFontSize(11).SetMarginTop(20));// 关闭文档document.Close();}}}public class PDFEditorPdfModle{public PDFEditorPdfModle(){Images = new List<string>();}public string HospitalName { get; set; }public string Name { get; set; }public int Age { get; set; }public string Sex { get; set; }public string Date { get; set; }public string Datetime { get; set; }public string Department { get; set; }public string CheckDescription { get; set; }public string ConclusionAndAnalysis { get; set; }public string DoctorName { get; set; }public List<string> Images { get; set; }}}

http://www.ppmy.cn/embedded/152929.html

相关文章

如何解决Redis中的热点key问题

Redis中的热点Key问题是指某些特定的Key被频繁访问&#xff0c;导致Redis中某个节点&#xff08;或实例&#xff09;承担过高的压力&#xff0c;可能引发性能瓶颈&#xff0c;甚至若缓存承受不住服务压力挂掉后&#xff0c;仍有大量请求时直接打到DB上&#xff0c;由于DB层相对…

JVM实战—OOM的生产案例

1.每秒仅上百请求的系统为何会OOM(RPC超时时间设置过长导致QPS翻几倍) (1)案例背景 在这个案例中&#xff0c;一个每秒仅仅只有100请求的系统却因频繁OOM而崩溃。这个OOM问题会涉及&#xff1a;Tomcat底层工作原理、Tomcat内核参数的设置、服务请求超时时间。 (2)系统发生OOM的…

fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权

已解决 fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权 没有声明内容协议导致的 微信公众平台&#xff1a;https://mp.weixin.qq.com/【1.左下角的-移动过去后会出现 “帐号设置”】 【2.基本设置->服务内容声明->修…

Go语言的面向对象接口说明及代码示例

Go语言的面向对象接口说明及代码示例 Go语言虽然不是传统意义上的面向对象语言&#xff0c;但它通过接口(interface)提供了一种优雅的方式来实现面向对象编程的多态特性。本文将详细介绍Go语言接口的概念和使用方法。 1. 接口的基本概念 在Go语言中&#xff0c;接口是一种类…

android studio使用DataBinding

DataBinding 是谷歌官方发布的在android上对MVVM设计模式的一个实现框架&#xff0c;其作用是实现数据绑定。 Android DataBinding主要实现了View和ViewModel的双向绑定&#xff0c;包括用户的响应。并且实现了自动更新。 DataBinding优点&#xff1a; 1.大量减少Act…

如何学习Vue设计模式

如何学习Vue设计模式 Vue 设计模式是 Vue.js 框架中用于解决常见问题的可复用解决方案。这些模式帮助开发者更有效地组织和管理代码&#xff0c;提升代码的可维护性、可扩展性和可读性。以下是一些常见的 Vue 设计模式&#xff1a; 1. 数据存储模式 可组合函数&#xff1a;用…

HAMi + prometheus-k8s + grafana实现vgpu虚拟化监控

最近长沙跑了半个多月&#xff0c;跟甲方客户对了下项目指标&#xff0c;许久没更新 回来后继续研究如何实现 grafana实现HAMi vgpu虚拟化监控&#xff0c;毕竟合同里写了需要体现gpu资源限制和算力共享以及体现算力卡资源共享监控 先说下为啥要用HAMi吧&#xff0c; 一个重要原…

MySQL8 主从同步 在 Windows 本地 MySQL 和 WSL 上安装的 MySQL 做主从同步

在 Windows 本地 MySQL 和 WSL(Windows Subsystem for Linux)上安装的 MySQL 做主从同步,步骤主要分为几个部分:安装和配置 MySQL、设置主从同步、配置网络和防火墙等。以下是步骤的详细说明: 1. 在 Windows 和 WSL 中安装 MySQL 首先,确保 Windows 和 WSL 中的 MySQL …