Ejemplo n.º 1
0
        private double BuildContext(PageRenderData context, ParagraphInfo p, double width,
                                    double defaultFontSize, int paragraphID, double top)
        {
            TextAlignment align     = GetTextAlignment(p);
            var           list      = new List <TextElement>();
            bool          firstLine = true;

            foreach (TextElementBase baseInlineItem in p.Inlines)
            {
                if (baseInlineItem is EOLElement)
                {
                    top = AppendLine(context, list, align, p, width, top, defaultFontSize, paragraphID,
                                     firstLine);
                    firstLine = false;
                    list.Clear();
                }
                else
                {
                    var inlineItem = (TextElement)baseInlineItem;
                    list.Add(inlineItem);
                }
            }

            return(AppendLine(context, list, align == TextAlignment.Justify ? TextAlignment.Left : align, p, width,
                              top, defaultFontSize, paragraphID, firstLine));
        }
Ejemplo n.º 2
0
        private double BuildImageContext(PageRenderData context, ParagraphInfo p, double top)
        {
            var       item         = (ImageElement)p.Inlines.First();
            BookImage bookImage    = _images.First(t => t.ID == item.ImageID);
            double    offsetX      = (context.PageSize.Width - p.MarginLeft - p.MarginRight - item.Width) / 2.0;
            var       imageContext = CreateImage(context, offsetX, top, item, bookImage);

            context.Images.Add(imageContext);
            return(top + item.Height);
        }
Ejemplo n.º 3
0
 public PageBuilder(Size pageSize, IEnumerable <BookImage> images)
 {
     _images    = images;
     _pageSize  = pageSize;
     _height    = 0.0;
     _paragraph = null;
     _page      = new PageInfo
     {
         FirstTokenID = -1
     };
 }
Ejemplo n.º 4
0
        public static void SetParagraphLevel(XElement paragraph, int ilvl)
        {
            var pi = paragraph.Annotation <ParagraphInfo>();

            if (pi == null)
            {
                pi = new ParagraphInfo()
                {
                    Ilvl = ilvl,
                };
                paragraph.AddAnnotation(pi);
                return;
            }
            throw new OpenXmlPowerToolsException("Internal error - should never set ilvl more than once.");
        }
Ejemplo n.º 5
0
 private void AddInlineToParagraph(TextTokenBlock block)
 {
     _page.Lines.Add(block);
     foreach (TextElementBase baseInlineItem in block.Inlines)
     {
         if (!(baseInlineItem is EOPElement))
         {
             _paragraph.Inlines.Add(baseInlineItem);
         }
         else
         {
             _paragraph = null;
             break;
         }
     }
 }
Ejemplo n.º 6
0
        private static TextAlignment GetTextAlignment(ParagraphInfo p)
        {
            if (!string.IsNullOrEmpty(p.TextAlign))
            {
                switch (p.TextAlign)
                {
                case "center":
                    return(TextAlignment.Center);

                case "right":
                    return(TextAlignment.Right);

                case "left":
                    return(TextAlignment.Left);
                }
            }
            return(TextAlignment.Justify);
        }
Ejemplo n.º 7
0
        private static double AppendLine(PageRenderData context, ICollection <TextElement> inlines, TextAlignment align,
                                         ParagraphInfo p, double width, double top, double defaultFontSize,
                                         int paragraphID, bool firstLine)
        {
            if (inlines.Count == 0)
            {
                return(top);
            }

            double height       = inlines.Max((t => t.Height));
            double inlinesWidth = inlines.Sum((t => t.Width));
            double leftMargin   = 0.0;
            double wordSpacing  = 0.0;
            double textIndent   = !firstLine || align != TextAlignment.Justify && align != TextAlignment.Left
                              ? 0.0
                              : p.TextIndent;

            width -= p.MarginRight + p.MarginLeft + textIndent;

            switch (align)
            {
            case TextAlignment.Center:
                leftMargin = (width - inlinesWidth) / 2.0;
                break;

            case TextAlignment.Right:
                leftMargin = width - inlinesWidth;
                break;

            case TextAlignment.Justify:
                wordSpacing = (width - inlinesWidth) / (inlines.Count - 1);
                break;
            }

            double tempLeftMargin = leftMargin + (p.MarginLeft + textIndent);

            inlines.Aggregate(tempLeftMargin, (current, inlineItem) =>
                              BuildInlineItem(context, top, defaultFontSize, paragraphID, inlineItem, height, current, wordSpacing));

            return(top + height * (double)AppSettings.Default.FontSettings.FontInterval);
        }
Ejemplo n.º 8
0
        private bool AppendToPage(TextTokenBlock block)
        {
            if (_page.FirstTokenID < 0)
            {
                _page.FirstTokenID = block.FirstTokenID;
            }

            double height = block.Height * (double)AppSettings.Default.FontSettings.FontInterval;

            if (_height + height <= _pageSize.Height)
            {
                _height           += height;
                _page.LastTokenID  = block.LastTokenID;
                _page.LastTextPart = block.GetLastPart();
                if (_paragraph == null)
                {
                    _paragraph = CreateParagraph(block);
                    _page.Paragraphs.Add(_paragraph);
                }
                AddInlineToParagraph(block);
                return(true);
            }
            return(false);
        }
Ejemplo n.º 9
0
        private static ParagraphInfo GetParagraphInfo(XElement transUnit, ref int segmentIdCounter)
        {
            var paragraphInfo = new ParagraphInfo();

            foreach (var transUnitAttribute in transUnit.Attributes())
            {
                if (string.Compare(transUnitAttribute.Name.LocalName, "id", StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    paragraphInfo.ParagraphId = transUnitAttribute.Value;
                    break;
                }
            }

            foreach (var xElement in transUnit.Elements())
            {
                if (string.Compare(xElement.Name.LocalName, "seg-defs", StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    var segmentIds = GetSegmentIds(xElement);

                    foreach (var segmentId in segmentIds)
                    {
                        paragraphInfo.SegmentIdInfos.Add(new SegmentIdInfo
                        {
                            OriginalSegmentId = segmentId,
                            SegmentId         = (++segmentIdCounter).ToString()
                        });
                    }
                }

                if (string.Compare(xElement.Name.LocalName, "seg-source", StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    var mrkStack = new Stack <MrkInfo>();

                    var reader = xElement.CreateReader();
                    while (reader.Read())
                    {
                        switch (reader.NodeType)
                        {
                        case XmlNodeType.Element:

                            if (string.Compare(reader.Name, "mrk", StringComparison.InvariantCultureIgnoreCase) == 0)
                            {
                                var mrkElement = new MrkInfo();
                                if (reader.HasAttributes)
                                {
                                    while (reader.MoveToNextAttribute())
                                    {
                                        if (string.Compare(reader.Name, "mtype", StringComparison.InvariantCultureIgnoreCase) == 0)
                                        {
                                            mrkElement.Mtype = reader.Value;
                                        }
                                        else if (string.Compare(reader.Name, "mid", StringComparison.InvariantCultureIgnoreCase) == 0)
                                        {
                                            mrkElement.Mid = reader.Value;
                                        }
                                    }
                                    reader.MoveToElement();
                                }

                                if (!reader.IsEmptyElement)
                                {
                                    mrkStack.Push(mrkElement);
                                }
                            }
                            break;

                        case XmlNodeType.Text:
                        {
                            if (mrkStack.Count > 0)
                            {
                                var mrkElement = mrkStack.Peek();
                                mrkElement.Content += reader.Value;
                            }
                            else if (reader.Value == "\n")
                            {
                                var mrkEmptyElement = new MrkInfo
                                {
                                    Mtype   = "structure",
                                    Mid     = "-1",
                                    Content = reader.Value
                                };

                                paragraphInfo.SegmentationMrks.Add(mrkEmptyElement);
                            }
                        }
                        break;

                        case XmlNodeType.EndElement:
                        {
                            if (string.Compare(reader.Name, "mrk", StringComparison.InvariantCultureIgnoreCase) == 0)
                            {
                                var mrkElement = mrkStack.Pop();
                                paragraphInfo.SegmentationMrks.Add(mrkElement);
                            }
                        }
                        break;
                        }
                    }
                }
            }

            return(paragraphInfo);
        }
Ejemplo n.º 10
0
        public ActionResult Format(int id)
        {
            //lấy record file trong database bằng id truyền vào
            var file = db.FileTable.Find(id);

            if (file == null)
            {
                return(HttpNotFound());
            }

            //lấy format của trang lúc upload chọn
            var pageFilter = db.PageFormat.Find(file.PageId);

            if (pageFilter == null)
            {
                return(HttpNotFound());
            }

            //lay format của loại trang
            var filter = (from ppf in db.PagePropertiesFormat
                          where ppf.PageId == pageFilter.Id
                          orderby ppf.Row ascending
                          select ppf).ToList();

            if (filter == null)
            {
                return(HttpNotFound());
            }

            //đọc file vào bộ nhớ ram
            byte[] temp = null;
            using (var fs = new FileStream(System.Web.HttpContext.Current.Server.MapPath(file.Path + "/" + file.Name), FileMode.Open, FileAccess.Read))
            {
                temp = new byte[fs.Length];
                fs.Read(temp, 0, (int)fs.Length);
            }

            MemoryStream ms = new MemoryStream();

            ms.Write(temp, 0, temp.Length);

            //Docx.dll (Novacode) load file từ bộ nhớ ram
            var docx = DocX.Load(ms);

            //khởi tạo 1 list đoạn văn thường mỗi dòng là một đoạn văn trừ một số trường hợp hy hữu
            var paragraphs = new List <ParagraphInfo>();
            int index      = 1;

            //tìm kiếm các đoạn văn trong file docx vừa load, xong thêm vào list các đoạn văn ở trên
            foreach (var p in docx.Paragraphs)
            {
                var info = new ParagraphInfo
                {
                    Paragraph = p,
                    Row       = index
                };

                //kiểm tra đoạn văn không phải khoảng trắng, xuống dòng trống thì thêm vào list
                if (!p.Text.Trim().Equals(""))
                {
                    paragraphs.Add(info);
                    index++;

                    //var f = p.MagicText[0].formatting;
                    //string font_family = f.FontFamily.Name;
                    //int size = (int)f.Size.Value;

                    //System.Drawing.Font font = new System.Drawing.Font(font_family, size);

                    //var l = LineSpacing(font, p.Text);
                }
            }

            //khởi tạo từ điển để chứa các lỗi
            var fv = new FormatView();

            fv.Page.isOk = true;

            if (pageFilter.isCentimeter)
            {
                fv.Page.MarginTop.FileValue = docx.MarginTop.ToString();
                fv.Page.MarginTop.DBValue   = pageFilter.MarginTop.ToString();

                if (!(convert.PaperClipsToCentimeters(pageFilter.MarginTop) == convert.PaperClipsToCentimeters(docx.MarginTop)))
                {
                    fv.Page.isOk = false;
                    fv.Page.MarginTop.isError = true;
                }

                fv.Page.MarginBottom.FileValue = docx.MarginBottom.ToString();
                fv.Page.MarginBottom.DBValue   = pageFilter.MarginBottom.ToString();


                if (!(convert.PaperClipsToCentimeters(pageFilter.MarginBottom) == convert.PaperClipsToCentimeters(docx.MarginBottom)))
                {
                    fv.Page.isOk = false;
                    fv.Page.MarginBottom.isError = true;
                }

                fv.Page.MarginLeft.FileValue = docx.MarginLeft.ToString();
                fv.Page.MarginLeft.DBValue   = pageFilter.MarginLeft.ToString();
                if (!(convert.PaperClipsToCentimeters(pageFilter.MarginLeft) == convert.PaperClipsToCentimeters(docx.MarginLeft)))
                {
                    fv.Page.isOk = false;
                    fv.Page.MarginLeft.isError = true;
                }

                fv.Page.MarginRight.FileValue = docx.MarginRight.ToString();
                fv.Page.MarginRight.DBValue   = pageFilter.MarginRight.ToString();
                if (!(convert.PaperClipsToCentimeters(pageFilter.MarginRight) == convert.PaperClipsToCentimeters(docx.MarginRight)))
                {
                    fv.Page.isOk = false;
                    fv.Page.MarginRight.isError = true;
                }
            }
            else
            {
                fv.Page.MarginTop.FileValue = docx.MarginTop.ToString();
                fv.Page.MarginTop.DBValue   = pageFilter.MarginTop.ToString();

                if (!(pageFilter.MarginTop == docx.MarginTop))
                {
                    fv.Page.isOk = false;
                    fv.Page.MarginTop.isError = true;
                }

                fv.Page.MarginBottom.FileValue = docx.MarginBottom.ToString();
                fv.Page.MarginBottom.DBValue   = pageFilter.MarginBottom.ToString();
                if (!(pageFilter.MarginBottom == docx.MarginBottom))
                {
                    fv.Page.isOk = false;
                    fv.Page.MarginBottom.isError = true;
                }

                fv.Page.MarginLeft.FileValue = docx.MarginLeft.ToString();
                fv.Page.MarginLeft.DBValue   = pageFilter.MarginLeft.ToString();
                if (!(pageFilter.MarginLeft == docx.MarginLeft))
                {
                    fv.Page.isOk = false;
                    fv.Page.MarginLeft.isError = true;
                }

                fv.Page.MarginRight.FileValue = docx.MarginRight.ToString();
                fv.Page.MarginRight.DBValue   = pageFilter.MarginRight.ToString();
                if (!(pageFilter.MarginRight == docx.MarginRight))
                {
                    fv.Page.isOk = false;
                    fv.Page.MarginRight.isError = true;
                }
            }
            var ppt = PaperSize(docx.PageWidth, docx.PageHeight);

            fv.Page.PaperType.FileValue = ppt;
            fv.Page.PaperType.DBValue   = pageFilter.PaperType;
            if (!(pageFilter.PaperType == ppt))
            {
                fv.Page.isOk = false;
                fv.Page.PaperType.isError = true;
            }

            //duyệt list bộ lọc từ db

            foreach (var f in filter)
            {
                bool isOK = true;

                PropertiesView pv = new PropertiesView();
                //get row check
                var r = paragraphs[f.Row];

                //nếu 1 dòng có nhiều định dạng thì sai
                if (r.Paragraph.MagicText.Count > 1)
                {
                    isOK     = false;
                    pv.Name += "Có quá nhiều định dạng, ";
                }
                else
                {
                    var format = r.Paragraph.MagicText[0].formatting;
                    if (!(f.Size == format.Size))
                    {
                        isOK = false;
                        pv.FontSize.isError   = true;
                        pv.FontSize.FileValue = format.Size.ToString();
                        pv.FontSize.DBValue   = f.Size.ToString();
                        pv.Name += "Font Size không khớp, ";
                    }
                    if (!(f.Bold == format.Bold))
                    {
                        if (format.Bold == null)
                        {
                            if (f.Bold)
                            {
                                pv.FontBold.isError   = true;
                                pv.FontBold.FileValue = null;
                                pv.FontBold.DBValue   = f.Bold.ToString();
                                pv.Name += "Font Bold không đọc được, ";
                            }
                            else
                            {
                                pv.FontBold.isError = false;
                                pv.Name            += "Font Bold không khớp, ";
                            }
                        }
                        else
                        {
                            pv.FontBold.isError   = true;
                            pv.FontBold.FileValue = format.Bold.ToString();
                            pv.FontBold.DBValue   = f.Bold.ToString();
                            isOK     = false;
                            pv.Name += "Font Bold không khớp, ";
                        }

                        pv.FontBold.isError   = true;
                        pv.FontBold.FileValue = format.Bold.ToString();
                        pv.FontBold.DBValue   = f.Bold.ToString();
                    }
                    if (!(f.Italic == format.Italic))
                    {
                        if (format.Italic == null)
                        {
                            if (f.Italic)
                            {
                                pv.FontItalic.isError   = true;
                                pv.FontItalic.FileValue = null;
                                pv.FontItalic.DBValue   = f.Italic.ToString();
                                pv.Name += "Font Italic không đọc được, ";
                            }
                            else
                            {
                                pv.FontBold.isError = false;
                            }
                        }
                        else
                        {
                            pv.FontItalic.isError   = true;
                            pv.FontItalic.FileValue = format.Italic.ToString();
                            pv.FontItalic.DBValue   = f.Italic.ToString();
                            isOK     = false;
                            pv.Name += "Font Italic không khớp, ";
                        }
                    }
                    if (format.FontFamily == null && pageFilter.FontFamily != null)
                    {
                        isOK = false;
                    }
                    else
                    {
                        if (!pageFilter.FontFamily.Equals(format.FontFamily.Name))
                        {
                            if (format.FontFamily == null)
                            {
                                if (f.Italic)
                                {
                                    fv.Page.FontFamily.isError   = true;
                                    fv.Page.FontFamily.FileValue = null;
                                    fv.Page.FontFamily.DBValue   = pageFilter.FontFamily;
                                    pv.Name += "Font Family không đọc được, ";
                                }
                                else
                                {
                                    fv.Page.FontFamily.isError = false;
                                }
                            }
                            else
                            {
                                fv.Page.FontFamily.isError   = true;
                                fv.Page.FontFamily.FileValue = format.FontFamily.Name;
                                fv.Page.FontFamily.DBValue   = pageFilter.FontFamily;
                                isOK     = false;
                                pv.Name += "Font Family không khớp, ";
                            }
                        }
                    }
                }

                if (!isOK)
                {
                    fv.Properties[r.Paragraph.Text] = pv;
                }
            }

            ViewBag.Html = WordToHtml(ms);
            return(View(fv));
        }
Ejemplo n.º 11
0
        public DocxView GenResult(Stream stream, Dictionary <string, int> col)
        {
            var view = new DocxView();
            var docx = DocX.Load(stream);
            WordprocessingDocument doc = WordprocessingDocument.Open(stream, false);
            var convert        = new Extends.Library.Convert();
            var ml             = convert.PaperClipsToCentimeters(docx.MarginLeft);
            var paragraphInfos = new List <ParagraphInfo>();

            view.Page.Layout.Margin.Top    = docx.MarginTop;
            view.Page.Layout.Margin.Bottom = docx.MarginBottom;
            view.Page.Layout.Margin.Left   = docx.MarginLeft;
            view.Page.Layout.Margin.Right  = docx.MarginRight;
            view.Page.Layout.Size.Width    = docx.PageWidth;
            view.Page.Layout.Size.Height   = docx.PageHeight;
            var pps = new Models.PaperSize();

            view.Page.Layout.Size.PaperType = pps.PaperType(view.Page.Layout.Size);

            var paragraphs = doc.MainDocumentPart.Document.Descendants <DocumentFormat.OpenXml.Wordprocessing.Paragraph>();
            int pageIdx    = 1;

            foreach (var paragraph in paragraphs)
            {
                var run  = paragraph.GetFirstChild <DocumentFormat.OpenXml.Wordprocessing.Run>();
                var info = new ParagraphInfo
                {
                    Paragraph  = paragraph,
                    PageNumber = pageIdx
                };

                if (!paragraph.InnerText.Trim().Equals(""))
                {
                    paragraphInfos.Add(info);
                }


                if (run != null)
                {
                    var lastRenderedPageBreak = run.GetFirstChild <LastRenderedPageBreak>();
                    var pageBreak             = run.GetFirstChild <Break>();


                    if (lastRenderedPageBreak != null || pageBreak != null)
                    {
                        pageIdx++;
                    }
                }
            }

            foreach (var c in col)
            {
                view.Cover.Paragraphs[c.Key] = GetParagraph(paragraphInfos, docx, c.Value);
            }

            return(view);
            //view.Cover.Paragraphs["tentruong"] = GetParagraph(paragraphInfos, docx, 0);
            //view.Cover.Paragraphs["hoten"] = GetParagraph(paragraphInfos, docx, 1);
            //view.Cover.Paragraphs["khoa"] = GetParagraph(paragraphInfos, docx, 2);
            //view.Cover.Paragraphs["he"] = GetParagraph(paragraphInfos, docx, 3);
            //view.Cover.Paragraphs["tieude"] = GetParagraph(paragraphInfos, docx, 4);
            //view.Cover.Paragraphs["nganh"] = GetParagraph(paragraphInfos, docx, 5);
            //view.Cover.Paragraphs["detai"] = GetParagraph(paragraphInfos, docx, 6);
            //view.Cover.Paragraphs["nam"] = GetParagraph(paragraphInfos, docx, 7);
        }
 public static void SetParagraphLevel(XElement paragraph, int ilvl)
 {
     var pi = paragraph.Annotation<ParagraphInfo>();
     if (pi == null)
     {
         pi = new ParagraphInfo()
         {
             Ilvl = ilvl,
         };
         paragraph.AddAnnotation(pi);
         return;
     }
     throw new OpenXmlPowerToolsException("Internal error - should never set ilvl more than once.");
 }