如何使用GTK和 Evince加载并显示PDF文件
以下的最小工作示例会报错,信息如下:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。