/// <summary>
        /// Gets the mail merge data set.
        /// </summary>
        /// <returns></returns>
        /// <exception cref="System.Exception">reader</exception>
        /// <exception cref="XmlException">Unexpected xml tag  + reader.LocalName</exception>
        private MailMergeDataSet GetMailMergeDataSet(string basePath)
        {
            List <EmployeeDetails> employees = new List <EmployeeDetails>();
            List <CustomerDetails> customers = new List <CustomerDetails>();
            List <OrderDetails>    orders    = new List <OrderDetails>();

            FileStream stream = new FileStream(basePath + @"/DocIO/Employees.xml", FileMode.OpenOrCreate);

            XmlReader reader = XmlReader.Create(stream);

            if (reader == null)
            {
                throw new Exception("reader");
            }

            while (reader.NodeType != XmlNodeType.Element)
            {
                reader.Read();
            }

            if (reader.LocalName != "EmployeesList")
            {
                throw new XmlException("Unexpected xml tag " + reader.LocalName);
            }

            reader.Read();

            while (reader.NodeType == XmlNodeType.Whitespace)
            {
                reader.Read();
            }

            while (reader.LocalName != "EmployeesList")
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                    case "Employees":
                        employees.Add(GetEmployee(reader, customers, orders));
                        break;
                    }
                }
                else
                {
                    reader.Read();
                    if ((reader.LocalName == "EmployeesList") && reader.NodeType == XmlNodeType.EndElement)
                    {
                        break;
                    }
                }
            }
            reader.Dispose();
            stream.Dispose();
            MailMergeDataSet dataSet = new MailMergeDataSet();

            dataSet.Add(new MailMergeDataTable("Employees", employees));
            dataSet.Add(new MailMergeDataTable("Customers", customers));
            dataSet.Add(new MailMergeDataTable("Orders", orders));
            return(dataSet);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Gets the mail merge data set.
        /// </summary>
        /// <returns></returns>
        /// <exception cref="System.Exception">reader</exception>
        /// <exception cref="XmlException">Unexpected xml tag  + reader.LocalName</exception>
        private MailMergeDataSet GetMailMergeDataSet()
        {
            List <EmployeeDetails> employees = new List <EmployeeDetails>();
            List <CustomerDetails> customers = new List <CustomerDetails>();
            List <OrderDetails>    orders    = new List <OrderDetails>();

            Stream stream = execAssm.GetManifestResourceStream("Syncfusion.SampleBrowser.UWP.DocIO.DocIO.Assets.Employees.xml");

            XmlReader reader = XmlReader.Create(stream);

            if (reader == null)
            {
                throw new Exception("reader");
            }

            while (reader.NodeType != XmlNodeType.Element)
            {
                reader.Read();
            }

            if (reader.LocalName != "EmployeesList")
            {
                throw new XmlException("Unexpected xml tag " + reader.LocalName);
            }

            reader.Read();

            while (reader.NodeType == XmlNodeType.Whitespace)
            {
                reader.Read();
            }

            while (reader.LocalName != "EmployeesList")
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                    case "Employees":
                        employees.Add(GetEmployee(reader, customers, orders));
                        break;
                    }
                }
                else
                {
                    reader.Read();
                    if ((reader.LocalName == "EmployeesList") && reader.NodeType == XmlNodeType.EndElement)
                    {
                        break;
                    }
                }
            }
            reader.Dispose();
            stream.Dispose();
            MailMergeDataSet dataSet = new MailMergeDataSet();

            dataSet.Add(new MailMergeDataTable("Employees", employees));
            dataSet.Add(new MailMergeDataTable("Customers", customers));
            dataSet.Add(new MailMergeDataTable("Orders", orders));
            return(dataSet);
        }
        /// <summary>
        /// generate word document as an asynchronous operation.
        /// </summary>
        /// <param name="documentRequest">The document request.</param>
        /// <param name="exportAsPdf">if set to <c>true</c> [export as PDF].</param>
        /// <param name="cancellationToken">The cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
        /// <returns>Task.</returns>
        public Task <Stream> GenerateDocumentAsync <TDocument, TDetails>(DocumentRequest <TDocument, TDetails> documentRequest, bool exportAsPdf = false, CancellationToken cancellationToken = default)
        {
            Argument.IsNotNull(documentRequest);

            Stream       result   = new MemoryStream();
            WordDocument document = null;

            try
            {
                if (documentRequest.Template is byte[] templateBytes && templateBytes.ToMemoryStream() is MemoryStream stream)
                {
                    using (document = new WordDocument(stream, Syncfusion.DocIO.FormatType.Docx))
                    {
                        if (documentRequest.Stationary is byte[] imageArray && imageArray.Length > 0)
                        {
                            //Adds picture watermark to the document.
                            var section   = document.Sections[0];
                            var paragraph = section.HeadersFooters.Header.AddParagraph();
                            var picture   = paragraph.AppendPicture(imageArray);
                            picture.TextWrappingStyle = TextWrappingStyle.Behind;
                            picture.Width             = section.PageSetup.PageSize.Width;
                            picture.Height            = section.PageSetup.PageSize.Height;
                            picture.HorizontalOrigin  = HorizontalOrigin.Page;
                            picture.VerticalOrigin    = VerticalOrigin.Page;
                        }

                        var dataSet  = new MailMergeDataSet();
                        var commands = new List <DictionaryEntry>();

                        var documentDataTable = new MailMergeDataTable(nameof(documentRequest.Document), documentRequest.Document);
                        dataSet.Add(documentDataTable);
                        commands.Add(new DictionaryEntry(documentDataTable.GroupName, string.Empty));

                        var detailsDataTable = new MailMergeDataTable(nameof(documentRequest.DocumentDetails), documentRequest.DocumentDetails);
                        dataSet.Add(detailsDataTable);
                        commands.Add(new DictionaryEntry(detailsDataTable.GroupName, string.Empty));

                        var alternativesDataTable = new MailMergeDataTable(nameof(documentRequest.DocumentAlternatives), documentRequest.DocumentAlternatives);
                        dataSet.Add(alternativesDataTable);
                        commands.Add(new DictionaryEntry(alternativesDataTable.GroupName, string.Empty));

                        document.MailMerge.MergeImageField      += MergeImageField;
                        document.MailMerge.RemoveEmptyParagraphs = true;
                        document.MailMerge.ExecuteNestedGroup(dataSet, commands);

                        foreach (var paragraph in mailMergeImgaeParagraph.EnsureNotNull())
                        {
                            if (paragraph.ChildEntities is not null)
                            {
                                foreach (ParagraphItem paraItem in paragraph.ChildEntities)
                                {
                                    if (paraItem is WPicture picture && paragraph.OwnerTextBody is WTableCell cell)
                                    {
                                        //Get the cell width and reduce the 5 points from total width
                                        //to avoid the image overlapping on the cell borders.
                                        var newWidth = cell.Width - 10;

                                        //Check whether the image width exceeds the cell width.
                                        if (picture.Width > newWidth)
                                        {
                                            var originalWidth  = picture.Width;
                                            var originalHeight = picture.Height;

                                            var nPercentH = newWidth / originalWidth;

                                            //Scaling the image to the cell width.
                                            picture.Height = Math.Max((int)Math.Round(originalHeight * nPercentH), 1) - 10; // Just in case;
                                            picture.Width  = newWidth;
                                        }

                                        break;
                                    }
                                }
                            }
                        }

                        if (exportAsPdf)
                        {
                            using (var iORenderer = new DocIORenderer())
                            {
                                iORenderer.Settings.ChartRenderingOptions.ImageFormat = Syncfusion.OfficeChart.ExportImageFormat.Jpeg;
                                iORenderer.Settings.EmbedFonts = true;

                                var pdfDocument = iORenderer.ConvertToPDF(document);
                                pdfDocument.Save(result);
                                pdfDocument.Close();
                            };
                        }
                        else
                        {
                            document.Save(result, Syncfusion.DocIO.FormatType.Docx);
                        }
                    }
                }
            }
            finally
            {
                result.Position = 0;

                if (document is not null)
                {
                    document.Close();
                }
            }

            return(Task.FromResult(result));
        }