private static void CopyFontTable(FontTablePart oldFontTablePart, FontTablePart newFontTablePart) { var relevantElements = oldFontTablePart.GetXDocument().Descendants().Where(d => d.Name == W.embedRegular || d.Name == W.embedBold || d.Name == W.embedItalic || d.Name == W.embedBoldItalic).ToList(); foreach (XElement fontReference in relevantElements) { string relId = (string)fontReference.Attribute(R.id); if (string.IsNullOrEmpty(relId)) continue; try { OpenXmlPart tempPart = newFontTablePart.GetPartById(relId); continue; } catch (ArgumentOutOfRangeException) { try { ExternalRelationship tempEr = newFontTablePart.GetExternalRelationship(relId); continue; } catch (KeyNotFoundException) { } } FontPart oldPart = (FontPart)oldFontTablePart.GetPartById(relId); FontPart newPart = newFontTablePart.AddFontPart(oldPart.ContentType); var ResourceID = newFontTablePart.GetIdOfPart(newPart); using (Stream oldFont = oldPart.GetStream(FileMode.Open, FileAccess.Read)) using (Stream newFont = newPart.GetStream(FileMode.Create, FileAccess.ReadWrite)) { int byteCount; byte[] buffer = new byte[65536]; while ((byteCount = oldFont.Read(buffer, 0, 65536)) != 0) newFont.Write(buffer, 0, byteCount); } fontReference.Attribute(R.id).Value = ResourceID; } }
private static void CopyFontTable(FontTablePart oldFontTablePart, FontTablePart newFontTablePart) { var relevantElements = oldFontTablePart.GetXDocument().Descendants().Where(d => d.Name == W.embedRegular || d.Name == W.embedBold || d.Name == W.embedItalic || d.Name == W.embedBoldItalic).ToList(); foreach (XElement fontReference in relevantElements) { string relId = (string)fontReference.Attribute(R.id); if (string.IsNullOrEmpty(relId)) continue; var ipp1 = newFontTablePart.Parts.FirstOrDefault(z => z.RelationshipId == relId); if (ipp1 != null) { OpenXmlPart tempPart = ipp1.OpenXmlPart; continue; } ExternalRelationship tempEr1 = newFontTablePart.ExternalRelationships.FirstOrDefault(z => z.Id == relId); if (tempEr1 != null) continue; FontPart oldPart = (FontPart)oldFontTablePart.GetPartById(relId); FontPart newPart = newFontTablePart.AddFontPart(oldPart.ContentType); var ResourceID = newFontTablePart.GetIdOfPart(newPart); using (Stream oldFont = oldPart.GetStream(FileMode.Open, FileAccess.Read)) using (Stream newFont = newPart.GetStream(FileMode.Create, FileAccess.ReadWrite)) { int byteCount; byte[] buffer = new byte[65536]; while ((byteCount = oldFont.Read(buffer, 0, 65536)) != 0) newFont.Write(buffer, 0, byteCount); } fontReference.Attribute(R.id).Value = ResourceID; } }