https://bz.apache.org/bugzilla/show_bug.cgi?id=62393

            Bug ID: 62393
           Summary: Inconsistent slide import behavior depending on Mac OS
                    X Version
           Product: POI
           Version: 4.0-dev
          Hardware: PC
            Status: NEW
          Severity: normal
          Priority: P2
         Component: XSLF
          Assignee: dev@poi.apache.org
          Reporter: w...@bitplan.com
  Target Milestone: ---

I am trying to Merge some slides from different Powerpoint files to a new
target file which is a mix of slides from files with the same base layout.

I had to work around some issues e.g. avoiding null pointers and such and some
of these changes have made it into the current SNAPSHOT.

After these changes I got the of import problems down. Of 157 slides I some 10
have a problem e.g. when formatting options of recent powerpoint versions have
been used that seem not to be supported. I usually then simply take a screen
shot of these and replace the result with the bitmap. 

This all happened on a laptop with the most recent Mac OS.

Now I wanted to finish on this project while I am on the road and moved the
project to a different laptop running Mac OS X 10.9.5. Surprise - more errors
show up again- there seem to be problems with fonts and images that where not
happening (any more?) on the other OS. 

I'll have to investigate whethere the issues is with not picking up the Eclipse
patched POI at all or with POI itself. For the time being I am opening up this
bug on the assumption that the patched POI is being used. Nevertheless to get
things working the patches seem to be necessary.


= Patches=

diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
index 09fb30f..6180175 100644
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
+++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
@@ -388,7 +388,10 @@ public abstract class PackagePart implements
RelationshipSource, Comparable<Pack
         * @see
org.apache.poi.openxml4j.opc.RelationshipSource#getRelationship(java.lang.String)
         */
        public PackageRelationship getRelationship(String id) {
-               return this._relationships.getRelationshipByID(id);
+           if (id==null)
+               return null;
+           PackageRelationship result =
this._relationships.getRelationshipByID(id);
+               return result;
        }

        /**
@@ -457,7 +460,16 @@ public abstract class PackagePart implements
RelationshipSource, Comparable<Pack
         * @see
org.apache.poi.openxml4j.opc.RelationshipSource#isRelationshipExists(org.apache.poi.openxml4j.opc.PackageRelationship)
         */
        public boolean isRelationshipExists(PackageRelationship rel) {
-               return _relationships.getRelationshipByID(rel.getId()) != null;
+           // should we throw an IllegalArgumentException here?
+           if (rel==null)
+               return false;
+           String id=rel.getId();
+           // how do we avoid the id to be null in the first place?
+           if (id==null) {
+               return false;
+           }
+           PackageRelationship rs = _relationships.getRelationshipByID(id);
+               return  rs!= null;
        }

    /**
diff --git
a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java
b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java
index 953af91..2ed15d3 100644
---
a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java
+++
b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java
@@ -197,7 +197,12 @@ public final class PackageRelationshipCollection
implements
      *            The relationship to add.
      */
     public void addRelationship(PackageRelationship relPart) {
-        relationshipsByID.put(relPart.getId(), relPart);
+        String id=relPart.getId();
+        if (id==null) {
+            // should we throw an IllegalArgumentException here?
+            return;
+        }
+        relationshipsByID.put(id, relPart);
         relationshipsByType.put(relPart.getRelationshipType(), relPart);
     }

@@ -231,8 +236,7 @@ public final class PackageRelationshipCollection implements

         PackageRelationship rel = new PackageRelationship(container,
                 sourcePart, targetUri, targetMode, relationshipType, id);
-        relationshipsByID.put(rel.getId(), rel);
-        relationshipsByType.put(rel.getRelationshipType(), rel);
+        addRelationship(rel);;
         if (targetMode == TargetMode.INTERNAL){
             internalRelationshipsByTargetName.put(targetUri.toASCIIString(),
rel);
         }
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFHyperlink.java
b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFHyperlink.java
index e806861..ef44115 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFHyperlink.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFHyperlink.java
@@ -54,10 +54,17 @@ public class XSLFHyperlink implements
Hyperlink<XSLFShape,XSLFTextParagraph> {
         if (id == null || id.isEmpty()) {
             return _link.getAction();
         }
-
-        URI targetURI =
_sheet.getPackagePart().getRelationship(id).getTargetURI();
+        String url=null;
+        PackagePart pp = _sheet.getPackagePart();
+        if (pp!=null) {
+            PackageRelationship rs = pp.getRelationship(id);
+            if (rs!=null) {
+                URI targetURI = rs.getTargetURI();
+                url=targetURI.toASCIIString();
+            }
+        }

-        return targetURI.toASCIIString();
+        return url;
     }

     @Override
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
index da3cf45..865ca58 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
@@ -201,6 +201,10 @@ public class XSLFPictureShape extends XSLFSimpleShape

         XSLFPictureShape p = (XSLFPictureShape)sh;
         String blipId = p.getBlipId();
+        if (blipId==null) {
+            // should we do anything about this?
+            return;
+        }
         String relId = getSheet().importBlip(blipId,
p.getSheet().getPackagePart());

         CTPicture ct = (CTPicture)getXmlObject();
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
index 8961700..5e6b427 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
@@ -591,7 +591,7 @@ implements XSLFShapeContainer,
Sheet<XSLFShape,XSLFTextParagraph> {
         PackagePart blipPart;
         try {
             blipPart = packagePart.getRelatedPart(blipRel);
-        } catch (InvalidFormatException e){
+        } catch (Exception e){
             throw new POIXMLException(e);
         }
         XSLFPictureData data = new XSLFPictureData(blipPart);
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
index 3f686ec..1711e4d 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
@@ -41,6 +41,7 @@ import
org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeStyle;
 import
org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
 import
org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont;
@@ -206,9 +207,18 @@ public class XSLFTextRun implements TextRun {
     @Override
     public Double getFontSize(){
         double scale = 1;
-        CTTextNormalAutofit afit =
getParentParagraph().getParentShape().getTextBodyPr().getNormAutofit();
-        if(afit != null) {
-            scale = (double)afit.getFontScale() / 100000;
+        XSLFTextParagraph pp = getParentParagraph();
+        if (pp!=null) {
+            XSLFTextShape ps = pp.getParentShape();
+            if (ps!=null) {
+                CTTextBodyProperties tbp = ps.getTextBodyPr();
+                if (tbp!=null) {
+                    CTTextNormalAutofit afit = tbp.getNormAutofit();
+                    if(afit != null) {
+                        scale = (double)afit.getFontScale() / 100000;
+                    }
+                }
+            }
         }

         CharacterPropertyFetcher<Double> fetcher = new
CharacterPropertyFetcher<Double>(_p.getIndentLevel()){
@@ -222,7 +232,8 @@ public class XSLFTextRun implements TextRun {
             }
         };
         fetchCharacterProperty(fetcher);
-        return fetcher.getValue() == null ? null : fetcher.getValue()*scale;
+        Double result=fetcher.getValue() == null ? null :
fetcher.getValue()*scale;
+        return result;
     }

     /**
@@ -586,10 +597,12 @@ public class XSLFTextRun implements TextRun {

         PaintStyle srcFontColor = r.getFontColor();
         if(srcFontColor != null && !srcFontColor.equals(getFontColor())){
-            setFontColor(srcFontColor);
+            // setFontColor will throw IllegalArgumentException if this is not
checked
+            if (srcFontColor instanceof SolidPaint)
+                setFontColor(srcFontColor);
         }

-        double srcFontSize = r.getFontSize();
+        Double srcFontSize=r.getFontSize();
         if(srcFontSize  != getFontSize()){
             setFontSize(srcFontSize);
         }
diff --git a/src/ooxml/testcases/org/apache/poi/sl/TestFonts.java
b/src/ooxml/testcases/org/apache/poi/sl/TestFonts.java
index 099813c..b7a6d16 100644
--- a/src/ooxml/testcases/org/apache/poi/sl/TestFonts.java
+++ b/src/ooxml/testcases/org/apache/poi/sl/TestFonts.java
@@ -79,7 +79,7 @@ public class TestFonts {
             348, // Windows 10, 15.6" 3840x2160
             362, // Windows 10, 13.3" 1080p high-dpi
             372, // Ubuntu Xenial, 15", 1680x1050
-            377, 398, 399, // Mac
+            377, 391, 398, 399, // Mac
             406  // Ubuntu Xenial, 15", 1680x1050
     };

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org
For additional commands, e-mail: dev-h...@poi.apache.org

Reply via email to