Skip to content

Commit 91f2db5

Browse files
committed
PDFBOX-5928: check whether the destination of a link annotation is an orphan
git-svn-id: https://svn.apache.org/repos/asf/pdfbox/trunk@1922668 13f79535-47bb-0310-9956-ffa450edef68
1 parent 1ef50d6 commit 91f2db5

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ public final class COSName extends COSBase implements Comparable<COSName>
369369
public static final COSName LIGHTEN = getPDFName("Lighten");
370370
public static final COSName LIMITS = getPDFName("Limits");
371371
public static final COSName LINEARIZED = getPDFName("Linearized");
372+
public static final COSName LINK = getPDFName("Link");
372373
public static final COSName LJ = getPDFName("LJ");
373374
public static final COSName LL = getPDFName("LL");
374375
public static final COSName LLE = getPDFName("LLE");

pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,14 @@
4646
import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement;
4747
import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureNode;
4848
import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureTreeRoot;
49+
import org.apache.pdfbox.pdmodel.interactive.action.PDAction;
4950
import org.apache.pdfbox.pdmodel.interactive.action.PDActionGoTo;
5051
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
5152
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
5253
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationPopup;
5354
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationText;
5455
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
56+
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
5557
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDNamedDestination;
5658
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
5759
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageFitDestination;
@@ -915,10 +917,35 @@ else if (kdict.containsKey(COSName.NUMS))
915917
{
916918
COSDictionary obj = (COSDictionary) kdict.getDictionaryObject(COSName.OBJ);
917919
COSBase type = obj.getDictionaryObject(COSName.TYPE);
918-
if (COSName.ANNOT.equals(type))
920+
COSBase subtype = obj.getDictionaryObject(COSName.SUBTYPE);
921+
if (COSName.ANNOT.equals(type) || COSName.LINK.equals(subtype))
919922
{
920923
PDAnnotation annotation = PDAnnotation.createAnnotation(obj);
921924
PDPage page = annotation.getPage();
925+
if (annotation instanceof PDAnnotationLink)
926+
{
927+
PDAnnotationLink link = (PDAnnotationLink) annotation;
928+
PDDestination destination = link.getDestination();
929+
if (destination == null)
930+
{
931+
PDAction action = link.getAction();
932+
if (action instanceof PDActionGoTo)
933+
{
934+
PDActionGoTo goToAction = (PDActionGoTo) action;
935+
destination = goToAction.getDestination();
936+
}
937+
}
938+
if (destination instanceof PDPageDestination)
939+
{
940+
PDPageDestination pageDestination = (PDPageDestination) destination;
941+
PDPage destPage = pageDestination.getPage();
942+
if (destPage != null)
943+
{
944+
assertNotEquals(-1, pageTree.indexOf(destPage),
945+
"Annotation destination page is not in the page tree: " + destPage);
946+
}
947+
}
948+
}
922949
if (page != null)
923950
{
924951
if (pageTree.indexOf(page) == -1)
@@ -942,7 +969,7 @@ else if (kdict.containsKey(COSName.NUMS))
942969
{
943970
//TODO needs to be investigated. Specification mentions
944971
// "such as an XObject or an annotation"
945-
fail("Other type: " + type);
972+
fail("Other type: " + type + ", obj: " + obj);
946973
}
947974
}
948975
}

0 commit comments

Comments
 (0)