I would like to create a gtk app that creates and displays a pdf file (but for the sake of this question: if you know how to do it without gtk, I'd love to know!). The pdf file has been created with the same gtk app. I'm new to C and only know basics (mostly js, bash, LO basic). Besides looking for a very long time I couldn't find anything about how to display a pdf file – not even if we ignore gtk.


Apparently poppler and ghostscript can be used for this purpose, but I found not a single example file, tutorial or video that actually describes how to display a pdf.



Here's my current code (main.c):


Code:
#include <stdio.h>
#include <hpdf.h>
#include <setjmp.h> //for jmp_buf
#include <gtk/gtk.h>

/*
 * Includes libharu from http://libharu.org/ for building pdf.
 */

jmp_buf g_env;


void error_handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void *user_data);
static int create_pdf();
static void activate(GtkApplication* app, gpointer user_data);


/**
 * @brief Main function. Creates the GTK Application. The contents of the window will be created in
 *        seperate functions. Also it creates a pdf function and saves it (as a test. Main should only
 *        create the application).
 * @param argc
 * @param argv
 * @return 
 */
int main (int argc, char **argv)
{
    GtkApplication *app;
    int status;
    
    app = gtk_application_new("org.test", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    
    // status is the exit code when the app gets closed
    status = g_application_run(G_APPLICATION(app), argc, argv);
    // free app from memory
    g_object_unref(app);
    
    
    create_pdf();
    printf("DONE\n");
    
    
    return status;
}


/**
 * @brief Create a pdf file with the use of hpdf and save it to downloads folder.
 * @return 
 */
static int create_pdf()
{
    const char *PAGE_TITLE = "Document title";
    HPDF_Doc pdf;
    HPDF_Page page_1;
    HPDF_Font def_font;
    HPDF_REAL text_width;
    

    pdf = HPDF_New (error_handler, NULL);
    if (!pdf) {
        printf ("ERROR: cannot create pdf object.\n");
        return 1;
    }

    if (setjmp(g_env)) {
        HPDF_Free (pdf);
        return 1;
    }
    
    //set document object attributes such as compression and password
    HPDF_SetCompressionMode(pdf, HPDF_COMP_ALL);
    
    //create a new page
    page_1 = HPDF_AddPage(pdf);
    
    //set page object attributes
    HPDF_Page_SetSize(page_1, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LAYOUT_SINGLE);
    
    //page description, which includes content
    def_font = HPDF_GetFont(pdf, "Courier", NULL);
    HPDF_Page_SetFontAndSize(page_1, def_font, 42);
    
    // for title
    text_width = HPDF_Page_TextWidth(page_1, PAGE_TITLE);
    HPDF_Page_BeginText(page_1);
    HPDF_Page_TextOut(page_1, (HPDF_Page_GetWidth(page_1) - text_width) / 2, HPDF_Page_GetHeight(page_1) - 50, PAGE_TITLE);
    HPDF_Page_EndText(page_1);
    
    //for some text
    HPDF_Page_SetFontAndSize(page_1, def_font, 12);
    
    HPDF_Page_BeginText(page_1);
    HPDF_Page_MoveTextPos(page_1, 60, HPDF_Page_GetHeight(page_1) - 105);
    HPDF_Page_ShowText(page_1, "Hello World");
    HPDF_Page_EndText(page_1);
    
    
    //save document to file
    HPDF_SaveToFile(pdf, "Downloads/test_this_file_has_been_created_by_org.test.pdf");
    
    //free resources
    HPDF_Free(pdf);
    
    return 0;
}


/**
 * @brief On error, this function displays the error code. See
 *        https://github.com/libharu/libharu/wiki/Error-handling for code meaning.
 * @param error_no
 * @param detail_no
 * @param user_data
 */
void error_handler(HPDF_STATUS   error_no,
                   HPDF_STATUS   detail_no,
                   void         *user_data)
{
    printf("ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no, (HPDF_UINT)detail_no);
    longjmp(g_env, 1); /* invoke longjmp() on error */
}


/**
 * @brief Used to construct the window so that the window is shown when the application is launched.
 *        It sets window data such as the window title and size.
 * @param app
 * @param user_data
 */
static void activate(GtkApplication* app, gpointer user_data)
{
    GtkWidget *window;
    
    window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "TEST");
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
    gtk_widget_show_all(window);
}
(You could make the code much shorter by ignoring everything inside of main() and only calling create_pdf()).
The code executes with 0 errors and 0 warnings (using gcc) on my machine.


Also: I'm looking for C, not C++, C#, .NET or any other language that is not C (searching only gave me other languages, but still no example how to display a pdf file).

I am coding with Codelite 14.0.0 on Debian 11, bullseye, with GNOME 3.38.5 as my desktop environment.


Thank you in advance for all of your help!