From 20febc2f59e707de58cf1a63642249fdbe71c264 Mon Sep 17 00:00:00 2001 From: Andrei Atanasiu Date: Wed, 22 Jan 2020 10:13:56 +0100 Subject: [PATCH 1/6] Merge Himanshu's fix into the repository: https://github.com/EricWhiteDev/Open-Xml-PowerTools/pull/15/files --- OpenXmlPowerTools/PresentationBuilder.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/OpenXmlPowerTools/PresentationBuilder.cs b/OpenXmlPowerTools/PresentationBuilder.cs index 9d6de5e4..b570b647 100644 --- a/OpenXmlPowerTools/PresentationBuilder.cs +++ b/OpenXmlPowerTools/PresentationBuilder.cs @@ -1057,6 +1057,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) { From 849c78990b4e16deacb478c225025861253494e8 Mon Sep 17 00:00:00 2001 From: Markus Rudolph Date: Tue, 30 Jun 2020 14:54:55 +0200 Subject: [PATCH 2/6] Dispose opened stream --- OpenXmlPowerTools/PresentationBuilder.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenXmlPowerTools/PresentationBuilder.cs b/OpenXmlPowerTools/PresentationBuilder.cs index b570b647..812553c5 100644 --- a/OpenXmlPowerTools/PresentationBuilder.cs +++ b/OpenXmlPowerTools/PresentationBuilder.cs @@ -1729,7 +1729,8 @@ 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) From 0b2b0723be86b087ff788b8ade9153c1aeb9af30 Mon Sep 17 00:00:00 2001 From: Markus Rudolph Date: Thu, 2 Jul 2020 14:39:28 +0200 Subject: [PATCH 3/6] Fix similar bugs --- OpenXmlPowerTools/PresentationBuilder.cs | 34 ++++++++++++++++++------ 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/OpenXmlPowerTools/PresentationBuilder.cs b/OpenXmlPowerTools/PresentationBuilder.cs index 812553c5..25f0a0dd 100644 --- a/OpenXmlPowerTools/PresentationBuilder.cs +++ b/OpenXmlPowerTools/PresentationBuilder.cs @@ -383,7 +383,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; @@ -1365,7 +1368,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; @@ -1505,7 +1511,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; } @@ -1523,8 +1532,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") @@ -1536,8 +1548,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(); } @@ -1559,7 +1574,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; } From 0f8fbb44970451ec8d65050d06f6f8620a8d1566 Mon Sep 17 00:00:00 2001 From: Markus Rudolph Date: Thu, 2 Jul 2020 14:51:55 +0200 Subject: [PATCH 4/6] Closed further leaks --- OpenXmlPowerTools.sln.DotSettings | 1 + OpenXmlPowerTools/ChartUpdater.cs | 5 +++-- OpenXmlPowerTools/PresentationBuilder.cs | 27 +++++++++++++++++++----- OpenXmlPowerTools/PtOpenXmlDocument.cs | 11 +++++----- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/OpenXmlPowerTools.sln.DotSettings b/OpenXmlPowerTools.sln.DotSettings index bdfe054c..2fc0df90 100644 --- a/OpenXmlPowerTools.sln.DotSettings +++ b/OpenXmlPowerTools.sln.DotSettings @@ -233,6 +233,7 @@ Email: thomas<at/>barnekow<dot/>info True True True + True True True True diff --git a/OpenXmlPowerTools/ChartUpdater.cs b/OpenXmlPowerTools/ChartUpdater.cs index 79b0f74b..147ba5a7 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; @@ -427,7 +428,7 @@ private static void UpdateEmbeddedWorkbook(ChartPart chartPart, ChartData chartD var firstRow = new XElement(S.row, new XAttribute("r", "1"), new XAttribute("spans", string.Format("1:{0}", chartData.SeriesNames.Length + 1)), - new [] { new XElement(S.c, + new[] { new XElement(S.c, new XAttribute("r", "A1"), new XAttribute("t", "str"), new XElement(S.v, diff --git a/OpenXmlPowerTools/PresentationBuilder.cs b/OpenXmlPowerTools/PresentationBuilder.cs index 25f0a0dd..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(); @@ -934,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); @@ -1748,7 +1757,9 @@ private static void CopyExtendedPart(OpenXmlPart oldContentPart, OpenXmlPart new relId = newContentPart.GetIdOfPart(newPart); using (Stream sourceStream = oldPart.GetStream()) + { newPart.FeedData(sourceStream); + } extendedReference.Attribute(attributeName).Value = relId; } catch (ArgumentOutOfRangeException) @@ -1812,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) @@ -1833,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); + } } } From 8fbd823fd4c8e88f5d6445c2cecdc139b0bf6d9c Mon Sep 17 00:00:00 2001 From: Markus Rudolph Date: Thu, 2 Jul 2020 14:57:23 +0200 Subject: [PATCH 5/6] Dont need --- OpenXmlPowerTools.sln.DotSettings | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenXmlPowerTools.sln.DotSettings b/OpenXmlPowerTools.sln.DotSettings index 2fc0df90..bdfe054c 100644 --- a/OpenXmlPowerTools.sln.DotSettings +++ b/OpenXmlPowerTools.sln.DotSettings @@ -233,7 +233,6 @@ Email: thomas<at/>barnekow<dot/>info True True True - True True True True From 7f77143648dad9abbe0f7abbf914d649afcdf025 Mon Sep 17 00:00:00 2001 From: Markus Rudolph Date: Thu, 2 Jul 2020 15:06:50 +0200 Subject: [PATCH 6/6] Dont need --- OpenXmlPowerTools/ChartUpdater.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenXmlPowerTools/ChartUpdater.cs b/OpenXmlPowerTools/ChartUpdater.cs index 147ba5a7..18f3ad48 100644 --- a/OpenXmlPowerTools/ChartUpdater.cs +++ b/OpenXmlPowerTools/ChartUpdater.cs @@ -428,7 +428,7 @@ private static void UpdateEmbeddedWorkbook(ChartPart chartPart, ChartData chartD var firstRow = new XElement(S.row, new XAttribute("r", "1"), new XAttribute("spans", string.Format("1:{0}", chartData.SeriesNames.Length + 1)), - new[] { new XElement(S.c, + new [] { new XElement(S.c, new XAttribute("r", "A1"), new XAttribute("t", "str"), new XElement(S.v,