public static bool GetFromShapes(Document doc, WordFieldsInfo wfi, ref bool keepGoing, Action <int> updateStatus) { Microsoft.Office.Interop.Word.Application app = doc.Application; // Process fields that may be embedded in shapes int currentShape = 0; foreach (Shape shp in doc.Shapes) { currentShape++; if (updateStatus != null) { updateStatus(currentShape); } if (shp.Type == Microsoft.Office.Core.MsoShapeType.msoTextBox) { shp.Select(); app.Selection.ShapeRange.TextFrame.TextRange.Select(); if (app.Selection.ContentControls.Count == 1) { WordFieldInfo field = new WordFieldInfo(); wfi.Fields.Add(field); field.GetFromDocumentShape(doc, app.Selection.ContentControls[1], shp); } } } return(true); }
public void GetFromDocumentShape(Document doc, ContentControl cc, Microsoft.Office.Interop.Word.Shape shp) { DateTime timerStart = DateTime.Now; FieldType = WordFieldInfo.ConvertFieldType(cc); if (FieldType == FieldType.DropDownList) { Options = GetOptions(cc); } X = GetXFromShape(shp); Y = GetYFromShape(shp); Height = shp.Height; Width = shp.Width; Page = cc.Range.Information[WdInformation.wdActiveEndPageNumber]; Status = "Done"; DateTime timerStop = DateTime.Now; TimeToGetLocation = timerStop - timerStart; }
public static bool Get(Document doc, WordFieldsInfo wfi, ref bool keepGoing) { Microsoft.Office.Interop.Word.Application app = doc.Application; doc.Repaginate(); foreach (ContentControl cc in doc.ContentControls) { if (!keepGoing) { return(false); } try { WordFieldInfo field = new WordFieldInfo(); wfi.Fields.Add(field); field.GetFromDocument(doc, cc); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine($"{ex}"); } } return(true); }
public static string GetFieldName(WordFieldInfo fi) { return($"{fi.Page:000}-{fi.X:0.00}-{fi.Y:0.00}"); }
public void GetFromDocument(Document doc, ContentControl cc) { DateTime timerStart = DateTime.Now; Status = "Initializing"; FieldType = WordFieldInfo.ConvertFieldType(cc); if (FieldType == FieldType.DropDownList) { Options = GetOptions(cc); } Range fieldRange = cc.Range; Status = "Selecting"; object collapseDirectionStart = WdCollapseDirection.wdCollapseStart; object collapseDirectionEnd = WdCollapseDirection.wdCollapseEnd; object moveUnit = WdUnits.wdCharacter; fieldRange.Collapse(ref collapseDirectionStart); fieldRange.Move(ref moveUnit, -1); Status = "Getting Page"; double pageWidth = 0.0; double pageWidthUsable = 0.0; double pageHeight = 0.0; double pageTopMargin = 0.0; double pageBottomMargin = 0.0; double pageHeightUsable = 0.0; try { pageWidth = fieldRange.PageSetup.PageWidth; pageWidthUsable = pageWidth - fieldRange.PageSetup.LeftMargin - fieldRange.PageSetup.RightMargin - fieldRange.PageSetup.Gutter; pageHeight = fieldRange.PageSetup.PageHeight; pageTopMargin = fieldRange.PageSetup.TopMargin; pageBottomMargin = fieldRange.PageSetup.BottomMargin; pageHeightUsable = pageHeight - pageTopMargin - pageBottomMargin; } catch (Exception ex) { // The most likely scenario is that we're in a textbox so there's no page context, ignore this exception and accept zeros for the page information System.Diagnostics.Trace.WriteLine($"{ex}"); } Page = fieldRange.Information[WdInformation.wdActiveEndPageNumber]; int colNum = fieldRange.Information[WdInformation.wdEndOfRangeColumnNumber]; int rowNum = fieldRange.Information[WdInformation.wdEndOfRangeRowNumber]; // Collapsed to START so we get the start values here. X = fieldRange.Information[WdInformation.wdHorizontalPositionRelativeToPage]; Y = fieldRange.Information[WdInformation.wdVerticalPositionRelativeToPage]; Status = "Checking for Table"; if (colNum > 0 && rowNum > 0) { // This is inside a table cell, the field bounds are the cell bounds Table tbl = fieldRange.Tables[1]; Cell cell = tbl.Cell(rowNum, colNum); X -= cell.LeftPadding; Y -= cell.TopPadding; Width = cell.Width; Height = cell.Height; if (Height == 9999999 && FieldType == FieldType.MultiLine) { // Work around height not being accurate double nextY; if (tbl.Rows.Count > rowNum) { nextY = tbl.Rows[rowNum + 1].Range.Information[WdInformation.wdVerticalPositionRelativeToPage]; } else { Range next = tbl.Range; // tbl.Cell(tbl.Rows.Count, tbl.Columns.Count).Range; next.Collapse(ref collapseDirectionEnd); //object moveForward = WdConstants.wdForward; //next.MoveUntil("^p",ref moveForward); nextY = next.Information[WdInformation.wdVerticalPositionRelativeToPage]; } // If we're on the next page, add the usable page height and remove the top margin to get field size if (nextY < Y) { nextY += pageHeightUsable - pageTopMargin; } Height = nextY - Y; if (Height < 0.0) { Height = 0.0; } } } if (Width == 0 || Width > 5000 || Height == 0 || Height > 5000) // Need to fixup { Status = "Finding field width/height"; fieldRange = cc.Range; fieldRange.Collapse(ref collapseDirectionEnd); double endX = fieldRange.Information[WdInformation.wdHorizontalPositionRelativeToPage]; if (Width == 0 || Width > 5000) { Width = Math.Abs(endX - X); } if (Width == 0) { Width = pageWidthUsable; // Not in table, and no width, so set it to usable page width // Adjust for left indent float leftIndent = fieldRange.ParagraphFormat.LeftIndent + fieldRange.ParagraphFormat.FirstLineIndent; if (leftIndent > 0 && leftIndent < pageWidthUsable) { Width -= leftIndent; X += leftIndent; } } double endY = fieldRange.Information[WdInformation.wdVerticalPositionRelativeToPage]; if (Height == 0 || Height > 5000) { // Try to get the difference between the start and end Height = endY - Y; if (Height < 0) // Page Transition, add one page height { Height += pageHeightUsable - pageTopMargin; SpansPages = true; } else if (Height == 0) // Still don't have a height, set to font height { Font rangeFont = fieldRange.Font; Height += rangeFont.Size; } } } Status = "Done"; DateTime timerStop = DateTime.Now; TimeToGetLocation = timerStop - timerStart; }