Exemplo n.º 1
0
        protected Drawing AddImagePart(Uri imageUrl, string imageSource, string alt, Size preferredSize)
        {
            if (imageObjId == UInt32.MinValue)
            {
                // In order to add images in the document, we need to asisgn an unique id
                // to each Drawing object. So we'll loop through all of the existing <wp:docPr> elements
                // to find the largest Id, then increment it for each new image.

                drawingObjId = 1;                 // 1 is the minimum ID set by MS Office.
                imageObjId   = 1;
                foreach (var d in mainPart.Document.Body.Descendants <Drawing>())
                {
                    if (d.Inline == null)
                    {
                        continue;                                       // fix some rare issue where Inline is null (reported by scwebgroup)
                    }
                    if (d.Inline.DocProperties.Id > drawingObjId)
                    {
                        drawingObjId = d.Inline.DocProperties.Id;
                    }

                    var nvPr = d.Inline.Graphic.GraphicData.GetFirstChild <pic.NonVisualPictureProperties>();
                    if (nvPr != null && nvPr.NonVisualDrawingProperties.Id > imageObjId)
                    {
                        imageObjId = nvPr.NonVisualDrawingProperties.Id;
                    }
                }
                if (drawingObjId > 1)
                {
                    drawingObjId++;
                }
                if (imageObjId > 1)
                {
                    imageObjId++;
                }
            }

            // Cache all the ImagePart processed to avoid downloading the same image.
            CachedImagePart imagePart = null;

            // if imageUrl is null, we may consider imageSource is a DataUri.
            // thus, no need to download and cache anything
            if (imageUrl == null || !knownImageParts.TryGetValue(imageUrl, out imagePart))
            {
                HtmlImageInfo iinfo = new HtmlImageInfo()
                {
                    Size = preferredSize
                };
                ImageProvisioningProvider provider = new ImageProvisioningProvider(this.WebProxy, iinfo);

                if (imageUrl == null)
                {
                    provider.DownloadData(DataUri.Parse(imageSource));
                }
                else if (this.ImageProcessing == ImageProcessing.ManualProvisioning)
                {
                    // as HtmlImageInfo is a class, the EventArgs will act as a proxy
                    ProvisionImageEventArgs args = new ProvisionImageEventArgs(imageUrl, iinfo);
                    OnProvisionImage(args);

                    // did the user want to ignore this image?
                    if (args.Cancel)
                    {
                        return(null);
                    }
                }

                // Automatic Processing or the user did not supply himself the image and did not cancel the provisioning.
                // We download ourself the image.
                if (iinfo.RawData == null && imageUrl.IsAbsoluteUri)
                {
                    provider.DownloadData(imageUrl);
                }

                if (iinfo.RawData == null || !provider.Provision(imageUrl))
                {
                    return(null);
                }

                ImagePart ipart = mainPart.AddImagePart(iinfo.Type.Value);
                imagePart = new CachedImagePart()
                {
                    Part = ipart
                };
                imagePart.Width  = iinfo.Size.Width;
                imagePart.Height = iinfo.Size.Height;

                using (Stream outputStream = ipart.GetStream(FileMode.Create))
                {
                    outputStream.Write(iinfo.RawData, 0, iinfo.RawData.Length);
                    outputStream.Seek(0L, SeekOrigin.Begin);
                }

                if (imageUrl != null)                 // don't need to cache inlined-image
                {
                    knownImageParts.Add(imageUrl, imagePart);
                }
            }

            if (preferredSize.IsEmpty)
            {
                preferredSize.Width  = imagePart.Width;
                preferredSize.Height = imagePart.Height;
            }
            else if (preferredSize.Width <= 0 || preferredSize.Height <= 0)
            {
                Size actualSize = new Size(imagePart.Width, imagePart.Height);
                preferredSize = ImageHeader.KeepAspectRatio(actualSize, preferredSize);
            }

            string imagePartId  = mainPart.GetIdOfPart(imagePart.Part);
            long   widthInEmus  = new Unit(UnitMetric.Pixel, preferredSize.Width).ValueInEmus;
            long   heightInEmus = new Unit(UnitMetric.Pixel, preferredSize.Height).ValueInEmus;

            ++drawingObjId;
            ++imageObjId;

            var img = new Drawing(
                new wp.Inline(
                    new wp.Extent()
            {
                Cx = widthInEmus, Cy = heightInEmus
            },
                    new wp.EffectExtent()
            {
                LeftEdge = 19050L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L
            },
                    new wp.DocProperties()
            {
                Id = drawingObjId, Name = imageSource, Description = string.Empty
            },
                    new wp.NonVisualGraphicFrameDrawingProperties {
                GraphicFrameLocks = new a.GraphicFrameLocks()
                {
                    NoChangeAspect = true
                }
            },
                    new a.Graphic(
                        new a.GraphicData(
                            new pic.Picture(
                                new pic.NonVisualPictureProperties {
                NonVisualDrawingProperties = new pic.NonVisualDrawingProperties()
                {
                    Id = imageObjId, Name = imageSource, Description = alt
                },
                NonVisualPictureDrawingProperties = new pic.NonVisualPictureDrawingProperties(
                    new a.PictureLocks()
                {
                    NoChangeAspect = true, NoChangeArrowheads = true
                })
            },
                                new pic.BlipFill(
                                    new a.Blip()
            {
                Embed = imagePartId
            },
                                    new a.SourceRectangle(),
                                    new a.Stretch(
                                        new a.FillRectangle())),
                                new pic.ShapeProperties(
                                    new a.Transform2D(
                                        new a.Offset()
            {
                X = 0L, Y = 0L
            },
                                        new a.Extents()
            {
                Cx = widthInEmus, Cy = heightInEmus
            }),
                                    new a.PresetGeometry(
                                        new a.AdjustValueList()
                                        )
            {
                Preset = a.ShapeTypeValues.Rectangle
            }
                                    )
            {
                BlackWhiteMode = a.BlackWhiteModeValues.Auto
            })
                            )
            {
                Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"
            })
                    )
            {
                DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U
            }
                );

            return(img);
        }
 internal ProvisionImageEventArgs(Uri uri, HtmlImageInfo info)
 {
     this.ImageUrl = uri;
     this.info     = info;
 }
Exemplo n.º 3
0
 public ImageProvisioningProvider(WebProxy proxy, HtmlImageInfo image)
 {
     this.proxy = proxy;
     this.imageInfo = image;
 }
Exemplo n.º 4
0
 internal ProvisionImageEventArgs(Uri uri, HtmlImageInfo info)
 {
     this.ImageUrl = uri;
     this.info = info;
 }
Exemplo n.º 5
0
        private Drawing AddImagePart(Uri imageUrl, String imageSource, String alt, Size preferredSize)
        {
            if (imageObjId == UInt32.MinValue)
            {
                // In order to add images in the document, we need to asisgn an unique id
                // to each Drawing object. So we'll loop through all of the existing <wp:docPr> elements
                // to find the largest Id, then increment it for each new image.

                drawingObjId = 1; // 1 is the minimum ID set by MS Office.
                imageObjId = 1;
                foreach (var d in mainPart.Document.Body.Descendants<Drawing>())
                {
                    if (d.Inline == null) continue; // fix some rare issue where Inline is null (reported by scwebgroup)
                    if (d.Inline.DocProperties.Id > drawingObjId) drawingObjId = d.Inline.DocProperties.Id;

                    var nvPr = d.Inline.Graphic.GraphicData.GetFirstChild<pic.NonVisualPictureProperties>();
                    if (nvPr != null && nvPr.NonVisualDrawingProperties.Id > imageObjId)
                        imageObjId = nvPr.NonVisualDrawingProperties.Id;
                }
                if (drawingObjId > 1) drawingObjId++;
                if (imageObjId > 1) imageObjId++;
            }

            // Cache all the ImagePart processed to avoid downloading the same image.
            CachedImagePart imagePart = null;

            // if imageUrl is null, we may consider imageSource is a DataUri.
            // thus, no need to download and cache anything
            if (imageUrl == null || !knownImageParts.TryGetValue(imageUrl, out imagePart))
            {
                HtmlImageInfo iinfo = new HtmlImageInfo() { Size = preferredSize };
                ImageProvisioningProvider provider = new ImageProvisioningProvider(this.WebProxy, iinfo);

                if (imageUrl == null)
                    provider.DownloadData(DataUri.Parse(imageSource));

                //TODO 屏蔽本地读取图片
                //else if (this.ImageProcessing == ImageProcessing.ManualProvisioning)
                //{
                //    // as HtmlImageInfo is a class, the EventArgs will act as a proxy
                //    ProvisionImageEventArgs args = new ProvisionImageEventArgs(imageUrl, iinfo);
                //    OnProvisionImage(args);

                //    // did the user want to ignore this image?
                //    if (args.Cancel) return null;
                //}

                // Automatic Processing or the user did not supply himself the image and did not cancel the provisioning.
                // We download ourself the image.
                if (iinfo.RawData == null && imageUrl.IsAbsoluteUri)
                    provider.DownloadData(imageUrl);

                if (iinfo.RawData == null || !provider.Provision(imageUrl)) return null;

                ImagePart ipart = mainPart.AddImagePart(iinfo.Type.Value);
                imagePart = new CachedImagePart() { Part = ipart };
                imagePart.Width = iinfo.Size.Width;
                imagePart.Height = iinfo.Size.Height;

                using (Stream outputStream = ipart.GetStream(FileMode.Create))
                {
                    outputStream.Write(iinfo.RawData, 0, iinfo.RawData.Length);
                    outputStream.Seek(0L, SeekOrigin.Begin);
                }

                if (imageUrl != null) // don't need to cache inlined-image
                    knownImageParts.Add(imageUrl, imagePart);
            }

            if (preferredSize.IsEmpty)
            {
                preferredSize.Width = imagePart.Width;
                preferredSize.Height = imagePart.Height;
            }
            else if (preferredSize.Width <= 0 || preferredSize.Height <= 0)
            {
                Size actualSize = new Size(imagePart.Width, imagePart.Height);
                preferredSize = ImageHeader.KeepAspectRatio(actualSize, preferredSize);
            }

            String imagePartId = mainPart.GetIdOfPart(imagePart.Part);
            long widthInEmus = new Unit(UnitMetric.Pixel, preferredSize.Width).ValueInEmus;
            long heightInEmus = new Unit(UnitMetric.Pixel, preferredSize.Height).ValueInEmus;

            ++drawingObjId;
            ++imageObjId;

            var img = new Drawing(
                new wp.Inline(
                    new wp.Extent() { Cx = widthInEmus, Cy = heightInEmus },
                    new wp.EffectExtent() { LeftEdge = 19050L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L },
                    new wp.DocProperties() { Id = drawingObjId, Name = imageSource, Description = String.Empty },
                    new wp.NonVisualGraphicFrameDrawingProperties {
                        GraphicFrameLocks = new a.GraphicFrameLocks() { NoChangeAspect = true }
                    },
                    new a.Graphic(
                        new a.GraphicData(
                            new pic.Picture(
                                new pic.NonVisualPictureProperties {
                                    NonVisualDrawingProperties = new pic.NonVisualDrawingProperties() { Id = imageObjId, Name = imageSource, Description = alt },
                                    NonVisualPictureDrawingProperties = new pic.NonVisualPictureDrawingProperties(
                                        new a.PictureLocks() { NoChangeAspect = true, NoChangeArrowheads = true })
                                },
                                new pic.BlipFill(
                                    new a.Blip() { Embed = imagePartId },
                                    new a.SourceRectangle(),
                                    new a.Stretch(
                                        new a.FillRectangle())),
                                new pic.ShapeProperties(
                                    new a.Transform2D(
                                        new a.Offset() { X = 0L, Y = 0L },
                                        new a.Extents() { Cx = widthInEmus, Cy = heightInEmus }),
                                    new a.PresetGeometry(
                                        new a.AdjustValueList()
                                    ) { Preset = a.ShapeTypeValues.Rectangle }
                                ) { BlackWhiteMode = a.BlackWhiteModeValues.Auto })
                        ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
                ) { DistanceFromTop = (UInt32Value) 0U, DistanceFromBottom = (UInt32Value) 0U, DistanceFromLeft = (UInt32Value) 0U, DistanceFromRight = (UInt32Value) 0U }
            );

            return img;
        }
 public ImageProvisioningProvider(WebProxy proxy, HtmlImageInfo image)
 {
     this.proxy     = proxy;
     this.imageInfo = image;
 }