internal ExcelPicture(ExcelDrawings drawings, XmlNode node, ExcelGroupShape shape = null) : base(drawings, node, "xdr:pic", "xdr:nvPicPr/xdr:cNvPr", shape) { XmlNode picNode = node.SelectSingleNode("xdr:pic/xdr:blipFill/a:blip", drawings.NameSpaceManager); if (picNode != null) { IPictureContainer container = this; container.RelPic = drawings.Part.GetRelationship(picNode.Attributes["r:embed"].Value); container.UriPic = UriHelper.ResolvePartUri(drawings.UriDrawing, container.RelPic.TargetUri); Part = drawings.Part.Package.GetPart(container.UriPic); FileInfo f = new FileInfo(container.UriPic.OriginalString); ContentType = PictureStore.GetContentType(f.Extension); _image = Image.FromStream(Part.GetStream()); #if (Core) byte[] iby = ImageCompat.GetImageAsByteArray(_image); #else ImageConverter ic = new ImageConverter(); var iby = (byte[])ic.ConvertTo(_image, typeof(byte[])); #endif var ii = _drawings._package.PictureStore.LoadImage(iby, container.UriPic, Part); container.ImageHash = ii.Hash; } }
} //Add a new image to the compare collection internal static string SavePicture(Image image, IPictureContainer container) { #if (Core) byte[] img = ImageCompat.GetImageAsByteArray(image); #else ImageConverter ic = new ImageConverter(); byte[] img = (byte[])ic.ConvertTo(image, typeof(byte[])); #endif var store = container.RelationDocument.Package.PictureStore; var ii = store.AddImage(img); container.ImageHash = ii.Hash; var hashes = container.RelationDocument.Hashes; if (hashes.ContainsKey(ii.Hash)) { var relID = hashes[ii.Hash].RelId; var rel = container.RelationDocument.RelatedPart.GetRelationship(relID); container.UriPic = UriHelper.ResolvePartUri(rel.SourceUri, rel.TargetUri); return(relID); } else { container.UriPic = ii.Uri; container.ImageHash = ii.Hash; } //Set the Image and save it to the package. container.RelPic = container.RelationDocument.RelatedPart.CreateRelationship(UriHelper.GetRelativeUri(container.RelationDocument.RelatedUri, container.UriPic), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image"); //AddNewPicture(img, picRelation.Id); hashes.Add(ii.Hash, new HashInfo(container.RelPic.Id)); return(container.RelPic.Id); }
internal override void DeleteMe() { IPictureContainer container = this; _drawings._package.PictureStore.RemoveImage(container.ImageHash, this); base.DeleteMe(); }
private void SaveImageToPackage(ePictureType type, byte[] img) { var package = _drawings.Worksheet._package.ZipPackage; ContentType = PictureStore.GetContentType(type.ToString()); IPictureContainer container = this; container.UriPic = GetNewUri(package, "/xl/media/image{0}." + type.ToString()); var store = _drawings._package.PictureStore; var ii = store.AddImage(img, container.UriPic, ContentType); string relId; if (!_drawings._hashes.ContainsKey(ii.Hash)) { Part = ii.Part; container.RelPic = _drawings.Part.CreateRelationship(UriHelper.GetRelativeUri(_drawings.UriDrawing, ii.Uri), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image"); relId = container.RelPic.Id; _drawings._hashes.Add(ii.Hash, new HashInfo(relId)); AddNewPicture(img, relId); } else { relId = _drawings._hashes[ii.Hash].RelId; var rel = _drawings.Part.GetRelationship(relId); container.UriPic = UriHelper.ResolvePartUri(rel.SourceUri, rel.TargetUri); } container.ImageHash = ii.Hash; _image = Image.FromStream(new MemoryStream(img)); SetPosDefaults(_image); //Create relationship TopNode.SelectSingleNode("xdr:pic/xdr:blipFill/a:blip/@r:embed", NameSpaceManager).Value = relId; package.Flush(); }
internal override void DeleteMe() { if (Fill.Style == eFillStyle.BlipFill) { IPictureContainer container = Fill.BlipFill; _drawings._package.PictureStore.RemoveImage(container.ImageHash, this); } base.DeleteMe(); }
internal static Image GetPicture(string relId, IPictureContainer container, out string contentType) { ZipPackagePart part; container.RelPic = container.RelationDocument.RelatedPart.GetRelationship(relId); container.UriPic = UriHelper.ResolvePartUri(container.RelationDocument.RelatedUri, container.RelPic.TargetUri); part = container.RelationDocument.RelatedPart.Package.GetPart(container.UriPic); var extension = Path.GetExtension(container.UriPic.OriginalString); contentType = GetContentType(extension); return(Image.FromStream(part.GetStream())); }
internal ExcelPicture(ExcelDrawings drawings, XmlNode node, FileInfo imageFile, Uri hyperlink) : base(drawings, node, "xdr:pic", "xdr:nvPicPr/xdr:cNvPr") { CreatePicNode(node); //Changed to stream 2/4-13 (issue 14834). Thnx SClause var package = drawings.Worksheet._package.Package; ContentType = PictureStore.GetContentType(imageFile.Extension); var imagestream = new FileStream(imageFile.FullName, FileMode.Open, FileAccess.Read); _image = Image.FromStream(imagestream); Hyperlink = hyperlink; #if (Core) var img = ImageCompat.GetImageAsByteArray(_image); #else ImageConverter ic = new ImageConverter(); var img = (byte[])ic.ConvertTo(_image, typeof(byte[])); #endif IPictureContainer container = this; imagestream.Close(); container.UriPic = GetNewUri(package, "/xl/media/{0}" + imageFile.Name); var store = _drawings._package.PictureStore; var ii = store.AddImage(img, container.UriPic, ContentType); string relId; if (!_drawings._hashes.ContainsKey(ii.Hash)) { Part = ii.Part; container.RelPic = drawings.Part.CreateRelationship(UriHelper.GetRelativeUri(drawings.UriDrawing, ii.Uri), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image"); relId = container.RelPic.Id; _drawings._hashes.Add(ii.Hash, new HashInfo(relId)); AddNewPicture(img, relId); } else { relId = _drawings._hashes[ii.Hash].RelId; var rel = _drawings.Part.GetRelationship(relId); container.UriPic = UriHelper.ResolvePartUri(rel.SourceUri, rel.TargetUri); } container.ImageHash = ii.Hash; _height = Image.Height; _width = Image.Width; SetPosDefaults(Image); //Create relationship node.SelectSingleNode("xdr:pic/xdr:blipFill/a:blip/@r:embed", NameSpaceManager).Value = relId; package.Flush(); }
public async Task ValidateAsync(IPictureContainer pictureContainer) { if (pictureContainer == null) { throw new ArgumentNullException(nameof(pictureContainer)); } if (pictureContainer.PictureId.HasValue) { var department = await this.PictureDAL.GetAsync(new PictureIdentityModel(pictureContainer.PictureId.Value)); if (department == null) { throw new InvalidOperationException($"Picture not found by id {pictureContainer.PictureId}"); } } }
internal ExcelPicture(ExcelDrawings drawings, XmlNode node, ExcelGroupShape shape = null) : base(drawings, node, "xdr:pic", "xdr:nvPicPr/xdr:cNvPr", shape) { XmlNode picNode = node.SelectSingleNode("xdr:pic/xdr:blipFill/a:blip", drawings.NameSpaceManager); if (picNode != null) { IPictureContainer container = this; container.RelPic = drawings.Part.GetRelationship(picNode.Attributes["embed", ExcelPackage.schemaRelationships].Value); container.UriPic = UriHelper.ResolvePartUri(drawings.UriDrawing, container.RelPic.TargetUri); Part = drawings.Part.Package.GetPart(container.UriPic); var extension = Path.GetExtension(container.UriPic.OriginalString); ContentType = PictureStore.GetContentType(extension); #if (Core) try { _image = Image.FromStream(Part.GetStream()); } catch { if (extension.ToLower() == ".emf" || extension.ToLower() == ".wmf") //Not supported in linux environments, so we ignore them and set image to null. { _image = null; return; } else { throw; } } byte[] iby = ImageCompat.GetImageAsByteArray(_image); #else _image = Image.FromStream(Part.GetStream()); ImageConverter ic = new ImageConverter(); var iby = (byte[])ic.ConvertTo(_image, typeof(byte[])); #endif var ii = _drawings._package.PictureStore.LoadImage(iby, container.UriPic, Part); container.ImageHash = ii.Hash; } }
internal static Image GetPicture(string relId, IPictureContainer container, out string contentType) { ZipPackagePart part; //if (container.Drawing is ExcelChart chart) //{ // container.RelPic = chart.Part.GetRelationship(relId); // container.UriPic = UriHelper.ResolvePartUri(chart.UriChart, container.RelPic.TargetUri); // part = chart.Part.Package.GetPart(container.UriPic); //} //else //{ container.RelPic = container.RelationDocument.RelatedPart.GetRelationship(relId); container.UriPic = UriHelper.ResolvePartUri(container.RelationDocument.RelatedUri, container.RelPic.TargetUri); part = container.RelationDocument.RelatedPart.Package.GetPart(container.UriPic); //} FileInfo f = new FileInfo(container.UriPic.OriginalString); contentType = PictureStore.GetContentType(f.Extension); return(Image.FromStream(part.GetStream())); }
internal void RemoveImage(string hash, IPictureContainer container) { lock (_images) { if (_images.ContainsKey(hash)) { var ii = _images[hash]; ii.RefCount--; if (ii.RefCount == 0) { _pck.Package.DeletePart(ii.Uri); _images.Remove(hash); } } if (container.RelationDocument.Hashes.ContainsKey(hash)) { container.RelationDocument.Hashes[hash].RefCount--; if (container.RelationDocument.Hashes[hash].RefCount == 0) { container.RelationDocument.Hashes.Remove(hash); } } } }
private void CreateImageRelation(ExcelDrawingFill fill, XmlElement copyFromFillElement) { IPictureContainer pic = fill.BlipFill; }
private static void CopyDrawing(ExcelPackage pck, XmlNamespaceManager nsm, ExcelWorksheet Copy, ExcelWorksheet added) { //First copy the drawing XML string xml = Copy.Drawings.DrawingXml.OuterXml; var uriDraw = new Uri(string.Format("/xl/drawings/drawing{0}.xml", added.SheetId), UriKind.Relative); var part = pck.ZipPackage.CreatePart(uriDraw, "application/vnd.openxmlformats-officedocument.drawing+xml", pck.Compression); StreamWriter streamDrawing = new StreamWriter(part.GetStream(FileMode.Create, FileAccess.Write)); streamDrawing.Write(xml); streamDrawing.Flush(); XmlDocument drawXml = new XmlDocument(); drawXml.LoadXml(xml); //Add the relationship ID to the worksheet xml. var drawRelation = added.Part.CreateRelationship(UriHelper.GetRelativeUri(added.WorksheetUri, uriDraw), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/drawing"); XmlElement e = added.WorksheetXml.SelectSingleNode("//d:drawing", nsm) as XmlElement; e.SetAttribute("id", ExcelPackage.schemaRelationships, drawRelation.Id); for (int i = 0; i < Copy.Drawings.Count; i++) { ExcelDrawing draw = Copy.Drawings[i]; //draw.AdjustPositionAndSize(); //Adjust position for any change in normal style font/row size etc. if (draw is ExcelChart chart) { xml = chart.ChartXml.InnerXml; var UriChart = XmlHelper.GetNewUri(pck.ZipPackage, "/xl/charts/chart{0}.xml"); var chartPart = pck.ZipPackage.CreatePart(UriChart, ContentTypes.contentTypeChart, pck.Compression); StreamWriter streamChart = new StreamWriter(chartPart.GetStream(FileMode.Create, FileAccess.Write)); streamChart.Write(xml); streamChart.Flush(); //Now create the new relationship to the copied chart xml var prevRelID = draw.TopNode.SelectSingleNode("xdr:graphicFrame/a:graphic/a:graphicData/c:chart/@r:id", Copy.Drawings.NameSpaceManager).Value; var rel = part.CreateRelationship(UriHelper.GetRelativeUri(uriDraw, UriChart), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/chart"); XmlAttribute relAtt = drawXml.SelectSingleNode(string.Format("//c:chart/@r:id[.='{0}']", prevRelID), Copy.Drawings.NameSpaceManager) as XmlAttribute; relAtt.Value = rel.Id; } else if (draw is ExcelPicture pic) { IPictureContainer container = pic; var uri = container.UriPic; var img = PictureStore.ImageToByteArray(pic.Image); var ii = added.Workbook._package.PictureStore.AddImage(img, null, pic.ContentType); var rel = part.CreateRelationship(UriHelper.GetRelativeUri(added.WorksheetUri, ii.Uri), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image"); //Fixes problem with invalid image when the same image is used more than once. XmlNode relAtt = drawXml.SelectSingleNode( string.Format( "//xdr:pic/xdr:nvPicPr/xdr:cNvPr/@name[.='{0}']/../../../xdr:blipFill/a:blip/@r:embed", pic.Name), Copy.Drawings.NameSpaceManager); if (relAtt != null) { relAtt.Value = rel.Id; } } else if (draw is ExcelTableSlicer slicer) { var name = pck.Workbook.GetSlicerName(slicer.Name); var newSlicer = added.Drawings[i] as ExcelTableSlicer; newSlicer.Name = name; newSlicer.SlicerName = name; //The slicer still reference the copied slicers cache. We need to create a new cache for the copied slicer. newSlicer.CreateNewCache(); } else if (draw is ExcelPivotTableSlicer ptSlicer) { var name = pck.Workbook.GetSlicerName(ptSlicer.Name); var newSlicer = added.Drawings[i] as ExcelPivotTableSlicer; newSlicer.Name = name; newSlicer.SlicerName = name; //The slicer still reference the copied slicers cache. We need to create a new cache for the copied slicer. newSlicer.CreateNewCache(ptSlicer.Cache._field); } else if (draw is ExcelControl ctrl) { var UriCtrl = XmlHelper.GetNewUri(pck.ZipPackage, "/xl/ctrlProps/ctrlProp{0}.xml"); var ctrlPart = pck.ZipPackage.CreatePart(UriCtrl, ContentTypes.contentTypeControlProperties, pck.Compression); StreamWriter streamChart = new StreamWriter(ctrlPart.GetStream(FileMode.Create, FileAccess.Write)); streamChart.Write(ctrl.ControlPropertiesXml.OuterXml); streamChart.Flush(); var prevRelID = ctrl._control.RelationshipId; var rel = added.Part.CreateRelationship(UriHelper.GetRelativeUri(added.WorksheetUri, UriCtrl), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/ctrlProp"); XmlAttribute relAtt = added.WorksheetXml.SelectSingleNode(string.Format("//d:control/@r:id[.='{0}']", prevRelID), added.NameSpaceManager) as XmlAttribute; relAtt.Value = rel.Id; } } //rewrite the drawing xml with the new relID's streamDrawing = new StreamWriter(part.GetStream(FileMode.Create, FileAccess.Write)); streamDrawing.Write(drawXml.OuterXml); streamDrawing.Flush(); //Copy the size variables to the copy. for (int i = 0; i < Copy.Drawings.Count; i++) { var draw = Copy.Drawings[i]; var c = added.Drawings[i]; if (c != null) { c._left = draw._left; c._top = draw._top; c._height = draw._height; c._width = draw._width; } if (c is ExcelChart chart) { for (int j = 0; i < chart.Series.Count; i++) { var s = chart.Series[j]; var a = new ExcelAddressBase(s.Series); if (a.WorkSheetName.Equals(Copy.Name)) { s.Series = ExcelAddressBase.GetFullAddress(added.Name, a.LocalAddress); } a = new ExcelAddressBase(s.XSeries); if (a.WorkSheetName.Equals(Copy.Name)) { s.XSeries = ExcelAddressBase.GetFullAddress(added.Name, a.LocalAddress); } } } } }