4 * pdf file support for page
14 typedef struct PDFInfo PDFInfo;
20 static Image* pdfdrawpage(Document *d, int page);
21 static char* pdfpagename(Document*, int);
24 #include "pdfprolog.c"
36 gscmd(gs, "/CropBox knownoget {} {[0 0 0 0]} ifelse PAGE==\n");
37 p = Brdline(&gs->gsrd, '\n');
38 p[Blinelen(&gs->gsrd)-1] ='\0';
41 if(tokenize(p+1, f, 4) != 4)
43 r = Rect(atoi(f[0]), atoi(f[1]), atoi(f[2]), atoi(f[3]));
49 initpdf(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
61 fprint(2, "can only view one pdf file at a time\n");
65 fprint(2, "reading through pdf...\n");
66 if(b == nil){ /* standard input; spool to disk (ouch) */
67 fd = spooltodisk(buf, nbuf, &fn);
68 sprint(fdbuf, "/fd/%d", fd);
69 b = Bopen(fdbuf, OREAD);
71 fprint(2, "cannot open disk spool file\n");
79 if(!(p = Brdline(b, '\n')) && !(p = Brdline(b, '\r'))) {
80 fprint(2, "cannot find end of first line\n");
83 if(strncmp(p, "%PDF-", 5) != 0) {
88 /* setup structures so one free suffices */
89 p = emalloc(sizeof(*d) + sizeof(*pdf));
96 d->drawpage = pdfdrawpage;
97 d->pagename = pdfpagename;
100 if(spawngs(pdf, "-dDELAYSAFER") < 0)
103 gscmd(pdf, "%s", pdfprolog);
106 setdim(pdf, Rect(0,0,0,0), ppi, 0);
107 gscmd(pdf, "(%s) (r) file { DELAYSAFER { .setsafe } if } stopped pop pdfopen begin\n", fn);
108 gscmd(pdf, "pdfpagecount PAGE==\n");
109 p = Brdline(&pdf->gsrd, '\n');
112 fprint(2, "no pages?\n");
116 d->docname = argv[0];
118 gscmd(pdf, "Trailer\n");
121 pdf->pagebbox = emalloc(sizeof(Rectangle)*npage);
122 for(i=0; i<npage; i++) {
123 gscmd(pdf, "%d pdfgetpage\n", i+1);
124 pdf->pagebbox[i] = pdfbbox(pdf);
125 if(Dx(pdf->pagebbox[i]) <= 0)
126 pdf->pagebbox[i] = bbox;
132 pdfdrawpage(Document *doc, int page)
134 PDFInfo *pdf = doc->extra;
137 gscmd(pdf, "%d DoPDFPage\n", page+1);
138 im = readimage(display, pdf->gsdfd, 0);
140 fprint(2, "fatal: readimage error %r\n");
148 pdfpagename(Document*, int page)
151 sprint(str, "p %d", page+1);