CentOS服务器无桌面HTML快照方案优化技术求助
CentOS 服务器网页快照功能实现方案求助
我使用CentOS服务器,需要添加网页快照功能,要求无需显示桌面或窗口,且功能需常驻运行以减少每次程序初始化的耗时。
方案一:system()调用wkhtmltoimage
- 优点:操作简单
- 缺点:速度过慢,每次生成图片都需通过
system函数调用,实现不够优雅
方案二:libwebkit2gtk + 隐藏GTK窗口
该方案效果理想,但依赖GTK,仅能在GNOME桌面环境运行,无法通过SSH连接的终端执行,仍非最优解。实现代码如下:
void web_view_snapshot_callback(GObject* source_object, GAsyncResult* res, gpointer user_data) { printf("%s:In\n", __func__); cairo_surface_t* surface = webkit_web_view_get_snapshot_finish((WebKitWebView*)source_object, res, NULL); if (surface) { int width = cairo_image_surface_get_width(surface); int height = cairo_image_surface_get_height(surface); GdkPixbuf* pixbuf = gdk_pixbuf_get_from_surface(surface, 0, 0, width, height); if (pixbuf) { if (gdk_pixbuf_save(pixbuf, "screenshot.png", "png", NULL, NULL)) { printf("%s:Save Success\n", __func__); } else { printf("%s:gdk_pixbuf_save Failed\n", __func__); } g_object_unref(pixbuf); pixbuf = NULL; } else { printf("%s:gdk_pixbuf_get_from_surface Failed\n", __func__); } cairo_surface_destroy(surface); surface = NULL; } else { printf("%s:webkit_web_view_get_snapshot_finish Failed\n", __func__); } gtk_main_quit(); } void web_view_snapshot(WebKitWebView* web_view) { printf("%s:In\n", __func__); webkit_web_view_get_snapshot(web_view, WEBKIT_SNAPSHOT_REGION_FULL_DOCUMENT, WEBKIT_SNAPSHOT_OPTIONS_NONE, NULL, web_view_snapshot_callback, NULL); } void web_view_on_changed(WebKitWebView* web_view, WebKitLoadEvent load_event, gpointer user_data) { switch (load_event) { case WEBKIT_LOAD_FINISHED: { printf("%s:WEBKIT_LOAD_FINISHED\n", __func__); web_view_snapshot(web_view); break; } default: printf("%s:%d\n", __func__, load_event); break; } } void window_destory(GtkWidget* widget, GtkWidget* window) { gtk_main_quit(); } int main(int argc, char* argv[]) { gtk_init(&argc, &argv); printf("gtk_init\n"); WebKitWebView* web_view = WEBKIT_WEB_VIEW(webkit_web_view_new()); GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 1400, 0); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(web_view)); g_signal_connect(window, "destroy", G_CALLBACK(window_destory), NULL); g_signal_connect(web_view, "load-changed", G_CALLBACK(web_view_on_changed), NULL); gtk_widget_show_all(window); gtk_widget_hide(window); gchar localfile_realpath[512] = { 0 }; gchar html_localpath[512] = { 0 }; realpath("./local.html", localfile_realpath); sprintf(html_localpath, "file://%s", localfile_realpath); printf("html_localpath:%s\n", html_localpath); webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view), html_localpath); g_object_unref(web_view); gtk_main(); return 0; }
后续思路与求助
已知libwebkit2gtk是WebKit的移植版本,我考虑自行实现WebKit端口来完成网页快照,但不确定该思路是否可行,同时担心开发耗时过长,希望得到相关技术建议。
内容的提问来源于stack exchange,提问作者xxpp123zz
相关产品推荐
相关产品推荐

