Summary: | POI corrupts file when hyperlink relation is not valid java.util.URI | ||
---|---|---|---|
Product: | POI | Reporter: | Trey Hyde <thyde> |
Component: | POIFS | Assignee: | POI Developers List <dev> |
Status: | RESOLVED FIXED | ||
Severity: | normal | ||
Priority: | P2 | ||
Version: | 3.7-dev | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | All | ||
Attachments: | Will corrupt if you open with POI and save a new copy. |
Description
Trey Hyde
2010-10-25 17:42:50 UTC
I ran it again after turning on logging in poi... here are the VERY relevant warnings. [org.apache.poi.openxml4j.opc.PackageRelationshipCollection] Cannot convert #'Instructions (Text)'!B21 in a valid relationship URI-> ignored java.net.URISyntaxException: Illegal character in fragment at index 14: #'Instructions (Text)'!B21 at java.net.URI$Parser.fail(URI.java:2809) at java.net.URI$Parser.checkChars(URI.java:2982) at java.net.URI$Parser.parse(URI.java:3028) at java.net.URI.<init>(URI.java:578) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.parseRelationshipsPart(PackageRelationshipCollection.java:363) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:156) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:124) at org.apache.poi.openxml4j.opc.PackagePart.loadRelationships(PackagePart.java:527) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:112) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:83) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:128) at org.apache.poi.openxml4j.opc.ZipPackagePart.<init>(ZipPackagePart.java:78) at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:187) at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:592) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:201) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:178) at org.apache.poi.openxml4j.opc.OPCPackage.openOrCreate(OPCPackage.java:240) at com.centraldesktop.office.metadata.OpenXMLMDReader.isOutdated(OpenXMLMDReader.java:35) at com.centraldesktop.office.metadata.Main.main(Main.java:128) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.simontuffs.onejar.Boot.run(Boot.java:340) at com.simontuffs.onejar.Boot.main(Boot.java:166) [org.apache.poi.openxml4j.opc.PackageRelationshipCollection] Cannot convert #'Instructions (Text)'!B21 in a valid relationship URI-> ignored java.net.URISyntaxException: Illegal character in fragment at index 14: #'Instructions (Text)'!B21 at java.net.URI$Parser.fail(URI.java:2809) at java.net.URI$Parser.checkChars(URI.java:2982) at java.net.URI$Parser.parse(URI.java:3028) at java.net.URI.<init>(URI.java:578) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.parseRelationshipsPart(PackageRelationshipCollection.java:363) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:156) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:124) at org.apache.poi.openxml4j.opc.PackagePart.loadRelationships(PackagePart.java:527) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:112) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:83) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:128) at org.apache.poi.openxml4j.opc.ZipPackagePart.<init>(ZipPackagePart.java:78) at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:187) at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:592) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:201) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:178) at org.apache.poi.openxml4j.opc.OPCPackage.openOrCreate(OPCPackage.java:240) at com.centraldesktop.office.metadata.OpenXMLMDWriter.save(OpenXMLMDWriter.java:33) at com.centraldesktop.office.metadata.Main.main(Main.java:130) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.simontuffs.onejar.Boot.run(Boot.java:340) at com.simontuffs.onejar.Boot.main(Boot.java:166) Just found another document that has the same issue where the hyperlink relation is not in a format that is compatible with java.Uri [org.apache.poi.openxml4j.opc.PackageRelationshipCollection] Cannot convert Macintosh%20HD:Users:marienl:Desktop:##20Lisa%20work:CC_PowerPoint:CC_S.jpg in a valid relationship URI-> ignored java.net.URISyntaxException: Illegal character in scheme name at index 9: Macintosh%20HD:Users:marienl:Desktop:##20Lisa%20work:CC_PowerPoint:CC_S.jpg at java.net.URI$Parser.fail(URI.java:2809) at java.net.URI$Parser.checkChars(URI.java:2982) at java.net.URI$Parser.parse(URI.java:3009) at java.net.URI.<init>(URI.java:578) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.parseRelationshipsPart(PackageRelationshipCollection.java:363) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:156) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:124) at org.apache.poi.openxml4j.opc.PackagePart.loadRelationships(PackagePart.java:527) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:112) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:83) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:128) at org.apache.poi.openxml4j.opc.ZipPackagePart.<init>(ZipPackagePart.java:78) at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:187) at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:592) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:201) ... Created attachment 26263 [details]
Will corrupt if you open with POI and save a new copy.
Will corrupt if you open with POI and save a new copy.
The file attached will cause this. To recreate this file. Open a new sheet, add an image. Create a second sheet. Right click on the image in the first sheet and add a hyperlink. Make it a link to an "Document" -> "Anchor" and select the other sheet. [org.apache.poi.openxml4j.opc.PackageRelationshipCollection] Cannot convert #'Another Sheet'!A1 in a valid relationship URI-> ignored java.net.URISyntaxException: Illegal character in fragment at index 9: #'Another Sheet'!A1 at java.net.URI$Parser.fail(URI.java:2809) at java.net.URI$Parser.checkChars(URI.java:2982) at java.net.URI$Parser.parse(URI.java:3028) at java.net.URI.<init>(URI.java:578) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.parseRelationshipsPart(PackageRelationshipCollection.java:363) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:156) at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:124) at org.apache.poi.openxml4j.opc.PackagePart.loadRelationships(PackagePart.java:527) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:112) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:83) at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:128) at org.apache.poi.openxml4j.opc.ZipPackagePart.<init>(ZipPackagePart.java:78) at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:187) at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:592) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:201) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:178) at org.apache.poi.openxml4j.opc.OPCPackage.openOrCreate(OPCPackage.java:240) at com.centraldesktop.office.metadata.OpenXMLMDWriter.save(OpenXMLMDWriter.java:33) at com.centraldesktop.office.metadata.Main.main(Main.java:130) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.simontuffs.onejar.Boot.run(Boot.java:340) at com.simontuffs.onejar.Boot.main(Boot.java:166) The problem is in the OpenXml4J module. It doesn't support white spaces in target URIs. Compare two targets: <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="#ThirdSheet!A1"/> <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="#'Another Sheet'!A1"/> The first one is handled OK and survives across read-write. The second one issues a warning and causes troubles. The fix seems easy - we should percent-encode white spaces (and perhaps any other non-uri characters) when reading OPC packages and un-percent-encode them when saving. The fix is coming soon. Yegor Fantastic, I'll give trunk a good run through in the next few days and eagerly await the fix to hit a stable build in the maven repository. |