如何使用GTK和 Evince加载并显示PDF文件

编程语言 2026-07-11

以下的最小工作示例会报错,信息如下:

file type PDF document is not supported
// gcc pdf_mwe.c -o pdf_mwe `pkg-config --cflags --libs gtk+-3.0 evince-view-3.0 evince-document-3.0`

#include <gtk/gtk.h>
#include <evince-view.h>
#include <evince-document.h>

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);

    if (argc < 2) {
        g_printerr("Usage: %s file.pdf\n", argv[0]);
        return 1;
    }

    // Create window
    GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(win), 800, 600);
    g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    // Create Evince view + model
    EvView *view = EV_VIEW(ev_view_new());
    EvDocumentModel *model = ev_document_model_new();
    ev_view_set_model(view, model);

    // Put view in scrolled window
    GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
    gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(view));
    gtk_container_add(GTK_CONTAINER(win), scroll);

    // Build URI
    char *uri = g_filename_to_uri(argv[1], NULL, NULL);
    g_print("Opening: %s\n", uri);

    // Load document
    GError *error = NULL;
    EvDocument *doc = ev_document_factory_get_document(uri, &error);

    if (!doc) {
        g_printerr("Failed: %s\n", error ? error->message : "unknown error");
        if (error) g_error_free(error);
        g_free(uri);
        return 1;
    }

    // Debug: page count
    int pages = ev_document_get_n_pages(doc);
    g_print("Pages: %d\n", pages);

    // Attach to model
    ev_document_model_set_document(model, doc);
    ev_document_model_set_page(model, 0);
    g_object_unref(doc);

    g_free(uri);

    gtk_widget_show_all(win);
    gtk_main();
    return 0;
}

所使用的库是Evince 3.0

ldd a.out 
    linux-vdso.so.1 (0x00007e35e92ef000)
    libevview3.so.3 => /lib/x86_64-linux-gnu/libevview3.so.3 (0x00007e35e9250000)
    libevdocument3.so.4 => /lib/x86_64-linux-gnu/libevdocument3.so.4 (0x00007e35e921c000)
    libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007e35e8800000)
    libgobject-2.0.so.0 => /lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007e35e91bc000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007e35e8400000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007e35e8000000)
    libgspell-1.so.2 => /lib/x86_64-linux-gnu/libgspell-1.so.2 (0x00007e35e9194000)
    libgdk-3.so.0 => /lib/x86_64-linux-gnu/libgdk-3.so.0 (0x00007e35e908d000)
    libpango-1.0.so.0 => /lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007e35e8799000)
    libatk-1.0.so.0 => /lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007e35e9063000)
    libcairo.so.2 => /lib/x86_64-linux-gnu/libcairo.so.2 (0x00007e35e8671000)
    libgio-2.0.so.0 => /lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007e35e7e25000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007e35e82c5000)
    libgstreamer-1.0.so.0 => /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0 (0x00007e35e7cd4000)
    libgstvideo-1.0.so.0 => /lib/x86_64-linux-gnu/libgstvideo-1.0.so.0 (0x00007e35e7c0f000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007e35e7b28000)
    libgdk_pixbuf-2.0.so.0 => /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007e35e9031000)
    libgmodule-2.0.so.0 => /lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007e35e866a000)
    libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007e35e7946000)
    libsynctex.so.2 => /lib/x86_64-linux-gnu/libsynctex.so.2 (0x00007e35e864c000)
    libpangocairo-1.0.so.0 => /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007e35e863a000)
    libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007e35e7806000)
    libXi.so.6 => /lib/x86_64-linux-gnu/libXi.so.6 (0x00007e35e82b1000)
    libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007e35e8632000)
    libcairo-gobject.so.2 => /lib/x86_64-linux-gnu/libcairo-gobject.so.2 (0x00007e35e82a5000)
    libatk-bridge-2.0.so.0 => /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0 (0x00007e35e826d000)
    libepoxy.so.0 => /lib/x86_64-linux-gnu/libepoxy.so.0 (0x00007e35e76d1000)
    libfribidi.so.0 => /lib/x86_64-linux-gnu/libfribidi.so.0 (0x00007e35e8251000)
    libpangoft2-1.0.so.0 => /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007e35e8236000)
    libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007e35e7602000)
    libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007e35e75b8000)
    libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007e35e8229000)
    /lib64/ld-linux-x86-64.so.2 (0x00007e35e92f1000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007e35e7598000)
    libenchant-2.so.2 => /lib/x86_64-linux-gnu/libenchant-2.so.2 (0x00007e35e758a000)
    libicuuc.so.70 => /lib/x86_64-linux-gnu/libicuuc.so.70 (0x00007e35e738f000)
    libicudata.so.70 => /lib/x86_64-linux-gnu/libicudata.so.70 (0x00007e35e5600000)
    libXinerama.so.1 => /lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007e35e862d000)
    libXrandr.so.2 => /lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007e35e7382000)
    libXcursor.so.1 => /lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007e35e7376000)
    libXcomposite.so.1 => /lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007e35e7371000)
    libXdamage.so.1 => /lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007e35e736a000)
    libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007e35e7323000)
    libwayland-cursor.so.0 => /lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007e35e7319000)
    libwayland-egl.so.1 => /lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007e35e7314000)
    libwayland-client.so.0 => /lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007e35e7302000)
    libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x00007e35e72ed000)
    libthai.so.0 => /lib/x86_64-linux-gnu/libthai.so.0 (0x00007e35e72e0000)
    libpixman-1.so.0 => /lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007e35e7235000)
    libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007e35e5538000)
    libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007e35e54fd000)
    libxcb-shm.so.0 => /lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007e35e7230000)
    libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007e35e54d3000)
    libxcb-render.so.0 => /lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007e35e721f000)
    libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x00007e35e54c6000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007e35e54aa000)
    libmount.so.1 => /lib/x86_64-linux-gnu/libmount.so.1 (0x00007e35e5466000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007e35e543a000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007e35e53c2000)
    libunwind.so.8 => /lib/x86_64-linux-gnu/libunwind.so.8 (0x00007e35e53a7000)
    libdw.so.1 => /lib/x86_64-linux-gnu/libdw.so.1 (0x00007e35e52fb000)
    libgstbase-1.0.so.0 => /lib/x86_64-linux-gnu/libgstbase-1.0.so.0 (0x00007e35e5276000)
    liborc-0.4.so.0 => /lib/x86_64-linux-gnu/liborc-0.4.so.0 (0x00007e35e51f1000)
    libjpeg.so.8 => /lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007e35e516e000)
    liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007e35e513b000)
    libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007e35e50ed000)
    libatspi.so.0 => /lib/x86_64-linux-gnu/libatspi.so.0 (0x00007e35e50b3000)
    libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007e35e508c000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007e35e5059000)
    libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007e35e5050000)
    libdatrie.so.1 => /lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007e35e5047000)
    libbrotlidec.so.1 => /lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007e35e5039000)
    libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007e35e5033000)
    libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007e35e5029000)
    libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1 (0x00007e35e4ff2000)
    libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007e35e4f5b000)
    libelf.so.1 => /lib/x86_64-linux-gnu/libelf.so.1 (0x00007e35e4f3d000)
    libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007e35e4f2a000)
    libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007e35e4e61000)
    libbrotlicommon.so.1 => /lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007e35e4e3e000)
    libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007e35e4e26000)
    libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007e35e4d57000)
    liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007e35e4d37000)
    libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007e35e4d2a000)
    libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007e35e4bec000)
    libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007e35e4bdf000)
    libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007e35e4bb9000)
./a.out ~/Downloads/test.pdf 
Opening: file:///home/user/Downloads/test.pdf
Failed: File type PDF document (application/pdf) is not supported

解决方案

问题在于 ev_document_factory_get_document() 需要先初始化Evince文档后端系统。

在加载文档之前调用 ev_init()

#include <gtk/gtk.h>
#include <evince-view.h>
#include <evince-document.h>

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);

    // Initialize Evince backend system
    ev_init();

    if (argc < 2) {
        g_printerr("Usage: %s file.pdf\n", argv[0]);
        return 1;
    }

    GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(win), 800, 600);
    g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    EvView *view = EV_VIEW(ev_view_new());
    EvDocumentModel *model = ev_document_model_new();
    ev_view_set_model(view, model);

    GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
    gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(view));
    gtk_container_add(GTK_CONTAINER(win), scroll);

    char *uri = g_filename_to_uri(argv[1], NULL, NULL);
    g_print("Opening: %s\n", uri);

    GError *error = NULL;
    EvDocument *doc =
        ev_document_factory_get_document(uri, &error);

    if (!doc) {
        g_printerr("Failed: %s\n",
                   error ? error->message : "unknown error");

        if (error)
            g_error_free(error);

        g_free(uri);
        return 1;
    }

    int pages = ev_document_get_n_pages(doc);
    g_print("Pages: %d\n", pages);

    ev_document_model_set_document(model, doc);
    ev_document_model_set_page(model, 0);

    g_object_unref(doc);
    g_free(uri);

    gtk_widget_show_all(win);
    gtk_main();

    return 0;
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章