Search code examples
cpdfgtkpoppler

How to Zoom with Poppler


Language C, UI library: GTK, renderer: poppler

I'm newbie in GTK/Poppler programming and a bit stuck with understanding how to solve Zoom issue with poppler. When I use the function below everything is ok, except zooming (hence - scrollbars).

I've tried to get the ideas from here, but it seems, I don't get how the screen/doc is rendered at all :(.

PopplerPage     *ppage_P2    = NULL;
PopplerDocument *document_P2 = NULL;
cairo_surface_t *surface_P2  = NULL;

/* pdf_doc__view_page
 * page - page number; 
 * zoom - floating nomber, 1.0 is 'no zoom' 
 */
void pdf_doc__view_page (int page, float _zoom){
    int err;
    int w, h;
    double width, height;
    cairo_t *cr;

    if(document_P2==NULL) /
        return;
    ppage_P2 = poppler_document_get_page (document_P2, page);
    if(ppage_P2==NULL) 
        return;
    poppler_page_get_size (ppage_P2, &width, &height);
    w = (int) ceil(width);
    h = (int) ceil(height);
    if(surface_P2)
        cairo_surface_destroy (surface_P2);
    surface_P2 = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w*zoom_P2, h*zoom_P2);
    cr = cairo_create (surface_P2);
    poppler_page_render (ppage_P2, cr);
    cairo_destroy (cr);
    if(drawarea_P2==NULL)
        return;
    gtk_widget_set_size_request (drawarea_P2, w*zoom_P2, h*zoom_P2);
    gtk_widget_queue_draw (drawarea_P2);
    //  self.SetScrollbars(u, u, (self.width*self.scale)/u, (self.height*self.scale)/u)
    update_statusbar();
}

Solution

  • To have 'scrollers', you have to put the viewer in a GtkScrolledWindow, which I suspect you already did.

    To have them actually working, once poppler rendered the page, you can ask poppler for the size of the render, then set the viewer to that size. Until then, the scrollbars don't know the size of drawing:

    viewer_page = poppler_document_get_page(viewer_doc, 0);
    // add a test to see if page was rendered correctly
    
    poppler_page_get_size(viewer_page, &width, &height);
    gtk_widget_set_size_request(viewer.drawingarea, (int)width, (int)height);