Exemplo n.º 1
0
        /// <summary>
        /// Выполняет поиск стандартных элементов в документе по значению <paramref name="name"/>.
        /// Генерирует изображение в формате png, представляющее штрих код соответствующий страндарту Code128,
        /// на основе значения <c><paramref name="value"/>.ToString()</c>.
        /// Извлекает из наденых элементов дочерний элемент, представляющий контейнер изображения
        /// и заполняет сгенерированным изображением.
        /// </summary>
        /// <param name="name">Имя целевого(ых) стандартных элементов.</param>
        /// <param name="value">
        /// Ссылка на объект, строковое представление которого необходимо необходимо закодировать.
        /// </param>
        /// <exception cref="InvalidSdtElementException">
        /// Возникает если дерево дочерних элементов <see cref="SdtElement"/> содержит недопустимые элементы
        /// или отсутствует обязательный дочерний элемент.
        /// </exception>
        protected void FillBarcode(string name, object value)
        {
            name.ThrowIfNullOrWhiteSpace(nameof(name));
            value.ThrowIfNull(nameof(value));

            try
            {
                var imageStream    = new MemoryStream();
                var relationshipId = new StringValue(string.Empty);

                using (var barcodeImage = new Code128().Barcode(value.ToString(), false, BarWeight.Double, 40, true))
                {
                    barcodeImage.Save(imageStream, ImageFormat.Png);
                    imageStream.Position = 0;
                }

                foreach (var element in _elemetns.Where(element => element.SdtProperties.GetFirstChild <SdtAlias>()?.Val == name))
                {
                    relationshipId = element.Descendants <Blip>().Single().Embed;

                    FeedDataIfExistImagePart(_mainDocumentPart, relationshipId, imageStream);

                    foreach (var footerPart in _mainDocumentPart.FooterParts)
                    {
                        FeedDataIfExistImagePart(footerPart, relationshipId, imageStream);
                    }

                    foreach (var headerPart in _mainDocumentPart.HeaderParts)
                    {
                        FeedDataIfExistImagePart(headerPart, relationshipId, imageStream);
                    }
                }
            }
            catch (InvalidOperationException)
            {
                throw new InvalidSdtElementException(name);
            }
        }