Author: tilman
Date: Fri Feb  7 08:15:04 2025
New Revision: 1923633

URL: http://svn.apache.org/viewvc?rev=1923633&view=rev
Log:
PDFBOX-5947: support PushPin

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

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFileAttachmentAppearanceHandler.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFileAttachmentAppearanceHandler.java?rev=1923633&r1=1923632&r2=1923633&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFileAttachmentAppearanceHandler.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFileAttachmentAppearanceHandler.java
 Fri Feb  7 08:15:04 2025
@@ -25,6 +25,7 @@ import org.apache.pdfbox.pdmodel.PDDocum
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
 import 
org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment;
+import org.apache.pdfbox.util.Matrix;
 
 /**
  *
@@ -64,8 +65,19 @@ public class PDFileAttachmentAppearanceH
             annotation.setRectangle(rect);
             annotation.getNormalAppearanceStream().setBBox(new 
PDRectangle(size, size));
 
-            //TODO support Graph, PushPin, Paperclip, Tag
-            drawPaperclip(contentStream);
+            //TODO support Graph, Tag
+            // test case: pdf_commenting_new.pdf page 7
+            String attachmentName = annotation.getAttachmentName();
+            switch (attachmentName)
+            {
+                case "PushPin":
+                    drawPushPin(contentStream);
+                    break;
+                case "Paperclip":
+                default:
+                    drawPaperclip(contentStream);
+                    break;
+            }
         }
         catch (IOException e)
         {
@@ -112,7 +124,60 @@ public class PDFileAttachmentAppearanceH
         contentStream.closePath();
         contentStream.fill();
     }
-    
+
+    private void drawPushPin(final PDAppearanceContentStream contentStream) 
throws IOException
+    {
+        // ty 18 is from the caller, scale 0.022 is by trial and error
+        contentStream.transform(new Matrix(0.022f, 0, 0, -0.022f, 0f, 18f));
+
+        // Source: https://www.svgrepo.com/svg/269187/push-pin
+        // License: CC0
+        contentStream.transform(Matrix.getTranslateInstance(586.47f, 178.97f));
+        contentStream.moveTo(0, 0);
+        contentStream.curveTo(13f, 0f, 23.43f, -10.58f, 23.43f, -23.57f);
+        contentStream.lineTo(23.43f, -70.53f);
+        contentStream.curveTo(23.43f, -109.32f, -8.19f, -141.06f, -47.03f, 
-141.06f);
+        contentStream.lineTo(-329.17f, -141.06f);
+        contentStream.curveTo(-368.17f, -141.06f, -399.79f, -109.32f, 
-399.79f, -70.53f);
+        contentStream.lineTo(-399.79f, -23.57f);
+        contentStream.curveTo(-399.79f, -10.58f, -389.19f, 0.0f, -376.19f, 0f);
+        contentStream.lineTo(-305.74f, 0f);
+        contentStream.lineTo(-305.74f, 129.52f);
+        contentStream.curveTo(-364.0f, 168.47f, -399.79f, 234.67f, -399.79f, 
305.36f);
+        contentStream.curveTo(-399.79f, 318.34f, -389.19f, 328.76f, -376.19f, 
328.76f);
+        contentStream.lineTo(-211.69f, 328.76f);
+        contentStream.lineTo(-211.69f, 555.9f);
+        contentStream.curveTo(-211.69f, 568.88f, -201.1f, 579.3f, -188.1f, 
579.3f);
+        contentStream.curveTo(-175.1f, 579.3f, -164.67f, 568.88f, -164.67f, 
555.9f);
+        contentStream.lineTo(-164.67f, 328.76f);
+        contentStream.lineTo(0f, 328.76f);
+        contentStream.curveTo(13.0f, 328.76f, 23.43f, 318.34f, 23.43f, 
305.36f);
+        contentStream.curveTo(23.43f, 234.67f, -12.2f, 168.47f, -70.62f, 
129.52f);
+        contentStream.lineTo(-70.62f, 0f);
+        contentStream.lineTo(0f, 0f);
+        contentStream.closePath();
+        contentStream.moveTo(-25.2f, 281.79f);
+        contentStream.lineTo(-351.0f, 281.79f);
+        contentStream.curveTo(-343.77f, 232.42f, -314.24f, 188.18f, -270.43f, 
162.86f);
+        contentStream.curveTo(-263.21f, 158.69f, -258.71f, 150.99f, -258.71f, 
142.5f);
+        contentStream.lineTo(-258.71f, 0f);
+        contentStream.lineTo(-117.64f, 0f);
+        contentStream.lineTo(-117.64f, 142.5f);
+        contentStream.curveTo(-117.64f, 150.99f, -113.15f, 158.69f, -105.77f, 
162.86f);
+        contentStream.curveTo(-61.95f, 188.18f, -32.42f, 232.42f, -25.2f, 
281.79f);
+        contentStream.closePath();
+        contentStream.moveTo(-352.76f, -46.97f);
+        contentStream.lineTo(-352.76f, -70.53f);
+        contentStream.curveTo(-352.76f, -83.52f, -342.17f, -93.93f, -329.17f, 
-93.93f);
+        contentStream.lineTo(-47.03f, -93.93f);
+        contentStream.curveTo(-34.03f, -93.93f, -23.59f, -83.52f, -23.59f, 
-70.53f);
+        contentStream.lineTo(-23.59f, -46.97f);
+        contentStream.lineTo(-352.76f, -46.97f);
+        contentStream.lineTo(-352.76f, -46.97f);
+        contentStream.closePath();
+        contentStream.fill();
+    }
+
     @Override
     public void generateRolloverAppearance()
     {


Reply via email to