Reply at haste, repent at leisure-should look more like this:
PDAnnotationLink newLink = new PDAnnotationLink();
PDBorderStyleDictionary bsd = null;
Object cob = newLink.getBorderStyle();
if (cob instanceof COSObject){
COSObject cos = (COSObject)cob;
COSBase base = cos.getObject();
if (base instanceof COSDictionary){
COSDictionary dic = (COSDictionary)base;
Set<COSName> keys = dic.keySet();
bsd = new PDBorderStyleDictionary(dic);
// or bsd = (PDBorderStyleDictionary) cob;
}
}
else if (cob instanceof PDBorderStyleDictionary){
bsd = (PDBorderStyleDictionary)cob;
}
if (bsd != null){
// off you go
}
else {
// hmmm.. what happened to my dictionary?
}
I do think it might be a good idea to refactor the
PDAnnotationLink.getBorderStyle() method so that when it retrieves the
dictionary object for border style, it not assume it gets a direct object back
- then, when we use the PDModel code, we'd know the lower level stuff has been
handled -
smm
From: Gilad Denneboom [mailto:[email protected]]
Sent: Thursday, March 15, 2012 5:12 AM
To: Sheila M. Morrissey
Cc: [email protected]
Subject: Re: Duplicating an existing link annotation
Hi Sheila,
Thanks for the input... However, this code doesn't compile.
This line:
if (base instanceof PDBorderStyleDictionary){
Produces the following compilation error:
Incompatible conditional operand types COSBase and PDBorderStyleDictionary
Any ideas on how this can be solved?
Thanks again, Gilad.
On Wed, Mar 14, 2012 at 10:55 PM, Sheila M. Morrissey
<[email protected]<mailto:[email protected]>> wrote:
I wonder if the PDBorderStyleDictionary didn't end up serialized as an indirect
object --
Maybe something like the following would work:
PDBorderStyleDictionary bsd = null;
COSObjectable cob = newLink.getBorderStyle();
if (cob instanceof COSObject){
COSObject cos = (COSObject)cob;
COSBase base = cos.getObject();
if (base instanceof PDBorderStyleDictionary){
bsd = (PDBorderStyleDictionary) base;
}
}
else if (cob instanceof PDBorderStyleDictionary){
bsd = PDBorderStyleDictionary cob;
}
If (bsd != null){
// off you go
}
else {
// hmmm.. what happened to my dictionary?
}
Sheila
-----Original Message-----
From: Gilad Denneboom
[mailto:[email protected]<mailto:[email protected]>]
Sent: Sunday, March 11, 2012 5:32 PM
To: [email protected]<mailto:[email protected]>
Subject: Duplicating an existing link annotation
Hi all,
I'm trying to duplicate an existing link annotation (PDAnnotationLink) from
one page to others. I'm using this code:
private static PDAnnotationLink duplicateLink(PDAnnotationLink link,
PDPage page) {
PDAnnotationLink newLink = new PDAnnotationLink();
newLink.setAction(link.getAction());
newLink.setColour(link.getColour());
newLink.setRectangle(link.getRectangle());
newLink.setAppearance(link.getAppearance());
newLink.setAppearanceStream(link.getAppearanceStream());
newLink.setHighlightMode(link.getHighlightMode());
newLink.setAnnotationFlags(link.getAnnotationFlags());
newLink.setBorderStyle(link.getBorderStyle());
newLink.setPage(page);
return newLink;
}
This works when I run the tool on a file I've created and added some links
to. HOWEVER, if I then run the result file through the same code, the
following Exception is thrown:
Exception in thread "main" java.lang.ClassCastException:
org.apache.pdfbox.cos.COSObject cannot be cast to
org.apache.pdfbox.cos.COSDictionary
at
org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink.getBorderStyle(PDAnnotationLink.java:131)
Since this is a RunTimeException I can't even catch it and my application
fails... Any help with this will be appreciated.
Am I creating the new link in an incorrect way?
Thanks in advance, Gilad.