Skip to content

Fix PresentationBuilder resource leak #25

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: vNext
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion OpenXmlPowerTools/ChartUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
79 changes: 65 additions & 14 deletions OpenXmlPowerTools/PresentationBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<LegacyDiagramTextInfoPart>();
newPart.FeedData(legacyDocTextInfo.OpenXmlPart.GetStream());
using (var stream = legacyDocTextInfo.OpenXmlPart.GetStream())
{
newPart.FeedData(stream);
}
}

var listOfRootChildren = newPresentation.Root.Elements().ToList();
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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<CustomXmlPropertiesPart>("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);
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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<CustomXmlPart>("application/inkml+xml", newId);

newPart.FeedData(oldPart.GetStream());
using (var stream = oldPart.GetStream())
{
newPart.FeedData(stream);
}
contentPartReference.Attribute(attributeName).Value = newId;
}

Expand All @@ -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<EmbeddedControlPersistencePart>("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")
Expand All @@ -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<EmbeddedControlPersistenceBinaryDataPart>("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();
}
Expand All @@ -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<LegacyDiagramTextPart>(newId);

newPart.FeedData(oldPart.GetStream());
using (var stream = oldPart.GetStream())
{
newPart.FeedData(stream);
}
textdataReference.Attribute(attributeName).Value = newId;
}

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
11 changes: 6 additions & 5 deletions OpenXmlPowerTools/PtOpenXmlDocument.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}

Expand Down