private static OXmlAnchorPictureDrawing CreateAnchorPictureDrawing(BsonDocument element, OXmlAnchorWrapType wrapType) { OXmlAnchorPictureDrawing anchor = new OXmlAnchorPictureDrawing(); anchor.AnchorId = element.zGet("AnchorId").zAsString(); anchor.EditId = element.zGet("EditId").zAsString(); anchor.DistanceFromTop = element.zGet("DistanceFromTop").zAsNullableInt(); anchor.DistanceFromBottom = element.zGet("DistanceFromBottom").zAsNullableInt(); anchor.DistanceFromLeft = element.zGet("DistanceFromLeft").zAsNullableInt(); anchor.DistanceFromRight = element.zGet("DistanceFromRight").zAsNullableInt(); anchor.HorizontalPosition.RelativeFrom = element.zGet("HorizontalRelativeFrom").zAsString().zTryParseEnum(DW.HorizontalRelativePositionValues.Margin); anchor.HorizontalPosition.PositionOffset = element.zGet("HorizontalPositionOffset").zAsNullableInt(); anchor.HorizontalPosition.HorizontalAlignment = element.zGet("HorizontalAlignment").zAsString(); anchor.VerticalPosition.RelativeFrom = element.zGet("VerticalRelativeFrom").zAsString().zTryParseEnum(DW.VerticalRelativePositionValues.Paragraph); anchor.VerticalPosition.PositionOffset = element.zGet("VerticalPositionOffset").zAsNullableInt(); anchor.VerticalPosition.VerticalAlignment = element.zGet("VerticalAlignment").zAsString(); anchor.EffectExtent = CreateEffectExtent(element.zGet("EffectExtent").zAsBsonDocument()); anchor.AllowOverlap = element.zGet("AllowOverlap").zAsBoolean(); anchor.BehindDoc = element.zGet("BehindDoc").zAsBoolean(); anchor.Hidden = element.zGet("Hidden").zAsBoolean(); anchor.LayoutInCell = element.zGet("LayoutInCell").zAsBoolean(); anchor.Locked = element.zGet("Locked").zAsBoolean(); anchor.RelativeHeight = element.zGet("RelativeHeight").zAsInt(); BsonDocument element2 = element.zGet("SimplePosition").zAsBsonDocument(); if (element2 != null) { anchor.SimplePosition = new OXmlPoint2DType { X = element2.zGet("X").zAsLong(), Y = element.zGet("Y").zAsLong() } } ; switch (wrapType) { //case OXmlAnchorWrapType.WrapNone: case OXmlAnchorWrapType.WrapSquare: anchor.Wrap = CreateAnchorWrapSquare(element.zGet("WrapSquare").zAsBsonDocument()); break; case OXmlAnchorWrapType.WrapTight: anchor.Wrap = CreateAnchorWrapTight(element.zGet("WrapTight").zAsBsonDocument()); break; //case OXmlAnchorWrapType.WrapThrough: case OXmlAnchorWrapType.WrapTopAndBottom: anchor.Wrap = CreateAnchorWrapTopAndBottom(element.zGet("WrapTopAndBottom").zAsBsonDocument()); break; default: throw new PBException($"wrap type \"{wrapType}\" not implemented"); } return(anchor); }
public DW.Anchor Create() { int width; int height; zimg.CalculateImageWidthHeight(_pictureElement.File, _pictureElement.Width, _pictureElement.Height, out width, out height); long emuWidth = OXmlTools.PixelToEmus(width); long emuHeight = OXmlTools.PixelToEmus(height); //DW.Anchor anchor = new DW.Anchor() //{ // DistanceFromTop = _distanceFromTop, // DistanceFromBottom = _distanceFromBottom, // DistanceFromLeft = _distanceFromLeft, // DistanceFromRight = _distanceFromRight, // RelativeHeight = _relativePosition, // BehindDoc = _behindDoc, // LayoutInCell = _layoutInCell, // AllowOverlap = _allowOverlap, // Locked = _locked, // Hidden = _hidden //}; DW.Anchor anchor = new DW.Anchor(); OXmlAnchorPictureDrawing pictureDrawing = (OXmlAnchorPictureDrawing)_pictureElement.PictureDrawing; if (pictureDrawing.AnchorId != null) { anchor.AnchorId = pictureDrawing.AnchorId; } if (pictureDrawing.EditId != null) { anchor.EditId = pictureDrawing.EditId; } if (pictureDrawing.DistanceFromTop != null) { anchor.DistanceFromTop = (uint)pictureDrawing.DistanceFromTop; } if (pictureDrawing.DistanceFromBottom != null) { anchor.DistanceFromBottom = (uint)pictureDrawing.DistanceFromBottom; } if (pictureDrawing.DistanceFromLeft != null) { anchor.DistanceFromLeft = (uint)pictureDrawing.DistanceFromLeft; } if (pictureDrawing.DistanceFromRight != null) { anchor.DistanceFromRight = (uint)pictureDrawing.DistanceFromRight; } OXmlHorizontalPosition oxmlHorizontalPosition = pictureDrawing.HorizontalPosition; DW.HorizontalPosition horizontalPosition = new DW.HorizontalPosition(); horizontalPosition.RelativeFrom = oxmlHorizontalPosition.RelativeFrom; if (oxmlHorizontalPosition.PositionOffset != null) { horizontalPosition.PositionOffset = new DW.PositionOffset(OXmlTools.PixelToEmus((int)oxmlHorizontalPosition.PositionOffset).ToString()); } if (oxmlHorizontalPosition.HorizontalAlignment != null) { horizontalPosition.HorizontalAlignment = new DW.HorizontalAlignment(oxmlHorizontalPosition.HorizontalAlignment); } anchor.HorizontalPosition = horizontalPosition; OXmlVerticalPosition oxmlVerticalPosition = pictureDrawing.VerticalPosition; DW.VerticalPosition verticalPosition = new DW.VerticalPosition(); verticalPosition.RelativeFrom = oxmlVerticalPosition.RelativeFrom; if (oxmlVerticalPosition.PositionOffset != null) { verticalPosition.PositionOffset = new DW.PositionOffset(OXmlTools.PixelToEmus((int)oxmlVerticalPosition.PositionOffset).ToString()); } if (oxmlVerticalPosition.VerticalAlignment != null) { verticalPosition.VerticalAlignment = new DW.VerticalAlignment(oxmlVerticalPosition.VerticalAlignment); } anchor.VerticalPosition = verticalPosition; if (pictureDrawing.EffectExtent != null) { anchor.EffectExtent = pictureDrawing.EffectExtent.ToEffectExtent(); } // mandatory anchor.AllowOverlap = pictureDrawing.AllowOverlap; // mandatory anchor.BehindDoc = pictureDrawing.BehindDoc; // not mandatory anchor.Hidden = pictureDrawing.Hidden; // mandatory anchor.LayoutInCell = pictureDrawing.LayoutInCell; // mandatory anchor.Locked = pictureDrawing.Locked; // mandatory anchor.RelativeHeight = (uint)pictureDrawing.RelativeHeight; // warning <wp:anchor simplePos> and <wp:simplePos x="0" y="0"/> are mandatory if (pictureDrawing.SimplePosition != null) { anchor.SimplePos = true; // Simple Positioning Coordinates, <wp:simplePos x="0" y="0"/> anchor.SimplePosition = new DW.SimplePosition { X = pictureDrawing.SimplePosition.X, Y = pictureDrawing.SimplePosition.Y }; } else { anchor.SimplePos = false; anchor.SimplePosition = new DW.SimplePosition { X = 0, Y = 0 }; } // Inline Drawing Object Extents // Cx : Extent Length ??? // Cy : Extent Width ??? // <wp:extent cx="3576638" cy="3570696"/> anchor.Extent = new DW.Extent() { Cx = emuWidth, Cy = emuHeight }; //if (_horizontalPosition != null) // // Horizontal Positioning // // <wp:positionH relativeFrom="margin"> // // <wp:posOffset>-38099</wp:posOffset> // // </wp:positionH> // anchor.HorizontalPosition = _horizontalPosition; //if (_verticalPosition != null) // // Vertical Positioning // // <wp:positionV relativeFrom="paragraph"> // // <wp:posOffset>723900</wp:posOffset> // // </wp:positionV> // anchor.VerticalPosition = _verticalPosition; // Object Extents Including Effects // BottomEdge : Additional Extent on Bottom Edge (b) // LeftEdge : Additional Extent on Left Edge (l) // RightEdge : Additional Extent on Right Edge (r) // TopEdge : Additional Extent on Top Edge (t) // <wp:effectExtent b="0" l="0" r="0" t="0"/> //if (_effectExtent == null) // _effectExtent = new DW.EffectExtent(); // <wp:effectExtent> is not mandatory //if (_effectExtent != null) // anchor.EffectExtent = _effectExtent; //if (_wrapElement == null) // SetWrapNone(); //anchor.AppendChild(_wrapElement); anchor.AppendChild(CreateWrap(pictureDrawing.Wrap)); // <wp:docPr> Non-Visual Properties, possible child : HyperlinkOnClick <a:hlinkClick> HyperlinkOnHover <a:hlinkHover> NonVisualDrawingPropertiesExtensionList <a:extLst> // <wp:docPr id="1" name="Picture1" title="" descr=""/> // Title = _title anchor.AppendChild(new DW.DocProperties() { Id = _id, Name = _name, Description = _pictureElement.Description }); Graphic graphic = new Graphic(_embeddedReference, emuWidth, emuHeight); graphic.Rotation = _pictureElement.Rotation; graphic.HorizontalFlip = _pictureElement.HorizontalFlip; graphic.VerticalFlip = _pictureElement.VerticalFlip; graphic.CompressionState = _pictureElement.CompressionState; graphic.PresetShape = _pictureElement.PresetShape; anchor.AppendChild(graphic.Create()); //if (_relativeHeight != null) // // <wp14:sizeRelV> RelativeHeight (Office2010 or above), // anchor.AppendChild(_relativeHeight); //if (_relativeWidth != null) // // <wp14:sizeRelH> RelativeWidth (Office2010 or above), possible child : PercentageWidth <wp14:pctWidth> // anchor.AppendChild(_relativeWidth); return(anchor); }
private IEnumerable <OXmlElement> GetImages(bool endOfDocument = false) { // 300 px -> 7.94 cm // 450 px -> 11.91 cm // largeur 18.5 cm = 694 px // largeur 16 cm = 600 px // example : // leftalign width300 - nonealign width300 // leftalign width300 - nonealign width300 // example : // leftalign width300 - nonealign width300 // nonealign width450 // example : // nonealign width450 // nonealign width450 // ... // img 112509336.jpg width300 leftalign // ... // img 112509351.jpg width450 nonealign // img 112509354.jpg width450 nonealign // ... // img 112509392.jpg width300 leftalign // img 112509399.jpg width300 nonealign // img 112509404.jpg width450 nonealign // ... // img 112509359.jpg width450 nonealign // ... // img 112509426.jpg width300 leftalign // img 112509432.jpg width300 nonealign // img 112509438.jpg width300 leftalign // img 112509447.jpg width300 nonealign // ... // ... // Paragraph // Picture 112509336.jpg AnchorWrapSquare Width 300 // ... // Paragraph // Picture 112509351.jpg AnchorWrapTopAndBottom Width 300 HorizontalPositionOffset 2 // Picture 112509354.jpg AnchorWrapTopAndBottom Width 300 HorizontalPositionOffset 305 // ... // Paragraph Style: "TinyParagraph" // Picture 112509392.jpg AnchorWrapTopAndBottom Width 300 HorizontalPositionOffset 2 // Picture 112509399.jpg AnchorWrapTopAndBottom Width 300 HorizontalPositionOffset 305 // Paragraph // Picture 112509404.jpg Inline Width 300 // ... // Paragraph // Picture 112509359.jpg Inline Width 300 // ... // Paragraph Style: "TinyParagraph" // Picture 112509426.jpg AnchorWrapTopAndBottom Width 300 HorizontalPositionOffset 2 // Picture 112509432.jpg AnchorWrapTopAndBottom Width 300 HorizontalPositionOffset 305 // Paragraph // Picture 112509438.jpg AnchorWrapTopAndBottom Width 300 HorizontalPositionOffset 2 // Picture 112509447.jpg AnchorWrapTopAndBottom Width 300 HorizontalPositionOffset 305 // ... while (_htmlImages.Count > 0) { // calculate nb of image horizontaly (_maxImageHorizontalSize) int nb = 1; HtmlImage htmlImage = _htmlImages[0]; bool nextImageToBig = false; //bool leftAlign = true; //if (htmlImage.RightAlign) // leftAlign = false; //if (!htmlImage.NoneAlign) //{ int width = (int)htmlImage.Width; for (int i = 1; i < _htmlImages.Count; i++) { HtmlImage htmlImage2 = _htmlImages[i]; if (htmlImage.RightAlign != htmlImage2.RightAlign) { break; } width += (int)htmlImage2.Width; if (width > _maxImageHorizontalSize) { nextImageToBig = true; break; } nb++; } //} if (_htmlImages.Count > nb) { if (_trace) { pb.Trace.WriteLine($"GetImages() : send paragraph \"{_imageSeparationParagraphStyle}\""); } yield return(new OXmlParagraphElement { Style = _imageSeparationParagraphStyle }); } else { if (_trace) { pb.Trace.WriteLine("GetImages() : send paragraph"); } yield return(new OXmlParagraphElement()); } if (nb == 1) { OXmlPictureDrawing pictureDrawing; if (htmlImage.NoneAlign || nextImageToBig || (endOfDocument && _htmlImages.Count == 1)) { // Inline if (_trace) { pb.Trace.WriteLine($"GetImages() : send picture inline \"{zPath.GetFileName(htmlImage.File)}\""); } //pictureDrawing = new OXmlInlinePictureDrawing(); pictureDrawing = new OXmlAnchorPictureDrawing { Wrap = new OXmlAnchorWrapTopAndBottom(), HorizontalPosition = new OXmlHorizontalPosition { RelativeFrom = DW.HorizontalRelativePositionValues.Margin, HorizontalAlignment = "center" }, VerticalPosition = new OXmlVerticalPosition { RelativeFrom = DW.VerticalRelativePositionValues.Line, VerticalAlignment = "top" } }; } else { // AnchorWrapSquare if (_trace) { pb.Trace.WriteLine($"GetImages() : send picture anchor wrap square \"{zPath.GetFileName(htmlImage.File)}\""); } pictureDrawing = new OXmlAnchorPictureDrawing { //Wrap = new OXmlAnchorWrapSquare { DistanceFromLeft = htmlImage.RightAlign ? _imageHorizontalBorder : 0, DistanceFromRight = htmlImage.RightAlign ? 0 : _imageHorizontalBorder }, Wrap = new OXmlAnchorWrapSquare(), DistanceFromLeft = htmlImage.RightAlign ? _imageHorizontalBorder : null, DistanceFromRight = htmlImage.RightAlign ? null : _imageHorizontalBorder, HorizontalPosition = new OXmlHorizontalPosition { RelativeFrom = DW.HorizontalRelativePositionValues.Margin, HorizontalAlignment = htmlImage.RightAlign ? "right" : "left" }, VerticalPosition = new OXmlVerticalPosition { RelativeFrom = DW.VerticalRelativePositionValues.Line, VerticalAlignment = "top" } }; } yield return(new OXmlPictureElement { File = htmlImage.File, Width = htmlImage.Width, Height = htmlImage.Height, PictureDrawing = pictureDrawing }); _htmlImages.RemoveAt(0); } else { // AnchorWrapTopAndBottom int position = _imageHorizontalLeftMarge; while (nb > 0) { if (_trace) { pb.Trace.WriteLine($"GetImages() : send picture anchor wrap top and bottom \"{zPath.GetFileName(htmlImage.File)}\""); } htmlImage = _htmlImages[0]; yield return(new OXmlPictureElement { File = htmlImage.File, Width = htmlImage.Width, Height = htmlImage.Height, PictureDrawing = new OXmlAnchorPictureDrawing { Wrap = new OXmlAnchorWrapTopAndBottom(), HorizontalPosition = new OXmlHorizontalPosition { RelativeFrom = DW.HorizontalRelativePositionValues.Margin, PositionOffset = position }, VerticalPosition = new OXmlVerticalPosition { RelativeFrom = DW.VerticalRelativePositionValues.Line, VerticalAlignment = "top" } } }); position += (int)htmlImage.Width + _imageHorizontalMarge; _htmlImages.RemoveAt(0); nb--; } } } //yield return new OXmlPictureElement //{ // File = htmlImage.File, // Width = htmlImage.Width, // Height = htmlImage.Height, // PictureDrawing = new OXmlAnchorPictureDrawing // { // // SquareSize = 21800 // //Wrap = new OXmlAnchorWrapTight { WrapPolygon = OXmlDoc.CreateWrapPolygon(21800) }, // Wrap = new OXmlAnchorWrapTight { WrapPolygon = new OXmlSquare { HorizontalSize = 21800 } }, // HorizontalRelativeFrom = DW.HorizontalRelativePositionValues.Margin, // HorizontalPositionOffset = horizontalPosition, // VerticalRelativeFrom = DW.VerticalRelativePositionValues.Paragraph, // VerticalPositionOffset = verticalPosition // } //}; }
public override void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options) { if (value == null) { throw new PBException("serialize OXmlPictureElement value is null"); } if (_trace) { pb.Trace.WriteLine("OXmlPictureElementSerializer.Serialize()"); } OXmlPictureElement element = (OXmlPictureElement)value; bsonWriter.WriteStartDocument(); bsonWriter.WriteString("Type", "Picture"); bsonWriter.WriteString("File", element.File); if (element.Name != null) { bsonWriter.WriteString("Name", element.Name); } if (element.Description != null) { bsonWriter.WriteString("Description", element.Description); } if (element.Width != null) { bsonWriter.WriteInt32("Width", (int)element.Width); } if (element.Height != null) { bsonWriter.WriteInt32("Height", (int)element.Height); } if (element.Rotation != 0) { bsonWriter.WriteInt32("Rotation", element.Rotation); } if (element.HorizontalFlip) { bsonWriter.WriteBoolean("HorizontalFlip", element.HorizontalFlip); } if (element.VerticalFlip) { bsonWriter.WriteBoolean("VerticalFlip", element.VerticalFlip); } if (element.CompressionState != A.BlipCompressionValues.Print) { bsonWriter.WriteString("CompressionState", element.CompressionState.ToString()); } if (element.PresetShape != A.ShapeTypeValues.Rectangle) { bsonWriter.WriteString("PresetShape", element.PresetShape.ToString()); } //bsonWriter.WriteString("DrawingMode", element.PictureDrawing.DrawingMode.ToString()); bsonWriter.WriteString("DrawingType", element.PictureDrawing.GetDrawingType().ToString()); if (element.PictureDrawing.DrawingMode == OXmlPictureDrawingMode.Anchor) { OXmlAnchorPictureDrawing anchor = (OXmlAnchorPictureDrawing)element.PictureDrawing; //bsonWriter.WriteString("WrapType", anchor.Wrap.WrapType.ToString()); if (anchor.AnchorId != null) { bsonWriter.WriteString("AnchorId", anchor.AnchorId); } if (anchor.EditId != null) { bsonWriter.WriteString("EditId", anchor.AnchorId); } if (anchor.DistanceFromTop != null) { bsonWriter.WriteInt32("DistanceFromTop", (int)anchor.DistanceFromTop); } if (anchor.DistanceFromBottom != null) { bsonWriter.WriteInt32("DistanceFromBottom", (int)anchor.DistanceFromBottom); } if (anchor.DistanceFromLeft != null) { bsonWriter.WriteInt32("DistanceFromLeft", (int)anchor.DistanceFromLeft); } if (anchor.DistanceFromRight != null) { bsonWriter.WriteInt32("DistanceFromRight", (int)anchor.DistanceFromRight); } bsonWriter.WriteString("HorizontalRelativeFrom", anchor.HorizontalPosition.RelativeFrom.ToString()); if (anchor.HorizontalPosition.PositionOffset != null) { bsonWriter.WriteInt32("HorizontalPositionOffset", (int)anchor.HorizontalPosition.PositionOffset); } if (anchor.HorizontalPosition.HorizontalAlignment != null) { bsonWriter.WriteString("HorizontalAlignment", anchor.HorizontalPosition.HorizontalAlignment); } bsonWriter.WriteString("VerticalRelativeFrom", anchor.VerticalPosition.RelativeFrom.ToString()); if (anchor.VerticalPosition.PositionOffset != null) { bsonWriter.WriteInt32("VerticalPositionOffset", (int)anchor.VerticalPosition.PositionOffset); } if (anchor.VerticalPosition.VerticalAlignment != null) { bsonWriter.WriteString("VerticalAlignment", anchor.VerticalPosition.VerticalAlignment); } SerializeEffectExtent(bsonWriter, anchor.EffectExtent); if (anchor.AllowOverlap) { bsonWriter.WriteBoolean("AllowOverlap", anchor.AllowOverlap); } if (anchor.BehindDoc) { bsonWriter.WriteBoolean("BehindDoc", anchor.BehindDoc); } if (anchor.Hidden) { bsonWriter.WriteBoolean("Hidden", anchor.Hidden); } if (anchor.LayoutInCell) { bsonWriter.WriteBoolean("LayoutInCell", anchor.LayoutInCell); } if (anchor.Locked) { bsonWriter.WriteBoolean("Locked", anchor.Locked); } if (anchor.RelativeHeight != 0) { bsonWriter.WriteInt32("RelativeHeight", anchor.RelativeHeight); } if (anchor.SimplePosition != null) { bsonWriter.WriteStartDocument("SimplePosition"); bsonWriter.WriteInt64("X", anchor.SimplePosition.X); bsonWriter.WriteInt64("Y", anchor.SimplePosition.Y); bsonWriter.WriteEndDocument(); } switch (anchor.Wrap.WrapType) { case OXmlAnchorWrapType.WrapSquare: SerializeWrapSquare(bsonWriter, (OXmlAnchorWrapSquare)anchor.Wrap); break; case OXmlAnchorWrapType.WrapTight: SerializeWrapTight(bsonWriter, (OXmlAnchorWrapTight)anchor.Wrap); break; case OXmlAnchorWrapType.WrapTopAndBottom: SerializeWrapTopBottom(bsonWriter, (OXmlAnchorWrapTopAndBottom)anchor.Wrap); break; default: throw new PBException($"WrapType {anchor.Wrap.WrapType} serialize not implemented"); } } bsonWriter.WriteEndDocument(); }