/** * Construct POIXMLDocumentPart representing a "core document" namespace part. */ public POIXMLDocumentPart(OPCPackage pkg) { PackageRelationship coreRel = pkg.GetRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT).GetRelationship(0); this.packagePart = pkg.GetPart(coreRel); this.packageRel = coreRel; }
/** * Clone the specified namespace. * * @param pkg the namespace to clone * @param file the destination file * @return the Cloned namespace */ public static OPCPackage Clone(OPCPackage pkg, string path) { OPCPackage dest = OPCPackage.Create(path); PackageRelationshipCollection rels = pkg.Relationships; foreach (PackageRelationship rel in rels) { PackagePart part = pkg.GetPart(rel); PackagePart part_tgt; if (rel.RelationshipType.Equals(PackageRelationshipTypes.CORE_PROPERTIES)) { CopyProperties(pkg.GetPackageProperties(), dest.GetPackageProperties()); continue; } dest.AddRelationship(part.PartName, (TargetMode)rel.TargetMode, rel.RelationshipType); part_tgt = dest.CreatePart(part.PartName, part.ContentType); Stream out1 = part_tgt.GetOutputStream(); IOUtils.Copy(part.GetInputStream(), out1); out1.Close(); if (part.HasRelationships) { Copy(pkg, part, dest, part_tgt); } } dest.Close(); //the temp file will be deleted when JVM terminates //new File(path).deleteOnExit(); return OPCPackage.Open(path); }
/** * Get the PackagePart that is the target of a relationship. * * @param rel The relationship * @param pkg The namespace to fetch from * @return The target part * @throws InvalidFormatException */ protected static PackagePart GetTargetPart(OPCPackage pkg, PackageRelationship rel) { PackagePartName relName = PackagingUriHelper.CreatePartName(rel.TargetUri); PackagePart part = pkg.GetPart(relName); if (part == null) { throw new ArgumentException("No part found for relationship " + rel); } return part; }
public POIXMLProperties(OPCPackage docPackage) { this.pkg = docPackage; // Core properties core = new CoreProperties((PackagePropertiesPart)pkg.GetPackageProperties()); // Extended properties PackageRelationshipCollection extRel = pkg.GetRelationshipsByType(PackageRelationshipTypes.EXTENDED_PROPERTIES); if (extRel.Size == 1) { extPart = pkg.GetPart(extRel.GetRelationship(0)); ExtendedPropertiesDocument props = ExtendedPropertiesDocument.Parse( extPart.GetInputStream() ); ext = new ExtendedProperties(props); } else { extPart = null; ext = new ExtendedProperties((ExtendedPropertiesDocument)NEW_EXT_INSTANCE.Copy()); } // Custom properties PackageRelationshipCollection custRel = pkg.GetRelationshipsByType(PackageRelationshipTypes.CUSTOM_PROPERTIES); if (custRel.Size == 1) { custPart = pkg.GetPart(custRel.GetRelationship(0)); CustomPropertiesDocument props = CustomPropertiesDocument.Parse( custPart.GetInputStream() ); cust = new CustomProperties(props); } else { custPart = null; cust = new CustomProperties((CustomPropertiesDocument)NEW_CUST_INSTANCE.Copy()); } }
public void Assert_50154(OPCPackage pkg) { Uri drawingUri = new Uri("/xl/drawings/drawing1.xml",UriKind.Relative); PackagePart drawingPart = pkg.GetPart(PackagingUriHelper.CreatePartName(drawingUri)); PackageRelationshipCollection drawingRels = drawingPart.Relationships; Assert.AreEqual(6, drawingRels.Size); // expected one image Assert.AreEqual(1, drawingPart.GetRelationshipsByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/image").Size); // and three hyperlinks Assert.AreEqual(5, drawingPart.GetRelationshipsByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink").Size); PackageRelationship rId1 = drawingPart.GetRelationship("rId1"); Uri parent = drawingPart.PartName.URI; Uri rel1 = new Uri(Path.Combine(parent.ToString(),rId1.TargetUri.ToString()),UriKind.Relative); Uri rel11 = PackagingUriHelper.RelativizeUri(drawingPart.PartName.URI, rId1.TargetUri); Assert.AreEqual("#'Another Sheet'!A1", HttpUtility.UrlDecode(rel1.ToString().Split(new char[]{'/'})[3])); PackageRelationship rId2 = drawingPart.GetRelationship("rId2"); Uri rel2 = PackagingUriHelper.RelativizeUri(drawingPart.PartName.URI, rId2.TargetUri); Assert.AreEqual("../media/image1.png", rel2.OriginalString); PackageRelationship rId3 = drawingPart.GetRelationship("rId3"); Uri rel3 = new Uri(Path.Combine(parent.ToString(), rId3.TargetUri.ToString()), UriKind.Relative); Assert.AreEqual("#ThirdSheet!A1", rel3.OriginalString.Split(new char[] { '/' })[3]); PackageRelationship rId4 = drawingPart.GetRelationship("rId4"); Uri rel4 = new Uri(Path.Combine(parent.ToString(), rId4.TargetUri.ToString()), UriKind.Relative); Assert.AreEqual("#'\u0410\u043F\u0430\u0447\u0435 \u041F\u041E\u0418'!A1",HttpUtility.UrlDecode(rel4.OriginalString.Split(new char[] { '/' })[3])); //PackageRelationship rId5 = drawingPart.GetRelationship("rId5"); //Uri rel5 = new Uri(Path.Combine(parent.ToString(), rId5.TargetUri.ToString()), UriKind.Relative); //// back slashed have been Replaced with forward //Assert.AreEqual("file:///D:/chan-chan.mp3", rel5.ToString()); //PackageRelationship rId6 = drawingPart.GetRelationship("rId6"); //Uri rel6 = new Uri(ResolveRelativePath(parent.ToString(), HttpUtility.UrlDecode(rId6.TargetUri.ToString())), UriKind.Relative); //Assert.AreEqual("../../../../../../../cygwin/home/yegor/dinom/&&&[access].2010-10-26.log", rel6.OriginalString); //Assert.AreEqual("#'\u0410\u043F\u0430\u0447\u0435 \u041F\u041E\u0418'!A5", HttpUtility.UrlDecode(rel6.OriginalString.Split(new char[] { '/' })[3])); }
/** * Recursively copy namespace parts to the destination namespace */ private static void Copy(OPCPackage pkg, PackagePart part, OPCPackage tgt, PackagePart part_tgt) { PackageRelationshipCollection rels = part.Relationships; if(rels != null) foreach (PackageRelationship rel in rels) { PackagePart p; if(rel.TargetMode == TargetMode.External){ part_tgt.AddExternalRelationship(rel.TargetUri.ToString(), rel.RelationshipType, rel.Id); //external relations don't have associated namespace parts continue; } Uri uri = rel.TargetUri; if(uri.Fragment != null) { part_tgt.AddRelationship(uri, (TargetMode)rel.TargetMode, rel.RelationshipType, rel.Id); continue; } PackagePartName relName = PackagingUriHelper.CreatePartName(rel.TargetUri); p = pkg.GetPart(relName); part_tgt.AddRelationship(p.PartName, (TargetMode)rel.TargetMode, rel.RelationshipType, rel.Id); PackagePart dest; if(!tgt.ContainPart(p.PartName)){ dest = tgt.CreatePart(p.PartName, p.ContentType); Stream out1 = dest.GetOutputStream(); IOUtils.Copy(p.GetInputStream(), out1); out1.Close(); Copy(pkg, p, tgt, dest); } } }
/** * Construct POIXMLDocumentPart representing a "core document" namespace part. */ public POIXMLDocumentPart(OPCPackage pkg) { PackageRelationship coreRel = pkg.GetRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT).GetRelationship(0); if (coreRel == null) { coreRel = pkg.GetRelationshipsByType(PackageRelationshipTypes.STRICT_CORE_DOCUMENT).GetRelationship(0); if (coreRel != null) { throw new POIXMLException("Strict OOXML isn't currently supported, please see bug #57699"); } } if (coreRel == null) { throw new POIXMLException("OOXML file structure broken/invalid - no core document found!"); } this.packagePart = pkg.GetPart(coreRel); this.packageRel = coreRel; }
private void assertMSCompatibility(OPCPackage pkg) { PackagePartName relName = PackagingUriHelper.CreatePartName(PackageRelationship.ContainerPartRelationship); PackagePart relPart = pkg.GetPart(relName); XmlDocument xmlRelationshipsDoc = DocumentHelper.LoadDocument(relPart.GetInputStream()); XmlElement root = xmlRelationshipsDoc.DocumentElement; XmlNodeList nodeList = root.GetElementsByTagName(PackageRelationship.RELATIONSHIP_TAG_NAME); int nodeCount = nodeList.Count; for (int i = 0; i < nodeCount; i++) { XmlElement element = (XmlElement)nodeList.Item(i); String value = element.GetAttribute(PackageRelationship.TARGET_ATTRIBUTE_NAME); Assert.IsTrue(value[0] != '/', "Root target must not start with a leading slash ('/'): " + value); } }