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);
        }
示例#2
0
        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 ? "сохранен" : "НЕ сохранен!");
        }