unsigned char epdf_document_unlock(Epdf_Document* doc, const char* password) { if(!doc) return 0; if(doc->locked) { if(!pdf_authenticatepassword(doc->xref, (char*)password)) fprintf(stderr, "Invalid password.\n"); else doc->locked = false; } return doc->locked?1:0; }
void openxref(char *filename, char *password, int dieonbadpass) { fz_error error; int okay; basename = strrchr(filename, '/'); if (!basename) basename = filename; else basename++; xref = pdf_newxref(); error = pdf_loadxref(xref, filename); if (error) { fz_catch(error, "trying to repair"); error = pdf_repairxref(xref, filename); if (error) die(error); } error = pdf_decryptxref(xref); if (error) die(error); if (pdf_needspassword(xref)) { okay = pdf_authenticatepassword(xref, password); if (!okay && !dieonbadpass) fz_warn("invalid password, attempting to continue."); else if (!okay && dieonbadpass) die(fz_throw("invalid password")); } xref->root = fz_dictgets(xref->trailer, "Root"); if (xref->root) fz_keepobj(xref->root); xref->info = fz_dictgets(xref->trailer, "Info"); if (xref->info) fz_keepobj(xref->info); pagecount = pdf_getpagecount(xref); }
fz_error pdf_openxrefwithstream(pdf_xref **xrefp, fz_stream *file, char *password) { pdf_xref *xref; fz_error error; fz_obj *encrypt; fz_obj *id; xref = fz_malloc(sizeof(pdf_xref)); memset(xref, 0, sizeof(pdf_xref)); pdf_logxref("openxref %p\n", xref); xref->file = fz_keepstream(file); error = pdf_loadxref(xref, xref->scratch, sizeof xref->scratch); if (error) { fz_catch(error, "trying to repair"); if (xref->table) { fz_free(xref->table); xref->table = NULL; xref->len = 0; xref->cap = 0; } error = pdf_repairxref(xref, xref->scratch, sizeof xref->scratch); if (error) { pdf_freexref(xref); return fz_rethrow(error, "cannot repair document"); } } encrypt = fz_dictgets(xref->trailer, "Encrypt"); id = fz_dictgets(xref->trailer, "ID"); if (fz_isdict(encrypt)) { error = pdf_newcrypt(&xref->crypt, encrypt, id); if (error) { pdf_freexref(xref); return fz_rethrow(error, "cannot decrypt document"); } } if (pdf_needspassword(xref)) { /* Only care if we have a password */ if (password) { int okay = pdf_authenticatepassword(xref, password); if (!okay) { pdf_freexref(xref); return fz_throw("invalid password"); } } } *xrefp = xref; return fz_okay; }
void pdfapp_open(pdfapp_t *app, char *filename) { fz_obj *obj; fz_obj *info; char *password = ""; /* * Open PDF and load xref table */ app->filename = filename; app->xref = pdf_openxref(filename); if (!app->xref) pdfapp_error(app, -1); /* * Handle encrypted PDF files */ if (pdf_needspassword(app->xref)) { int okay = pdf_authenticatepassword(app->xref, password); while (!okay) { password = winpassword(app, filename); if (!password) exit(1); okay = pdf_authenticatepassword(app->xref, password); if (!okay) pdfapp_warn(app, "Invalid password."); } } /* * Load meta information */ app->outline = pdf_loadoutline(app->xref); app->doctitle = filename; if (strrchr(app->doctitle, '\\')) app->doctitle = strrchr(app->doctitle, '\\') + 1; if (strrchr(app->doctitle, '/')) app->doctitle = strrchr(app->doctitle, '/') + 1; info = fz_dictgets(app->xref->trailer, "Info"); if (info) { obj = fz_dictgets(info, "Title"); if (obj) app->doctitle = pdf_toutf8(obj); } /* * Start at first page */ app->pagecount = pdf_getpagecount(app->xref); app->shrinkwrap = 1; if (app->pageno < 1) app->pageno = 1; if (app->zoom < 0.1) app->zoom = 0.1; if (app->zoom > 3.0) app->zoom = 3.0; app->rotate = 0; app->panx = 0; app->pany = 0; //code change by kakai //highlight color settings kno_setHighlightColor(app, 0x00ffff00); //code change by kakai pdfapp_showpage(app, 1, 1); }