Developer Tools
|
Office Productivity Applications
|
Platform-Agnostic APIs
|
Home | Online Demos | Downloads | Buy Now | Support | About Us | News | Working Together | Contact Us
In this article, you will learn how to create and edit actions for PDF link annotations. Action elements specify what happens when a user clicks on a link annotation in a PDF file.
There are several types of PDF actions - go-to, remote go-to, URI, JavaScript, launch, and named.
For this article, I will limit myself to go-to and remote go-to actions. A go-to action links to a destination in the same document while a remote go-to action links to a destination in another PDF document.
Our customer had a PDF document containing several link annotations. In particular, some link annotations had remote go-to actions - all of which were set to destinations in another PDF document.
A problem arose when the second PDF document was moved to a different location and all the remote go-to actions of link annotations in the original PDF document needed to be updated with the new path of the second document.
To reproduce the problem, let us create a PDF document (C:\Old_Path\document1.pdf
) with two link annotations. A go-to action will be associated with the first link annotation and a remote go-to action will be associated with the second link annotation. The remote go-to action will be linked to a destination in another PDF document (C:\Old_Path\document2.pdf
).
void createLinkAnnotActions() throws IOException, PdfException { // Create a new PDF document PdfDocument doc1 = new PdfDocument(); // Create font instances PdfFont fontHelvetica = PdfFont.create("Helvetica", 15, PdfEncodings.WINANSI); fontHelvetica.setColor(Color.blue); PdfFont fontHelveticaSmall = PdfFont.create("Helvetica", 10, PdfEncodings.WINANSI); fontHelveticaSmall.setColor(Color.black); // Create new page 1 PdfPage tempPage1 = new PdfPage(PdfPageSize.A4); // Write text on page 1 using the fonts tempPage1.writeText( "Create and Modify PDF Annotation Actions", fontHelvetica, PdfTextFormatter.LEFT, 50, 50); tempPage1.writeText( "Link to page 2 of this document.", fontHelveticaSmall, 50, 100); tempPage1.writeText( "Link to page 3 of remote document.", fontHelveticaSmall, 50, 120); // Create link annotation 1 on the first text element PdfLinkAnnot linkAnnot1 = new PdfLinkAnnot(new PdfRect(81, 100, 33, 14), Color.white); linkAnnot1.setHighlightMode(PdfLinkAnnot.HIGHLIGHT_MODE_INVERT); // Add a go-to action to link annotation 1 linkAnnot1.addAction(new PdfGotoAction(2, 0, 0, 100)); // Create link annotation 2 on the second text element PdfLinkAnnot linkAnnot2 = new PdfLinkAnnot(new PdfRect(81, 120, 33, 14), Color.white); linkAnnot2.setHighlightMode(PdfLinkAnnot.HIGHLIGHT_MODE_INVERT); // Add a remote go-to action to link annotation 2 linkAnnot2.addAction( new PdfRemoteGotoAction("C:\\Old_Path\\document2.pdf", 3, true)); // Add the link annotations to page 1 tempPage1.addAnnotation(linkAnnot1); tempPage1.addAnnotation(linkAnnot2); // Add page 1 to document doc1.add(tempPage1); // Create page 2 tempPage1 = new PdfPage(PdfPageSize.A4); // Write some text on page 2 tempPage1.writeText("Page 2", 50, 50); // Add page 2 to the document doc1.add(tempPage1); // Save document to file doc1.save("document1.pdf"); doc1.close(); }
Now, we assume that document2.pdf
was moved from C:\Old_Path
to D:\New_Path
and update remote go-to actions for the link annotations in document1.pdf accordingly.
For this, we first load document1.pdf
, retrieve its first page, iterate through all link annotations in that page, get all actions for each link annotation that is found, and update any remote go-to action with the new location of document2.pdf
.
void manageLinkAnnotActions() throws IOException, PdfException { // Load document in which links need to be modified PdfDocument doc2 = new PdfDocument(); doc2.load("document1.pdf"); String sExistingPath = "C:\\Old_Path"; String sReplacementPath = "D:\\New_Path"; // Access page 1 PdfPage tempPage2 = doc2.getPage(1); // Obtain all link annotations in the page List annotsList = tempPage2.getAllAnnotations(PdfAnnot.ANNOT_TYPE_LINK); // Iterate through the obtained annotations for (int i = 0, n = annotsList.size(); i < n; i++) { PdfLinkAnnot linkAnnot = (PdfLinkAnnot) annotsList.get(i); // Retrieve all remote go-to actions of // the current link annotation List actionsList = linkAnnot.getAllActions(PdfAction.REMOTE_GOTO); // Iterate through the remote go-to // actions of the current link annotation for (int j = 0, o = actionsList.size(); j < o; j++) { PdfRemoteGotoAction remoteGoToAction = (PdfRemoteGotoAction) actionsList.get(j); // Check for old pathname in the file pathname // of the remote go-to action if (remoteGoToAction.getPdfFilePath().startsWith(sExistingPath)) { // Replace old pathname with new pathname remoteGoToAction.setPdfFilePath( remoteGoToAction.getPdfFilePath().replaceAll( "C:\\\\Old_Path", // regex sReplacementPath)); } } } // Save modified document to file doc2.save("document1_modified.pdf"); doc2.close(); }
We use the getAllAnnotations()
method of the page object to retrieve all link annotations objects in the page. We then call getAllActions()
of each annotation and get a list of remote go-to action objects. The getPdfFilePath()
is used to retrieve old pathname of document2.pdf
. Finally, we use setPdfFilePath()
to update the remote go-to action with the new pathname of document2.pdf
.
---o0O0o---
Our .NET Developer Tools | |
---|---|
Gnostice Document Studio .NETMulti-format document-processing component suite for .NET developers. |
PDFOne .NETA .NET PDF component suite to create, edit, view, print, reorganize, encrypt, annotate, and bookmark PDF documents in .NET applications. |
Our Delphi/C++Builder developer tools | |
---|---|
Gnostice Document Studio DelphiMulti-format document-processing component suite for Delphi/C++Builder developers, covering both VCL and FireMonkey platforms. |
eDocEngine VCLA Delphi/C++Builder component suite for creating documents in over 20 formats and also export reports from popular Delphi reporting tools. |
PDFtoolkit VCLA Delphi/C++Builder component suite to edit, enhance, view, print, merge, split, encrypt, annotate, and bookmark PDF documents. |
Our Java developer tools | |
---|---|
Gnostice Document Studio JavaMulti-format document-processing component suite for Java developers. |
PDFOne (for Java)A Java PDF component suite to create, edit, view, print, reorganize, encrypt, annotate, bookmark PDF documents in Java applications. |
Our Platform-Agnostic Cloud and On-Premises APIs | |
---|---|
StarDocsCloud-hosted and On-Premises REST-based document-processing and document-viewing APIs |
Privacy | Legal | Feedback | Newsletter | Blog | Resellers | © 2002-2024 Gnostice Information Technologies Private Limited. All rights reserved. |