diff options
| author | Simon Tatham <anakin@pobox.com> | 2004-04-13 15:05:03 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2004-04-13 15:05:03 +0000 |
| commit | 7f9a818c2187960bda0cf3cae515ee8a7ad91481 (patch) | |
| tree | d96b5c2e50bd83ffde685f0bf9a14c9eab229d28 /bk_pdf.c | |
| parent | 5737b1da42ad79dae7f9a4fdcda9ea716846019c (diff) | |
| download | halibut-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.c | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -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"); } |