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); }
void opensrc(char *filename, char *password, int loadpages) { fz_error *error; closesrc(); srcname = filename; error = pdf_newxref(&src); if (error) die(error); error = pdf_loadxref(src, filename); if (error) { fz_printerror(error); fz_warn("trying to repair"); error = pdf_repairxref(src, filename); if (error) die(error); } error = pdf_decryptxref(src); if (error) die(error); if (src->crypt) { int okay = pdf_setpassword(src->crypt, password); if (!okay) die(fz_throw("invalid password")); } if (loadpages) { error = pdf_loadpagetree(&srcpages, src); if (error) die(error); } }
Epdf_Document* epdf_document_new(const char* filename) { Epdf_Document* doc; fz_error error; doc = (Epdf_Document*)malloc(sizeof(Epdf_Document)); if(!doc) return NULL; doc->xref = NULL; doc->outline = NULL; doc->rast = NULL; doc->pagecount = 0; doc->zoom = 1.0; doc->rotate = 0; doc->locked = false; error = fz_newrenderer(&doc->rast, pdf_devicergb, 0, 1024 * 512); if(error) return pdfdoc_error(doc); fz_obj* obj; // Open PDF and load xref table doc->xref = pdf_newxref(); if(!doc->xref) return pdfdoc_error(doc); error = pdf_loadxref(doc->xref, (char*)filename); if(error) { fz_catch(error, "trying to repair"); fprintf(stderr, "There was a problem with file \"%s\".\nIt may be corrupted or generated by faulty software.\nTrying to repair the file.\n", filename); error = pdf_repairxref(doc->xref, (char*)filename); if(error) return pdfdoc_error(doc); } error = pdf_decryptxref(doc->xref); if(error) pdfdoc_error(doc); // Handle encrypted PDF files if(pdf_needspassword(doc->xref)) doc->locked = true; /* * Load meta information * TODO: move this into mupdf library */ obj = fz_dictgets(doc->xref->trailer, (char*)"Root"); doc->xref->root = fz_resolveindirect(obj); if(!doc->xref->root) { fz_throw("syntaxerror: missing Root object"); pdfdoc_error(doc); } fz_keepobj(doc->xref->root); obj = fz_dictgets(doc->xref->trailer, "Info"); doc->xref->info = fz_resolveindirect(obj); if(!doc->xref->info) fprintf(stderr, "Could not load PDF meta information.\n"); if(doc->xref->info) fz_keepobj(doc->xref->info); doc->outline = pdf_loadoutline(doc->xref); doc->filename = strdup(filename); if(doc->xref->info) { obj = fz_dictgets(doc->xref->info, "Title"); if(obj) doc->doctitle = pdf_toutf8(obj); } /* * Start at first page */ doc->pagecount = pdf_getpagecount(doc->xref); if(doc->zoom < 0.1) doc->zoom = 0.1; if(doc->zoom > 3.0) doc->zoom = 3.0; return doc; }
void pdfmoz_open(pdfmoz_t *moz, char *filename) { SCROLLINFO si; fz_error error; fz_obj *obj; fz_irect bbox; int rot; int i; strcpy(moz->error, ""); error = fz_newrenderer(&moz->rast, pdf_devicergb, 0, 1024 * 512); if (error) pdfmoz_error(moz, error); /* * Open PDF and load xref table */ moz->filename = filename; moz->xref = pdf_newxref(); error = pdf_loadxref(moz->xref, filename); if (error) { error = pdf_repairxref(moz->xref, filename); if (error) pdfmoz_error(moz, error); } /* * Handle encrypted PDF files */ error = pdf_decryptxref(moz->xref); if (error) pdfmoz_error(moz, error); if (pdf_needspassword(moz->xref)) { pdfmoz_warn(moz, "PDF file is encrypted and needs a password."); } moz->pagecount = pdf_getpagecount(moz->xref); moz->pages = fz_malloc(sizeof(page_t) * moz->pagecount); for (i = 0; i < moz->pagecount; i++) { fz_obj *pageobj; pageobj = pdf_getpageobject(moz->xref, i); moz->pages[i].obj = fz_keepobj(pageobj); moz->pages[i].page = nil; moz->pages[i].image = nil; obj = fz_dictgets(moz->pages[i].obj, "CropBox"); if (!obj) obj = fz_dictgets(moz->pages[i].obj, "MediaBox"); bbox = fz_roundrect(pdf_torect(obj)); moz->pages[i].w = bbox.x1 - bbox.x0; moz->pages[i].h = bbox.y1 - bbox.y0; rot = fz_toint(fz_dictgets(moz->pages[i].obj, "Rotate")); if ((rot / 90) % 2) { int t = moz->pages[i].w; moz->pages[i].w = moz->pages[i].h; moz->pages[i].h = t; } moz->pages[i].px = 1 + PAD; } /* * Load meta information * TODO: move this into mupdf library */ obj = fz_dictgets(moz->xref->trailer, "Root"); moz->xref->root = fz_resolveindirect(obj); if (!moz->xref->root) pdfmoz_error(moz, fz_throw("syntaxerror: missing Root object")); if (moz->xref->root) fz_keepobj(moz->xref->root); obj = fz_dictgets(moz->xref->trailer, "Info"); moz->xref->info = fz_resolveindirect(obj); if (moz->xref->info) fz_keepobj(moz->xref->info); moz->doctitle = filename; if (strrchr(moz->doctitle, '\\')) moz->doctitle = strrchr(moz->doctitle, '\\') + 1; if (strrchr(moz->doctitle, '/')) moz->doctitle = strrchr(moz->doctitle, '/') + 1; if (moz->xref->info) { obj = fz_dictgets(moz->xref->info, "Title"); if (obj) moz->doctitle = pdf_toutf8(obj); } /* * Start at first page */ si.cbSize = sizeof(si); si.fMask = SIF_POS | SIF_RANGE; // XXX | SIF_PAGE; si.nPos = 0; si.nMin = 0; si.nMax = 1; si.nPage = 1; SetScrollInfo(moz->hwnd, SB_VERT, &si, TRUE); moz->scrollpage = 0; moz->scrollyofs = 0; InvalidateRect(moz->hwnd, NULL, FALSE); }
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 opensrc(char *filename, char *password, int loadpages) { fz_error *error; fz_obj *obj; closesrc(); srcname = filename; error = pdf_newxref(&src); if (error) die(error); error = pdf_loadxref(src, filename); if (error) { fz_printerror(error); fz_droperror(error); fz_warn("trying to repair"); error = pdf_repairxref(src, filename); if (error) die(error); } error = pdf_decryptxref(src); if (error) die(error); if (src->crypt) { int okay = pdf_setpassword(src->crypt, password); if (!okay) die(fz_throw("invalid password")); } if (loadpages) { error = pdf_loadpagetree(&srcpages, src); if (error) die(error); } /* TODO: move into mupdf lib, see pdfapp_open in pdfapp.c */ obj = fz_dictgets(src->trailer, "Root"); if (!obj) die(error); error = pdf_loadindirect(&src->root, src, obj); if (error) die(error); obj = fz_dictgets(src->trailer, "Info"); if (obj) { error = pdf_loadindirect(&src->info, src, obj); if (error) die(error); } error = pdf_loadnametrees(src); if (error) die(error); error = pdf_loadoutline(&srcoutline, src); if (error) die(error); }
void pdfapp_open(pdfapp_t *app, char *filename) { fz_error *error; fz_obj *obj; char *password = ""; /* * Open PDF and load xref table */ app->filename = filename; error = pdf_newxref(&app->xref); if (error) pdfapp_error(app, error); error = pdf_loadxref(app->xref, filename); if (error) { if (!strncmp(error->msg, "ioerror", 7)) pdfapp_error(app, error); pdfapp_warn(app, "There was a problem with file \"%s\".\n" "It may be corrupted, or generated by broken software.\n\n" "%s\n\nTrying to continue anyway...", filename, error->msg); error = pdf_repairxref(app->xref, filename); if (error) pdfapp_error(app, error); } /* * Handle encrypted PDF files */ error = pdf_decryptxref(app->xref); if (error) pdfapp_error(app, error); if (app->xref->crypt) { error = pdf_setpassword(app->xref->crypt, password); while (error) { fz_droperror(error); password = winpassword(app, filename); if (!password) exit(1); error = pdf_setpassword(app->xref->crypt, password); if (error) pdfapp_warn(app, "Invalid password."); } } /* * Load page tree */ error = pdf_loadpagetree(&app->pages, app->xref); if (error) pdfapp_error(app, error); /* * Load meta information * TODO: move this into mupdf library */ obj = fz_dictgets(app->xref->trailer, "Root"); if (!obj) pdfapp_error(app, fz_throw("syntaxerror: missing Root object")); error = pdf_loadindirect(&app->xref->root, app->xref, obj); if (error) pdfapp_error(app, error); obj = fz_dictgets(app->xref->trailer, "Info"); if (obj) { error = pdf_loadindirect(&app->xref->info, app->xref, obj); if (error) pdfapp_error(app, error); } error = pdf_loadnametrees(app->xref); if (error) pdfapp_error(app, error); error = pdf_loadoutline(&app->outline, app->xref); if (error) pdfapp_error(app, error); app->doctitle = filename; if (strrchr(app->doctitle, '\\')) app->doctitle = strrchr(app->doctitle, '\\') + 1; if (strrchr(app->doctitle, '/')) app->doctitle = strrchr(app->doctitle, '/') + 1; if (app->xref->info) { obj = fz_dictgets(app->xref->info, "Title"); if (obj) { error = pdf_toutf8(&app->doctitle, obj); if (error) pdfapp_error(app, error); } } /* * Start at first page */ app->shrinkwrap = 1; if (app->pageno < 1) app->pageno = 1; if (app->zoom <= 0.0) app->zoom = 1.0; app->rotate = 0; app->panx = 0; app->pany = 0; pdfapp_showpage(app, 1, 1); }
static PDFContext* pdfOpen(char *filename) { PDFContext* ctx = new PDFContext(); memset(ctx, 0, sizeof(PDFContext)); fz_error *error; fz_obj *obj; error = fz_newrenderer(&ctx->rast, pdf_devicergb, 0, 1024 * 512); if (error) { printf("err0: %s\n", error->msg); delete ctx; return 0; } /* * Open PDF and load xref table */ error = pdf_newxref(&ctx->xref); if (error) { printf("err1: %s\n", error->msg); delete ctx; return 0; } error = pdf_loadxref(ctx->xref, filename); if (error) { printf("err2: %s\n", error->msg); if (!strncmp(error->msg, "ioerror", 7)) { delete ctx; return 0; } printf("There was a problem with file \"%s\".\n" "It may be corrupted, or generated by broken software.\n\n" "%s\n\nTrying to continue anyway...\n", filename, error->msg); error = pdf_repairxref(ctx->xref, filename); if (error) { printf("err3: %s\n", error->msg); delete ctx; return 0; } } /* * Handle encrypted PDF files */ error = pdf_decryptxref(ctx->xref); if (error) { printf("err4: %s\n", error->msg); delete ctx; return 0; } /*if (ctx->xref->crypt) { //printf("err5: %s\n", error->msg); printf("err5\n", error->msg); delete ctx; return 0; }*/ if (ctx->xref->crypt) { error = pdf_setpassword(ctx->xref->crypt, ""); if (error) { printf("err5: encrypted file (tried empty password): %s\n", error->msg); delete ctx; return 0; /* fz_droperror(error); password = winpassword(app, filename); if (!password) exit(1); error = pdf_setpassword(app->xref->crypt, password); if (error) pdfapp_warn(app, "Invalid password."); */ } } /* * Load page tree */ error = pdf_loadpagetree(&ctx->pages, ctx->xref); if (error) { printf("err6: %s\n", error->msg); delete ctx; return 0; } /* * Load meta information * TODO: move this into mupdf library */ obj = fz_dictgets(ctx->xref->trailer, "Root"); if (!obj) { printf("err7: %s\n", error->msg); //pdfapp_error(app, fz_throw("syntaxerror: missing Root object")); delete ctx; return 0; } error = pdf_loadindirect(&ctx->xref->root, ctx->xref, obj); if (error) { printf("err8: %s\n", error->msg); delete ctx; return 0; } obj = fz_dictgets(ctx->xref->trailer, "Info"); if (obj) { error = pdf_loadindirect(&ctx->xref->info, ctx->xref, obj); if (error) { printf("err10: %s\n", error->msg); delete ctx; return 0; } } error = pdf_loadnametrees(ctx->xref); // non-critical error, we can live without the outline if (error) { printf("warn11 - no outline: %s\n", error->msg); } else { error = pdf_loadoutline(&ctx->outline, ctx->xref); if (error) { printf("warn12 - no outline: %s\n", error->msg); } } /* char* ptitle = filename; if (strrchr(app->doctitle, '\\')) pt = strrchr(app->doctitle, '\\') + 1; if (strrchr(app->doctitle, '/')) app->doctitle = strrchr(app->doctitle, '/') + 1; if (app->xref->info) { obj = fz_dictgets(app->xref->info, "Title"); if (obj) { error = pdf_toutf8(&app->doctitle, obj); if (error) { delete ctx; return 0; } } } */ /* * Start at first page */ /* app->shrinkwrap = 1; if (app->pageno < 1) app->pageno = 1; if (app->zoom <= 0.0) app->zoom = 1.0; app->rotate = 0; app->panx = 0; app->pany = 0; pdfapp_showpage(app, 1, 1); */ ctx->pageno = 1; ctx->zoom = 1.0f; ctx->zoomLevel = 4; ctx->rotate = 0.0f; ctx->rotateLevel = 0; return ctx; }
void pdfapp_open(pdfapp_t *app, char *filename) { #if 0 fz_error error; fz_obj *obj; char *password = ""; #else fz_error error; fz_stream *file; char *password = ""; fz_obj *obj; fz_obj *info; int fd; fd = open(filename, O_BINARY | O_RDONLY, 0666); if (fd < 0) fprintf(stderr, "error, file %s does not exist\n", filename); #endif /* * Open PDF and load xref table */ app->filename = filename; #if 0 app->xref = pdf_newxref(); error = pdf_loadxref(app->xref, filename); if (error) { fz_catch(error, "trying to air"); error = pdf_repairxref(app->xref, filename); if (error) pdfapp_error(app, error); } error = pdf_decryptxref(app->xref); if (error) pdfapp_error(app, error); #else file = fz_open_fd(fd); error = pdf_open_xref_with_stream(&app->xref, file, NULL); if (error) pdfapp_error(app, fz_rethrow(error, "cannot open document '%s'", filename)); fz_close(file); #endif /* * Handle encrypted PDF files */ if (pdf_needs_password(app->xref)) { int okay = pdf_authenticate_password(app->xref, password); while (!okay) { //password = winpassword(app, filename); if (!password) exit(1); okay = pdf_authenticate_password(app->xref, password); if (!okay) pdfapp_warn(app, "Invalid password."); } } /* * Load meta information * TODO: move this into mupdf library */ #if 0 obj = fz_dictgets(app->xref->trailer, "Root"); app->xref->root = fz_resolveindirect(obj); if (!app->xref->root) pdfapp_error(app, fz_throw("syntaxerror: missing Root object")); fz_keepobj(app->xref->root); obj = fz_dictgets(app->xref->trailer, "Info"); app->xref->info = fz_resolveindirect(obj); if (!app->xref->info) pdfapp_warn(app, "Could not load PDF meta information."); if (app->xref->info) fz_keepobj(app->xref->info); /*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; if (app->xref->info) { obj = fz_dictgets(app->xref->info, "Title"); if (obj) { app->doctitle = pdf_toutf8(obj); } } #else app->outline = pdf_load_outline(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_dict_gets(app->xref->trailer, "Info"); if (info) { obj = fz_dict_gets(info, "Title"); if (obj) app->doctitle = pdf_to_utf8(obj); } #endif /* * Start at first page */ #if 0 app->pagecount = pdf_getpagecount(app->xref); #else error = pdf_load_page_tree(app->xref); if (error) pdfapp_error(app, fz_rethrow(error, "cannot load page tree")); app->pagecount = pdf_count_pages(app->xref); #endif app->rotate = 0; }