174 lines · 3.9 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <thread.h>#include <ctype.h>#include <bio.h>#include <flate.h>#include <draw.h>#include <memdraw.h>#include "pdf.h" int mainstacksize = 128*1024; static voidusage(void){	fprint(2, "usage: %s FILE\n", argv0);	threadexitsall("usage");} static intdumppage(Object *page, int text){	int ret;	Page p; 	pageinit(&p, page);	if((ret = pagerender(&p)) == 0){		if(!text)			writememimage(1, p.image);		else if(p.buf.sz != 0)			print("%s", (char*)p.buf.b);	}	pagefree(&p); 	return ret;} static intdumppages(Object *pages, int text){	Object *page, *kids, *type;	int i, count; 	kids = dictget(pages, "Kids");	count = arraylen(kids); 	for(i = 0; i < count; i++){		page = arrayget(kids, i);		// Must be a dict, either Page or Pages		type = dictget(page, "Type");		// MUST be a name.		if(strcmp(type->name, "Pages") == 0){			if(!dumppages(page, text))				return 0;		}else if(strcmp(type->name, "Page") == 0){			if(!dumppage(page, text))				return 0;			if(text)				print("\n");		}else			sysfatal("Unexpected page node type '%s'", type->name);	}	return 1;}  voidthreadmain(int argc, char **argv){	Object *v, o;	Biobuf *b;	Stream *s;	Pdf *pdf;	int i, n, k, nodump; 	quotefmtinstall();	inflateinit();	memimageinit();	threadwaitchan();	if(memimageinit() != 0)		sysfatal("failed to initialize graphics: %r"); 	ARGBEGIN{	default:		usage();	}ARGEND		nodump = 0; 	if(argc < 1)		usage();	if((b = Bopen(argv[0], OREAD|OCEXEC)) == nil)		sysfatal("%r");	if((pdf = pdfopen(b)) == nil)		sysfatal("%s: %r", argv[0]);	for(v = pdf->top, i = 1; v != nil && i < argc; i++){		if(isdigit(argv[i][0])){			n = atoi(argv[i]);			v = arrayget(v, n);		}else if((argv[i][0] == '.' || argv[i][0] == '!') && argv[i][1] == 0 && v->type == Ostream){			Memimage *m;			if((s = Sopen(v)) == nil)				sysfatal("%r");			if(argv[i][0] != '!' && (m = Sgetmemimage(s)) != nil){				writememimage(1, m);				freememimage(m);			}else if(write(1, s->buf.b, s->buf.sz) != s->buf.sz){				sysfatal("write failed");			}			Sclose(s);			v = nil;			break;		}else if(argv[i][0] == '!' && argv[i][1] == 0 && v->type == Odict && strcmp(dictget(v, "Type")->name, "Page") == 0){			if(!dumppage(v, 0))				fprint(2, "page dump failed: %r\n");			nodump = 1;			break;		}else if(argv[i][0] == '"' && argv[i][1] == 0 && v->type == Odict && strcmp(dictget(v, "Type")->name, "Page") == 0){			if(!dumppage(v, 1))				fprint(2, "page dump failed: %r\n");			nodump = 1;			break;		}else if(argv[i][0] == '"' && argv[i][1] == 0 && v->type == Odict && strcmp(dictget(v, "Type")->name, "Pages") == 0){			if(!dumppages(v, 1))				fprint(2, "page dump failed: %r\n");			nodump = 1;			break;		}else if(argv[i][0] == '*' && argv[i][1] == 0 && v->type == Odict){			for(k = 0; k < v->dict.nkv; k++)				print("%s\n", v->dict.kv[k].key);			v = nil;			break;		}else if(argv[i][0] == '@' && argv[i][1] == 0 && v->type == Ostream){			fprint(2, "%d %d\n", v->stream.off, v->stream.len);			v = nil;			break;		}else if(argv[i][0] == '@' && isdigit(argv[i][1])){			memset(&o, 0, sizeof(o));			o.ref = 1;			o.pdf = pdf;			o.type = Oindir;			o.indir.id = atoi(argv[i]+1);			if((v = pdfeval(&o)) == &null)				break;		}else if(argv[i][0] == '#' && isdigit(argv[i][1])){			memset(&o, 0, sizeof(o));			o.ref = 1;			o.pdf = pdf;			o.type = Oindir;			if((v = pdfevaloff(&o, atoi(argv[i]+1))) == &null)				break;		}else if(i == 1 && strcmp(argv[i], "xref") == 0){			for(n = 0; n < pdf->nxref; n++)				print("%08d %⊗\n", n, pdf->xref[n]);		}else{			v = dictget(v, argv[i]);		}	}	if(nodump){}	else if(v == &null)		fprint(2, "%r\n");	else if(v != nil)		print("%O\n", v); /*	if((v = dictget(pdf->info, "Creator")) != nil)		fprint(2, "creator: %s\n", v->str);	if((v = dictget(pdf->info, "Producer")) != nil)		fprint(2, "producer: %s\n", v->str);*/	pdfclose(pdf); 	threadexitsall(nil);}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t