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()
{