Author: msahyoun
Date: Mon Jul  4 06:27:17 2016
New Revision: 1751213

URL: http://svn.apache.org/viewvc?rev=1751213&view=rev
Log:
PDFBOX-3396: don't add a transformation if there is a XObject

Modified:
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java?rev=1751213&r1=1751212&r2=1751213&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java
 Mon Jul  4 06:27:17 2016
@@ -45,6 +45,7 @@ import org.apache.pdfbox.pdmodel.fdf.FDF
 import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
 import org.apache.pdfbox.util.Matrix;
 
 /**
@@ -248,7 +249,7 @@ public final class PDAcroForm implements
 
                     if (!isContentStreamWrapped)
                     {
-                        contentStream = new PDPageContentStream(document, 
page, AppendMode.APPEND, true, true);
+                        contentStream = new PDPageContentStream(document, 
page, AppendMode.APPEND, true);
                         isContentStreamWrapped = true;
                     }
                     else
@@ -256,11 +257,22 @@ public final class PDAcroForm implements
                         contentStream = new PDPageContentStream(document, 
page, AppendMode.APPEND, true);
                     }
                     
-                    PDFormXObject fieldObject = new 
PDFormXObject(widget.getNormalAppearanceStream().getCOSObject());
+                    PDAppearanceStream appearanceStream = 
widget.getNormalAppearanceStream();
+                    
+                    PDFormXObject fieldObject = new 
PDFormXObject(appearanceStream.getCOSObject());
                     
-                    Matrix translationMatrix = 
Matrix.getTranslateInstance(widget.getRectangle().getLowerLeftX(), 
widget.getRectangle().getLowerLeftY());
                     contentStream.saveGraphicsState();
-                    contentStream.transform(translationMatrix);
+                    
+                    // translate the appearance stream to the widget location 
if there is 
+                    // not already a transformation in place
+                    boolean needsTransformation = 
isNeedsTransformation(appearanceStream);
+                    if (needsTransformation)
+                    {
+                        Matrix translationMatrix = 
Matrix.getTranslateInstance(widget.getRectangle().getLowerLeftX(),
+                                widget.getRectangle().getLowerLeftY());
+                        contentStream.transform(translationMatrix);
+                    }
+                    
                     contentStream.drawForm(fieldObject);
                     contentStream.restoreGraphicsState();
                     contentStream.close();
@@ -652,4 +664,22 @@ public final class PDAcroForm implements
        }       
        return annotationToPageRef;
     }
+    
+    /**
+     * Check if there is a transformation needed to place the annotations 
content.
+     * 
+     * @param appearanceStream
+     * @return the need for a transformation.
+     */
+    private boolean isNeedsTransformation(PDAppearanceStream appearanceStream)
+    {
+        // Check if there is a XObject defined as this is an indication that 
there should already be a transformation
+        // in place.
+        // TODO: A more reliable approach might be to parse the content stream
+        if (appearanceStream.getResources() != null && 
appearanceStream.getResources().getXObjectNames().iterator().hasNext())
+        {
+            return false;
+        }
+        return true;
+    }
 }


Reply via email to