summaryrefslogtreecommitdiff
path: root/bk_pdf.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2004-04-13 15:05:03 +0000
committerSimon Tatham <anakin@pobox.com>2004-04-13 15:05:03 +0000
commit7f9a818c2187960bda0cf3cae515ee8a7ad91481 (patch)
treed96b5c2e50bd83ffde685f0bf9a14c9eab229d28 /bk_pdf.c
parent5737b1da42ad79dae7f9a4fdcda9ea716846019c (diff)
downloadhalibut-7f9a818c2187960bda0cf3cae515ee8a7ad91481.zip
halibut-7f9a818c2187960bda0cf3cae515ee8a7ad91481.tar.gz
halibut-7f9a818c2187960bda0cf3cae515ee8a7ad91481.tar.bz2
halibut-7f9a818c2187960bda0cf3cae515ee8a7ad91481.tar.xz
Implement PDF link annotations: both internal hyperlinks within the
document, and references to external URLs for which acroread will start a web browser. [originally from svn r4060]
Diffstat (limited to 'bk_pdf.c')
-rw-r--r--bk_pdf.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/bk_pdf.c b/bk_pdf.c
index 44f7486..44a9699 100644
--- a/bk_pdf.c
+++ b/bk_pdf.c
@@ -250,6 +250,54 @@ void pdf_backend(paragraph *sourceform, keywordlist *keywords,
}
objstream(cstr, "ET");
+ /*
+ * Also, we want an annotation dictionary containing the
+ * cross-references from this page.
+ */
+ if (page->first_xref) {
+ xref *xr;
+ objtext(opage, "/Annots [\n");
+
+ for (xr = page->first_xref; xr; xr = xr->next) {
+ object *annot;
+ char buf[256];
+
+ annot = new_object(&olist);
+ objref(opage, annot);
+ objtext(opage, "\n");
+
+ objtext(annot, "<<\n/Type /Annot\n/Subtype /Link\n/Rect [");
+ sprintf(buf, "%g %g %g %g",
+ xr->lx / 4096.0, xr->by / 4096.0,
+ xr->rx / 4096.0, xr->ty / 4096.0);
+ objtext(annot, buf);
+ objtext(annot, "]\n/Border [0 0 0]\n");
+
+ if (xr->dest.type == PAGE) {
+ objtext(annot, "/Dest [");
+ objref(annot, (object *)xr->dest.page->spare);
+ objtext(annot, " /XYZ null null null]\n");
+ } else {
+ char *p;
+
+ objtext(annot, "/A <<\n/Type /Action\n/S /URI\n/URI (");
+ for (p = xr->dest.url; *p; p++) {
+ char c[2];
+ c[0] = *p;
+ c[1] = '\0';
+ if (*p == '(' || *p == ')' || *p == '\\')
+ objtext(annot, "\\");
+ objtext(annot, c);
+ }
+ objtext(annot, ")\n>>\n");
+ }
+
+ objtext(annot, ">>\n");
+ }
+
+ objtext(opage, "]\n");
+ }
+
objtext(opage, ">>\n");
}