.NET Spire.Pdf手写PDF文件
一.需求场景
需求的场景是这样的:某三方接口方与我们接口进行对接,对接流程是他们发起预约请求我们接受预约然后一系列正常流程到最会我们系统结账的时候需要生产一个PDF文件提供给第三方下载.意思就是在我们系统结账成功之后就要异步生成一个PDF文件保存在存储桶里面让第三方可以随时下载PDF文件.
二.理论实现方案
- 整理word文档使用替换字符实现.(功能模块的数据接口为动态数据并且为多级嵌套数据使用替换模式不好处理数据在文档中显示,并且Word转PDF会有水印,无水印版需服务不符合国情.功能简单的word转pdf可参考:https://www.cnblogs.com/yunfeifei/p/4520414.html)
- 直接创建PDF文件手写,技术选型使用Spire.Pdf创建PDF文件并写入内容.由于PDF文件无法像Word文件那样直接创建段落进行数据填充所以我们的实现方案是将整个PDF文件画成表格然后将框线去掉来达到想要实现的PDF文件样式.这样操作相对来说比较麻烦的就是画表格需要考虑的样式有点像前端画页面一样.
三.具体实现
1. NuGet包引用Spire.Pdf包文件.注意Spire.Pdf为付费后引用包未付费情况下使用生成PDF后会有水印每页顶部都会有FreeSpier.PDF为免费试用版生成PDF前10页是没有水印的详细可以到他们官网查询:https://www.e-iceblue.cn/Introduce/Free-Spire-PDF-NET.html
2.新建实体类WritePdf.cs
2.1.整理公共表格样式
#region 表格样式 /// <summary> /// 无框线 /// </summary> private static PdfBorders Noborders = new PdfBorders() { All = new PdfPen(PdfBrushes.Transparent) }; /// <summary> /// 全框线白色 /// </summary> private static PdfBorders Whiteborders = new PdfBorders() { All = new PdfPen(Color.White, 0f) }; /// <summary> /// 全框线灰色 /// </summary> private static PdfBorders Grayborders = new PdfBorders() { All = new PdfPen(Color.Black, 0.5f) }; /// <summary> /// 左框线 /// </summary> private static PdfBorders Leftborders = new PdfBorders() { Left = new PdfPen(Color.Black, 0.5f) }; /// <summary> /// 右框线 /// </summary> private static PdfBorders Rightborders = new PdfBorders() { Right = new PdfPen(Color.Black, 0.5f) }; /// <summary> /// 顶部框线 /// </summary> private static PdfBorders Topborders = new PdfBorders() { Top = new PdfPen(Color.Black, 0.5f) }; /// <summary> /// 底部框线 /// </summary> private static PdfBorders BottomBorders = new PdfBorders() { Bottom = new PdfPen(Color.Black, 0.5f) }; /// <summary> /// 标题样式 /// </summary> private static PdfTrueTypeFont fontTitle = new PdfTrueTypeFont(new Font("宋体", 10F), true); /// <summary> /// 内容样式 /// </summary> private static PdfTrueTypeFont fontContent = new PdfTrueTypeFont(new Font("宋体", 9F), true); /// <summary> /// 左对齐 /// </summary> private static PdfStringFormat LeftStringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle); /// <summary> /// 居中 /// </summary> private static PdfStringFormat CenterStringFormat = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle); /// <summary> /// 右对齐 /// </summary> private static PdfStringFormat RightStringFormat = new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Middle); /// <summary> /// 表格列数 /// </summary> private static int Columns = 4; /// <summary> /// 表格宽度 /// </summary> private static float ColumnsWidth = 120f; /// <summary> /// 洗护图片大小 /// </summary> private static SizeF imageSize = new SizeF(60, 60); /// <summary> /// logo图片大小 /// </summary> private static SizeF logoImageSize = new SizeF(30, 30); /// <summary> /// 文件路径 /// </summary> private static string FilePath = String.Empty; #endregion
2.2创建生成PDF方法WriteGeneratePDF
public static bool WriteGeneratePDF(T t) { #region 创建当前报告文件夹 var FileName = Guid.NewGuid().AsStrN(); if (!Directory.Exists($"{Directory.GetCurrentDirectory()}\\File")) { Directory.CreateDirectory($"{Directory.GetCurrentDirectory()}\\File"); } FilePath = $"{Directory.GetCurrentDirectory()}\\File\\{FileName}"; Directory.CreateDirectory(FilePath); #endregion using (PdfDocument pdf = new PdfDocument()) { #region 创建表格 //添加新页 PdfPageBase page = pdf.Pages.Add(PdfPageSize.A4); //创建一个PDF表格 PdfGrid grid = new PdfGrid(); //设置表格的单元格内容和边框之间的上、下边距 grid.Style.CellPadding.Top = 5f; grid.Style.CellPadding.Bottom = 5f; //添加列,并设置列宽 grid.Columns.Add(Columns); for (int i = 0; i < Columns; i++) { grid.Columns[i].Width = ColumnsWidth; } #endregion #region 创建PDF文档 grid.Draw(page, new PointF(30f, 20f)); string pdffile = @$"{FilePath}\.pdf"; pdf.SaveToFile(pdffile); bool bo = File.Exists(pdffile); #endregion return bo; } }
2.3提公写入内容方法
/// <summary> /// 添加内容 /// </summary> /// <param name="row">当前行</param> /// <param name="Content">插入内容</param> /// <param name="PositionCells">从第几列插入</param> /// <param name="MergeNum">合并几列</param> /// <param name="pdfStringFormat">内容对齐样式</param> /// <param name="pdfTrueType">内容字体大小样式</param> /// <param name="pdfBorders">框线样式</param> /// <param name="pdfBrush">背景颜色</param> public static void gridAddContentRow(PdfGridRow row, string Content, int PositionCells, int MergeNum, PdfStringFormat pdfStringFormat, PdfTrueTypeFont pdfTrueType, PdfBorders pdfBorders, PdfBrush pdfBrush = null) { row.Cells[PositionCells].Value = Content; row.Cells[PositionCells].StringFormat = pdfStringFormat; row.Cells[PositionCells].Style.Font = pdfTrueType; row.Cells[PositionCells].Style.Borders = pdfBorders; row.Cells[PositionCells].Style.BackgroundBrush = pdfBrush; if (MergeNum > 0) { row.Cells[PositionCells].ColumnSpan = MergeNum; } }
使用时
PdfGridRow rowProblem = grid.Rows.Add();//创建新行 gridAddContentRow(rowProblem, $"{要写入内容}", 0, 0, LeftStringFormat, fontContent, Grayborders);