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;
}
Exemple #2
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;
}
Exemple #4
0
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);
}