You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2018/04/23 17:13:42 UTC

svn commit: r1829909 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java

Author: tilman
Date: Mon Apr 23 17:13:42 2018
New Revision: 1829909

URL: http://svn.apache.org/viewvc?rev=1829909&view=rev
Log:
PDFBOX-3353: add caret annotation handler

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java?rev=1829909&r1=1829908&r2=1829909&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java Mon Apr 23 17:13:42 2018
@@ -15,10 +15,19 @@
  */
 package org.apache.pdfbox.pdmodel.interactive.annotation.handlers;
 
+import java.io.IOException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationCaret;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceContentStream;
 
+/**
+ * Handler to generate the caret annotations appearance.
+ *
+ * @author Tilman Hausherr
+ */
 public class PDCaretAppearanceHandler extends PDAbstractAppearanceHandler
 {
     private static final Log LOG = LogFactory.getLog(PDCaretAppearanceHandler.class);
@@ -39,7 +48,46 @@ public class PDCaretAppearanceHandler ex
     @Override
     public void generateNormalAppearance()
     {
-        // TODO to be implemented
+        float lineWidth = 1f;
+        //TODO Adobe creates the /RD entry, but it is unclear how it
+        // gets the (identical) numbers. The numbers from there are then substracted/added from /BBox
+        // and used in the translation in the matrix and also for the line width.
+
+        try
+        {
+            PDAnnotationCaret annotation = (PDAnnotationCaret) getAnnotation();
+            try (PDAppearanceContentStream contentStream = getNormalAppearanceAsContentStream())
+            {
+                contentStream.setStrokingColor(getColor());
+                contentStream.setLineWidth(lineWidth);
+                contentStream.setNonStrokingColor(getColor());
+                
+                handleOpacity(annotation.getConstantOpacity());
+
+                PDRectangle rect = getRectangle();
+                PDRectangle bbox = new PDRectangle(rect.getWidth(), rect.getHeight());
+                annotation.getNormalAppearanceStream().setBBox(bbox);
+
+                float halfX = rect.getWidth() / 2;
+                float halfY = rect.getHeight() / 2;
+                contentStream.moveTo(0, 0);
+                contentStream.curveTo(halfX, 0,
+                                      halfX, halfY, 
+                                      halfX, rect.getHeight());
+                contentStream.curveTo(halfX, halfY, 
+                                      halfX, 0,
+                                      rect.getWidth(), 0);
+                // closeAndFillAndStroke() would bring a thicker "thin top" shape.
+                contentStream.closePath();
+                contentStream.fill();
+                contentStream.stroke();
+                //TODO test whether the stroke() and setLineWidth() calls have any effect at all.
+            }
+        }
+        catch (IOException e)
+        {
+            LOG.error(e);
+        }
     }
 
     @Override
@@ -53,4 +101,4 @@ public class PDCaretAppearanceHandler ex
     {
         // TODO to be implemented
     }
-}
+}
\ No newline at end of file