C# 使用iText 编辑PDF
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; }
}
}