using Aspose.Words;
using Aspose.Words.Tables;
using Aspose.Words.Drawing;
using SkiaSharp;
using static System.Net.Mime.MediaTypeNames;
using ErrorAnalysis.Service.Model;
using System.Drawing;
namespace ErrorAnalysis.Service
{
public class WordReportHelper
{
///
/// 报告类型枚举值pdf和word
///
public enum ReportType
{
Pdf,
Word
}
///
/// 静态构造函数
///
static WordReportHelper()
{
new License().SetLicense(new MemoryStream(Convert.FromBase64String("PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZWxvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pdGVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4yMDA2MDIwMTI2MzM8L09yZGVySUQ+CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+OTM2ZTVmZDEtODY2Mi00YWJmLTk1YmQtYzhkYzBmNTNhZmE2PC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0aW9uRXhwaXJ5PjIwMjEwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnNlVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT5wSkpjQndRdnYxV1NxZ1kyOHFJYUFKSysvTFFVWWRrQ2x5THE2RUNLU0xDQ3dMNkEwMkJFTnh5L3JzQ1V3UExXbjV2bTl0TDRQRXE1aFAzY2s0WnhEejFiK1JIWTBuQkh1SEhBY01TL1BSeEJES0NGbWg1QVFZRTlrT0FxSzM5NVBSWmJRSGowOUNGTElVUzBMdnRmVkp5cUhjblJvU3dPQnVqT1oyeDc4WFE9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4=")));
}
public static bool Create(string outPath, ReportModel model, ReportType reportType = ReportType.Pdf)
{
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Template", "JobPlanReportTemp.docx");
Document doc = new Document(filePath);
var section = doc.FirstSection;
var tables = section.Body.Tables;
foreach (Table table in tables) SetContentTable(doc, table, model);
section.Body.Paragraphs.RemoveAt(section.Body.Paragraphs.Count - 1);
DocumentBuilder builder = new DocumentBuilder(doc);
var lastSection = doc.LastSection;
var pageWidth = lastSection.PageSetup.PageWidth - lastSection.PageSetup.LeftMargin - lastSection.PageSetup.RightMargin;
builder.MoveToSection(doc.IndexOf(lastSection));
builder.MoveToDocumentEnd();
var coImg = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "co.png");
var erImg = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "er.png");
AddImageToDocument(builder, pageWidth, coImg);
var para = builder.InsertParagraph();
var run = new Run(doc);
para.ParagraphFormat.Alignment = ParagraphAlignment.Left;
run.Font.Bold = true;
run.Font.Size = 14;
run.Text = "ERROR RATE PLOT";
para.AppendChild(run);
AddImageToDocument(builder, pageWidth, erImg);
doc.Save(outPath, reportType == ReportType.Word ? SaveFormat.Docx : SaveFormat.Pdf);
return true;
}
///
/// 设置内容表格
///
/// 文档
/// 表格
/// 模型
private static void SetContentTable(Document doc, Table table, object model)
{
var properties = model?.GetType().GetProperties();
foreach (Row row in table.Rows)
{
var cells = row.Cells;
foreach (Cell cell in cells)
{
var cellText = cell.GetText().Replace(ControlChar.Cell, "").Replace(ControlChar.ParagraphBreak, "");
if (cellText.StartsWith("$"))
{
var name = cellText.Trim().Replace("$", "");
var property = properties.FirstOrDefault(p => p.Name == name);
if (property != null)
{
var valStr = property.GetValue(model).ToString();
var run = new Run(doc, valStr);
if (name == "Pass" || name == "Speed" || name == "Duration")
run.Font.Color = Color.Red; run.Font.Bold = true;
cell.FirstParagraph.RemoveAllChildren();
cell.FirstParagraph.AppendChild(run);
cell.FirstParagraph.ParagraphFormat.Alignment = ParagraphAlignment.Right;
}
}
}
}
}
///
/// 向文档中添加图像。
///
/// 文档构建器。
/// 页面宽度。
/// 图像路径。
private static void AddImageToDocument(DocumentBuilder builder, double pageWidth, string imagePath)
{
using (FileStream picStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
{
SKBitmap image;
using (var skData = SKData.Create(picStream))
{
image = SKBitmap.Decode(skData);
}
int originalWidth = image.Width;
int originalHeight = image.Height;
int height = (int)(originalHeight * (pageWidth / originalWidth));
picStream.Seek(0, SeekOrigin.Begin);
builder.InsertImage(image, pageWidth, height);
}
}
}
}