/// <summary> /// Возвращает заполненный шаблон дня и список используемых картинок для вставки в итоговый документ /// </summary> /// <param name="dayRep"></param> /// <param name="typiconId"></param> /// <param name="day"></param> /// <returns></returns> private Result <GetDayTemplateResponse> GetFilledDayElements(PrintTemplateRepository dayRep, int typiconId, FilteredOutputDay day) { var dayTemplate = dayRep.GetDayTemplate(typiconId, day.Header?.SignNumber); if (dayTemplate == null) { return(Result.Fail <GetDayTemplateResponse>($"Ошибка: печатный шаблон дня не был найден")); } //заменяем дату - обязательно var dateReplacement = dayTemplate.XmlElements.ReplaceElementsByText(OutputTemplateConstants.Date, day.Date.ToString("dd MMMM yyyy г.")); //заменяем день недели - не обязательно var dayOfWeekReplacement = dayTemplate.XmlElements.ReplaceElementsByText(OutputTemplateConstants.DayOfWeek, day.Date.ToString("dddd")); //заменяем имя дня - не обязательно string dayName = (day.Header != null) ? day.Header.Name.Text : string.Empty; var dayNameReplacement = dayTemplate.XmlElements.ReplaceElementsByText(OutputTemplateConstants.DayName, dayName); //вставляем службы var worshipsAppending = AppendWorships(dayTemplate.XmlElements, day.Worships); var res = Result.Combine(dateReplacement //, dayOfWeekReplacement //, dayNameReplacement , worshipsAppending); return((res.Success) ? Result.Ok(dayTemplate) : Result.Fail <GetDayTemplateResponse>(res.Error)); }
private Result <byte[]> PerformWork(int typiconId, FilteredOutputWeek week) { var weekTemplate = _queryProcessor.Process(new PrintWeekTemplateQuery(typiconId)); if (weekTemplate == null) { return(Result.Fail <byte[]>($"Печатный шаблон седмицы для Устава с Id={typiconId} не был найден.")); } using (MemoryStream stream = new MemoryStream()) { stream.Write(weekTemplate.PrintFile, 0, weekTemplate.PrintFile.Length); var errors = new StringBuilder(); using (WordprocessingDocument weekDoc = WordprocessingDocument.Open(stream, true)) { SetWeekName(weekDoc, week); var placeToPasteSchedule = weekDoc.MainDocumentPart.Document.Body .FindElementsByText(OutputTemplateConstants.DaysPlacement) .FirstOrDefault(); if (placeToPasteSchedule == null) { return(Result.Fail <byte[]>("Ошибка: в шаблоне седмицы не определено место для вставки дней.")); } //находим элемент, после которого можно вставлять шаблоны дней var parentToPasteSchedule = GetParentToPasteSchedule(placeToPasteSchedule); /*var */ parentToPasteSchedule = weekDoc.MainDocumentPart.Document.Body.LastChild; int d = week.Days.Count % weekTemplate.DaysPerPage; using (var dayRep = new PrintTemplateRepository(_queryProcessor)) { for (int i = week.Days.Count - 1; i >= 0; i--) { var day = week.Days[i]; var modDayTemplate = GetFilledDayElements(dayRep, typiconId, day); if (modDayTemplate.Success) { //добавляем в конечный документ ссылочные объекты (изображения) CopyRelativeElements(weekDoc, modDayTemplate.Value.DocumentPart, modDayTemplate.Value.XmlElements); foreach (var ins in modDayTemplate.Value.XmlElements) { parentToPasteSchedule.InsertAfterSelf(ins); //ins.CopyRelativeElements(weekDoc, modDayTemplate.Value.DocumentPart); } d--; if (d == 0 && i > 0) { //вставляем разрыв страницы parentToPasteSchedule.InsertAfterSelf(PageBreak); d = weekTemplate.DaysPerPage; } } else { errors.AppendLine(modDayTemplate.Error); } } } RemovePlaceToPaste(placeToPasteSchedule); weekDoc.MainDocumentPart.Document.Save(); weekDoc.Close(); } return((errors.Length == 0) ? Result.Ok(stream.ToArray()) : Result.Fail <byte[]>(errors.ToString())); } }