public byte[] Generate(LanguageShortName from, LanguageShortName to, HashSet <long> visualDictionariesIds) { var languagesQuery = new LanguagesQuery(from, to); UserLanguages userLanguages = languagesQuery.GetLanguagesByShortNames(from, to); var representationsQuery = new RepresentationsQuery(userLanguages.From.Id); List <RepresentationForUser> allRepresentations = representationsQuery.GetBought(userLanguages, visualDictionariesIds); PdfGenerator commonPdfGenerator = allRepresentations.Count > 1 ? new PdfGenerator(_fontPath, _domain, "Все визуальные словари") : null; var zipKey = GetZipKey(allRepresentations, @from, to); var result = _cache.Get(zipKey); if (result != null) { return(result); } var painter = new Painter(); var partImageCreator = new PartImageCreator(painter); foreach (RepresentationForUser representation in allRepresentations) { var tableData = new TableData(3, true); tableData.AddHeader(string.Empty, "Слово", "Перевод"); string title = representation.Title; /*if (pictureName != "Лицо" /*&& pictureName != "Человек"#1#) { * continue; * }*/ var byteStream = new MemoryStream(representation.Image); Image image = Image.FromStream(byteStream); var wordsWriter = new WordsWriter(painter, image.Width, image.Height); foreach (RepresentationAreaForUser area in representation.Areas) { Point leftCorner = area.LeftUpperCorner; Point rightCorner = area.RightBottomCorner; string partKey = representation.Id + "_part_" + area.Id + "_" + representation.SortInfo.LastModified.Ticks + "_" + from + "_" + to + ".jpeg"; byte[] partImageBytes = _cache.Get(partKey); if (partImageBytes == null) { PartImageData partImageData = partImageCreator.CutImage(leftCorner, rightCorner, image); partImageBytes = ImageToBytes(partImageData.Bitmap); WriteToCache(partKey, partImageBytes); } tableData.AddRow(new[] { TableDataCell.CreateImage(partImageBytes), TableDataCell.CreateText(area.Source.Text), TableDataCell.CreateText(area.Translation.Text) }); wordsWriter.AddRectangle(leftCorner, rightCorner, area); } string fullKey = representation.Id + "_" + representation.SortInfo.LastModified.Ticks + "_" + from + "_" + to + ".jpeg"; byte[] imageResult = _cache.Get(fullKey); if (imageResult == null) { Image imageWithSign = wordsWriter.GetImageWithSigns(image); imageResult = ImageToBytes(imageWithSign); WriteToCache(fullKey, imageResult); } var pdfFileName = title + ".pdf"; string pdfKey = representation.Id + "_" + representation.SortInfo.LastModified.Ticks + "_" + from + "_" + to + "_" + pdfFileName; byte[] pdfContent = _cache.Get(pdfKey); if (pdfContent == null) { var pdfGenerator = new PdfGenerator(_fontPath, _domain, string.Format( "Визуальный словарь на тему {0}", title)); WriteDataToPdf(pdfGenerator, title, imageResult, tableData); pdfContent = pdfGenerator.GetAsBytes(); WriteToCache(pdfKey, pdfContent); } _zipCompressor.AddFileToArchive(pdfFileName, pdfContent); if (commonPdfGenerator != null) { WriteDataToPdf(commonPdfGenerator, title, imageResult, tableData); commonPdfGenerator.NewPage(); } } if (commonPdfGenerator != null) { WritePdfToArchive(commonPdfGenerator, "Всё в одном файле.pdf"); } result = _zipCompressor.GetArchive(); WriteToCache(zipKey, result); return(result); }
public void Create(string fileName, string pathToImagePattern) { var csvReader = new CsvReader(fileName); var languages = new LanguagesQuery(LanguageShortName.Unknown, LanguageShortName.Unknown); Language from = languages.GetByShortName(_from); Language to = languages.GetByShortName(LanguageShortName.Ru); var representationsQuery = new RepresentationsQuery(from.Id); string[] line = csvReader.ReadLine(); if (line.Length < 1 || string.IsNullOrEmpty(line[0])) { Console.WriteLine("Некорректная первая строка в файле {0}!", fileName); return; } int imageIndex = 0; if (line.Length >= 2 && !string.IsNullOrEmpty(line[1])) { imageIndex = 1; } string imageFileName = string.Format(pathToImagePattern, line[imageIndex].Trim()); Image image = Image.FromFile(imageFileName); var memoryStream = new MemoryStream(); image.Save(memoryStream, ImageFormat.Jpeg); byte[] imageBytes = memoryStream.ToArray(); string visualDictionaryName = line[0]; byte?widthPercent = null; if (line.Length > 2) { byte w; if (byte.TryParse(line[2], out w) && w > 0 && w <= 100) { widthPercent = w; } } visualDictionaryName = char.ToUpper(visualDictionaryName[0]) + visualDictionaryName.Substring(1); var representationForUser = new RepresentationForUser(IdValidator.INVALID_ID, visualDictionaryName, imageBytes, new Size(image.Size.Width, image.Size.Height), widthPercent); bool hasErrors = false; do { line = csvReader.ReadLine(); if (line != null) { if (line.Length < 6) { hasErrors = true; break; } PronunciationForUser englishWord = CreateWordForUser(line[0], from); PronunciationForUser russianWord = CreateWordForUser(line[1], to); Point leftTopPoint = CreatePoint(line[2], line[3]); Point rightBottomPoint = CreatePoint(line[4], line[5]); if (englishWord == null || russianWord == null || leftTopPoint == null || rightBottomPoint == null) { hasErrors = true; break; } var representationArea = new RepresentationAreaForUser(IdValidator.INVALID_ID, leftTopPoint, rightBottomPoint) { Source = russianWord, Translation = englishWord }; representationForUser.AddArea(representationArea); } } while (line != null); if (hasErrors) { Console.WriteLine("В файле {0} возникли ошибки! Файл не будет сохранен", fileName); return; } RepresentationForUser savedRepresentation = representationsQuery.GetOrCreate(representationForUser); Console.WriteLine("Визуальный словарь {0} {1}", representationForUser.Title, savedRepresentation != null ? "сохранен" : "НЕ сохранен!"); }