C# 使用iText 编辑PDF

devtools/2025/1/12 19:19:23/

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/devtools/149535.html

相关文章

蓝桥杯历届真题 #分布式队列 (Java,C++)

文章目录 题目解读[蓝桥杯 2024 省 Java B] 分布式队列题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路完整代码 题目解读 题目链接 [蓝桥杯 2024 省 Java B] 分布式队列 题目描述 小蓝最近学习了一种神奇的队列&#xff1a;分布式队列。简单来说&#x…

阿里云人工智能平台图像视频特征提取

引言 在人工智能和计算机视觉领域&#xff0c;特征提取是图像与视频分析的核心环节&#xff0c;它关乎后续任务的准确性和效率。借助先进的特征提取技术&#xff0c;我们可以从海量的图像与视频数据中挖掘出有价值的信息&#xff0c;为图像分类、目标检测、视频推荐等应用场景…

RabbitMQ解决消息积压的方法

目录 减少发送mq的消息体内容 增加消费者数量 批量消费消息 临时队列转移 监控和预警机制 分阶段实施 最后还有一个方法就是开启队列的懒加载 这篇文章总结一下自己知道的解决消息积压得方法。 减少发送mq的消息体内容 像我们没有必要知道一个的中间状态&#xff0c;只需…

谷歌Google、紫鸟浏览器插件开发

对于跨境电商行业的IT部门来说&#xff0c;经常需要获取各种店铺相关数据&#xff0c;但是仅靠官方提供的接口来获取数据远远不够&#xff0c;这个时候我们就需要插件或者RPA的方式来获取数据。 以下是关于自研紫鸟插件的简单demo&#xff0c;紫鸟浏览器使用的是火狐和谷歌的插…

【人工智能】自然语言生成的前沿探索:利用GPT-2和BERT实现自动文本生成与完形填空

自然语言生成&#xff08;Natural Language Generation, NLG&#xff09;是人工智能领域的重要研究方向&#xff0c;旨在通过计算机系统自动生成连贯、符合语法和语义的自然语言文本。近年来&#xff0c;预训练语言模型如GPT-2和BERT在NLG任务中取得了显著的成果。本文深入探讨…

Go 中的单引号 (‘)、双引号 (“) 和反引号 (`)

在 Go 中&#xff0c;单引号 ()、双引号 (") 和反引号 () 都有不同的用途和含义&#xff0c;具体如下&#xff1a; 1. 单引号 () 单引号用于表示 字符字面量&#xff08;单个字符&#xff09;。在 Go 中&#xff0c;字符是一个单独的 Unicode 字符&#xff0c;并且它的类…

【Spring Boot 应用开发】-04 自动配置-数据源

深入讲解 Spring Boot 自动配置中的数据源配置 为了更好地理解 Spring Boot 中的自动配置机制&#xff0c;我们以数据源配置机制为例&#xff0c;按照以下顺序进行讲解&#xff1a; 不使用任何框架来连接数据源的方式使用 Spring MVC 连接数据源的方式使用 Spring Boot 自动配…

深度求索的新突破——DeepSeek-V3

在人工智能领域不断发展的浪潮中&#xff0c;DeepSeek-V3的出现犹如一颗璀璨的新星&#xff0c;引起了广泛的关注和热议 DeepSeek-V3是由杭州深度求索人工智能基础技术研究有限公司于2024年12月26日发布的混合专家&#xff08;MoE&#xff09;语言模型 官网&#xff1a;https…