#lang racket (require ffi/unsafe ffi/unsafe/define racket/draw racket/draw/unsafe/cairo racket/snip) (define-ffi-definer define-glib (ffi-lib "/opt/local/lib/libgtk-x11-2.0")) (define-glib gtk_init (_fun _pointer _pointer -> _void)) (define-ffi-definer define-poppler (ffi-lib "libpoppler-glib")) (define _PopplerDocumentPointer (_cpointer 'PopplerDocument)) (define _PopplerPagePointer (_cpointer 'PopplerPage)) (define-poppler poppler_document_new_from_file (_fun _string _string _pointer -> (_or-null _PopplerDocumentPointer))) ;;; PopplerDocument *poppler_document_new_from_file(const char *uri, const char *password, GError **error); ; Creates a new PopplerDocument. If NULL is returned, then error will be set. ; Possible errors include those in the POPPLER_ERROR and G_FILE_ERROR domains. ; uri: uri of the file to load ; password: password to unlock the file with, or NULL. [allow-none] ; error: Return location for an error, or NULL. [allow-none] ; Returns: A newly created PopplerDocument, or NULL (define-poppler poppler_document_get_page (_fun _PopplerDocumentPointer _int -> _PopplerPagePointer)) ;;; PopplerPage * poppler_document_get_page(PopplerDocument *document, int index); ; Returns the PopplerPage indexed at index. This object is owned by the caller. ; document: A PopplerDocument ; index: a page index ; Returns : (transfer full) : The PopplerPage at index (define-poppler poppler_page_render (_fun _PopplerPagePointer _cairo_t -> _void)) ;;; void poppler_page_render (PopplerPage *page, cairo_t *cairo); ; Render the page to the given cairo context. ; This function is for rendering a page that will be displayed. ; If you want to render a page that will be printed use poppler_page_render_for_printing() instead ; page: the page to render from ; cairo: cairo context to render to ;;; ;;; EXAMPLE ;;; (define WIDTH 800) (define HEIGHT 800) (gtk_init #f #f) (define document (poppler_document_new_from_file "file:/Users/soegaard/Dropbox/GitHub/racket-poppler/bla.pdf" #f #f)) (define page (poppler_document_get_page document 0)) (define surface (cairo_image_surface_create CAIRO_FORMAT_ARGB32 WIDTH HEIGHT)) (define context (cairo_create surface)) (poppler_page_render page context) ; Testing: Write the pdf to x.png (define-ffi-definer define-cairo (ffi-lib "libcairo.2.dylib")) ; in racket/draw/unsafe/cairo (define _cairo_surface_t (_cpointer 'cairo_surface_t)) ; ; in racket/draw/unsafe/cairo ;;; cairo_status_t cairo_surface_write_to_png(cairo_surface_t *surface, const char *filename); (define-cairo cairo_surface_write_to_png (_fun _cairo_surface_t _string -> _int)) (cairo_surface_write_to_png surface "x.png") ; and display it in an image-snip. (make-object image-snip% "x.png")