diff --git a/OpenXmlPowerTools/ChartUpdater.cs b/OpenXmlPowerTools/ChartUpdater.cs index 79b0f74b..18f3ad48 100644 --- a/OpenXmlPowerTools/ChartUpdater.cs +++ b/OpenXmlPowerTools/ChartUpdater.cs @@ -400,7 +400,8 @@ private static void UpdateEmbeddedWorkbook(ChartPart chartPart, ChartData chartD var embeddedSpreadsheet = chartPart.GetPartById(embeddedSpreadsheetRid); if (embeddedSpreadsheet != null) { - using (SpreadsheetDocument sDoc = SpreadsheetDocument.Open(embeddedSpreadsheet.GetStream(), true)) + using (Stream spreadsheetStream = embeddedSpreadsheet.GetStream()) + using (SpreadsheetDocument sDoc = SpreadsheetDocument.Open(spreadsheetStream, true)) { var workbookPart = sDoc.WorkbookPart; var wbRoot = workbookPart.GetXDocument().Root; diff --git a/OpenXmlPowerTools/PresentationBuilder.cs b/OpenXmlPowerTools/PresentationBuilder.cs index 9d6de5e4..c151e554 100644 --- a/OpenXmlPowerTools/PresentationBuilder.cs +++ b/OpenXmlPowerTools/PresentationBuilder.cs @@ -336,7 +336,10 @@ private static void CopyPresentationParts(PresentationDocument sourceDocument, P foreach (var legacyDocTextInfo in sourceDocument.PresentationPart.Parts.Where(p => p.OpenXmlPart.RelationshipType == "http://schemas.microsoft.com/office/2006/relationships/legacyDocTextInfo")) { LegacyDiagramTextInfoPart newPart = newDocument.PresentationPart.AddNewPart(); - newPart.FeedData(legacyDocTextInfo.OpenXmlPart.GetStream()); + using (var stream = legacyDocTextInfo.OpenXmlPart.GetStream()) + { + newPart.FeedData(stream); + } } var listOfRootChildren = newPresentation.Root.Elements().ToList(); @@ -383,7 +386,10 @@ private static XElement CreatedEmbeddedFontPart(PresentationDocument sourceDocum fpt = FontPartType.FontOdttf; var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16); var newFontPart = newDocument.PresentationPart.AddFontPart(fpt, newId); - newFontPart.FeedData(oldFontPart.GetStream()); + using (var stream = oldFontPart.GetStream()) + { + newFontPart.FeedData(stream); + } newRegular = new XElement(fontXName, new XAttribute(R.id, newId)); return newRegular; @@ -931,12 +937,18 @@ private static void CopyRelatedPartsForContentParts(PresentationDocument newDocu if (oldPartIdPair9 != null) { CustomXmlPart newPart = newDocument.PresentationPart.AddCustomXmlPart(CustomXmlPartType.CustomXml); - newPart.FeedData(oldPartIdPair9.OpenXmlPart.GetStream()); + using (var stream = oldPartIdPair9.OpenXmlPart.GetStream()) + { + newPart.FeedData(stream); + } foreach (var itemProps in oldPartIdPair9.OpenXmlPart.Parts.Where(p => p.OpenXmlPart.ContentType == "application/vnd.openxmlformats-officedocument.customXmlProperties+xml")) { var newId2 = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16); CustomXmlPropertiesPart cxpp = newPart.AddNewPart("application/vnd.openxmlformats-officedocument.customXmlProperties+xml", newId2); - cxpp.FeedData(itemProps.OpenXmlPart.GetStream()); + using (var stream = itemProps.OpenXmlPart.GetStream()) + { + cxpp.FeedData(stream); + } } var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16); newContentPart.CreateRelationshipToPart(newPart, newId); @@ -1057,6 +1069,21 @@ private static void CopyChartObjects(ChartPart oldChart, ChartPart newChart) dataReference.Attribute(R.id).Value = newChart.GetIdOfPart(newPart); continue; } + ExtendedPart extendedPart = oldPartIdPair.OpenXmlPart as ExtendedPart; + if (extendedPart != null) + { + ExtendedPart newPart = newChart.AddExtendedPart(extendedPart.RelationshipType, extendedPart.ContentType, ".dat"); + using (Stream oldObject = extendedPart.GetStream(FileMode.Open, FileAccess.Read)) + using (Stream newObject = newPart.GetStream(FileMode.Create, FileAccess.ReadWrite)) + { + int byteCount; + byte[] buffer = new byte[65536]; + while ((byteCount = oldObject.Read(buffer, 0, 65536)) != 0) + newObject.Write(buffer, 0, byteCount); + } + dataReference.Attribute(R.id).Value = newChart.GetIdOfPart(newPart); + continue; + } EmbeddedObjectPart oldEmbeddedObjectPart = oldPartIdPair.OpenXmlPart as EmbeddedObjectPart; if (oldEmbeddedObjectPart != null) { @@ -1350,7 +1377,10 @@ private static void CopyRelatedMedia(OpenXmlPart oldContentPart, OpenXmlPart new var ct = oldPart.ContentType; var ext = Path.GetExtension(oldPart.Uri.OriginalString); MediaDataPart newPart = newContentPart.OpenXmlPackage.CreateMediaDataPart(ct, ext); - newPart.FeedData(oldPart.GetStream()); + using (var stream = oldPart.GetStream()) + { + newPart.FeedData(stream); + } string id = null; string relationshipType = null; @@ -1490,7 +1520,10 @@ private static void CopyInkPart(OpenXmlPart oldContentPart, OpenXmlPart newConte var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16); CustomXmlPart newPart = newContentPart.AddNewPart("application/inkml+xml", newId); - newPart.FeedData(oldPart.GetStream()); + using (var stream = oldPart.GetStream()) + { + newPart.FeedData(stream); + } contentPartReference.Attribute(attributeName).Value = newId; } @@ -1508,8 +1541,11 @@ private static void CopyActiveXPart(OpenXmlPart oldContentPart, OpenXmlPart newC var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16); EmbeddedControlPersistencePart newPart = newContentPart.AddNewPart("application/vnd.ms-office.activeX+xml", newId); - - newPart.FeedData(oldPart.GetStream()); + + using (var stream = oldPart.GetStream()) + { + newPart.FeedData(stream); + } activeXPartReference.Attribute(attributeName).Value = newId; if (newPart.ContentType == "application/vnd.ms-office.activeX+xml") @@ -1521,8 +1557,11 @@ private static void CopyActiveXPart(OpenXmlPart oldContentPart, OpenXmlPart newC var newId2 = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16); EmbeddedControlPersistenceBinaryDataPart newPersistencePart = newPart.AddNewPart("application/vnd.ms-office.activeX", newId2); - - newPersistencePart.FeedData(oldPersistencePart.GetStream()); + + using (var stream = oldPersistencePart.GetStream()) + { + newPersistencePart.FeedData(stream); + } axc.Root.Attribute(R.id).Value = newId2; newPart.PutXDocument(); } @@ -1544,7 +1583,10 @@ private static void CopyLegacyDiagramText(OpenXmlPart oldContentPart, OpenXmlPar var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16); LegacyDiagramTextPart newPart = newContentPart.AddNewPart(newId); - newPart.FeedData(oldPart.GetStream()); + using (var stream = oldPart.GetStream()) + { + newPart.FeedData(stream); + } textdataReference.Attribute(attributeName).Value = newId; } @@ -1714,7 +1756,10 @@ private static void CopyExtendedPart(OpenXmlPart oldContentPart, OpenXmlPart new newPart = ((XmlSignaturePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension); relId = newContentPart.GetIdOfPart(newPart); - newPart.FeedData(oldPart.GetStream()); + using (Stream sourceStream = oldPart.GetStream()) + { + newPart.FeedData(sourceStream); + } extendedReference.Attribute(attributeName).Value = relId; } catch (ArgumentOutOfRangeException) @@ -1778,7 +1823,10 @@ private static void CopyRelatedSound(PresentationDocument newDocument, OpenXmlPa { AudioReferenceRelationship temp = (AudioReferenceRelationship)oldContentPart.GetReferenceRelationship(relId); MediaDataPart newSound = newDocument.CreateMediaDataPart(temp.DataPart.ContentType); - newSound.FeedData(temp.DataPart.GetStream()); + using (var stream = temp.DataPart.GetStream()) + { + newSound.FeedData(stream); + } AudioReferenceRelationship newRel = null; if (newContentPart is SlidePart) @@ -1799,7 +1847,10 @@ private static void CopyRelatedSound(PresentationDocument newDocument, OpenXmlPa { MediaReferenceRelationship temp = (MediaReferenceRelationship)oldContentPart.GetReferenceRelationship(relId); MediaDataPart newSound = newDocument.CreateMediaDataPart(temp.DataPart.ContentType); - newSound.FeedData(temp.DataPart.GetStream()); + using (var stream = temp.DataPart.GetStream()) + { + newSound.FeedData(stream); + } MediaReferenceRelationship newRel = null; if (newContentPart is SlidePart) diff --git a/OpenXmlPowerTools/PtOpenXmlDocument.cs b/OpenXmlPowerTools/PtOpenXmlDocument.cs index 86e49db3..ce2ac570 100644 --- a/OpenXmlPowerTools/PtOpenXmlDocument.cs +++ b/OpenXmlPowerTools/PtOpenXmlDocument.cs @@ -339,11 +339,12 @@ private static Type GetDocumentType(byte[] bytes) public static void SavePartAs(OpenXmlPart part, string filePath) { - Stream partStream = part.GetStream(FileMode.Open, FileAccess.Read); - byte[] partContent = new byte[partStream.Length]; - partStream.Read(partContent, 0, (int)partStream.Length); - - File.WriteAllBytes(filePath, partContent); + using (Stream partStream = part.GetStream(FileMode.Open, FileAccess.Read)) + { + byte[] partContent = new byte[partStream.Length]; + partStream.Read(partContent, 0, (int)partStream.Length); + File.WriteAllBytes(filePath, partContent); + } } }