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)); }
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); }
public PageBuilder(Size pageSize, IEnumerable <BookImage> images) { _images = images; _pageSize = pageSize; _height = 0.0; _paragraph = null; _page = new PageInfo { FirstTokenID = -1 }; }
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."); }
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; } } }
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); }
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); }
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); }
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); }
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)); }
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."); }