使用gtk3和cairo将完整的WebKitWebView(不仅仅是可见部分)打印成PDF



我想使用webkit、gtk3和cairo将网页保存为pdf


工作原理:可见部分(在窗口中可见)正确打印到pdf中
什么不起作用,但应该起作用:不可见的部分(向下滚动时的部分)也应该打印到pdf中。有什么想法吗
这是我的代码:

#include <gtk/gtk.h>
#include <webkit/webkit.h>
#include <cairo-pdf.h>

static void save_as_pdf (GtkWidget *widget, const char *filename) 
{
        GtkAllocation allocation;
        printf("Saving PDF to file %sn", filename);
        gtk_widget_get_allocation(GTK_WIDGET(widget), &allocation);
        printf("height: %d width: %dn", allocation.height, allocation.width);
        cairo_surface_t *surface = cairo_pdf_surface_create( filename, allocation.width, allocation.height);
        cairo_t *cr = cairo_create(surface);
        gtk_widget_draw(widget, cr);
        cairo_destroy(cr);
        cairo_surface_destroy(surface);
}

static void notifyProgressCb(WebKitWebView* webView, GParamSpec* pspec, GtkWidget* window)
{
        float progress = webkit_web_view_get_progress(webView);
        printf("x1b[1Gtx1b[1G%f", progress * 100); fflush(stdout);
        if (progress == 1.0)
                save_as_pdf(window, "test.pdf");
}
int main (int   argc, char *argv[])
{
        GtkWidget *window;
        WebKitWebView *webView;
        gtk_init (&argc, &argv);
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(window), 1024, 768);
        webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
        gtk_container_set_resize_mode(GTK_CONTAINER(webView), GTK_RESIZE_PARENT);
        gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(webView));
        g_signal_connect(webView, "notify::progress", G_CALLBACK(notifyProgressCb), webView);

        webkit_web_view_load_uri(webView, "http://www.heise.de");

        g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
        gtk_widget_show_all (window);
        gtk_main();
        return 0;
}

编译使用:

gcc pkg-config --cflags --libs gtk+-3.0 pkg-config --libs --cflags webkitgtk-3.0您的文件.c

假设cairo_create()方法只绘制WebView小部件的一部分,它在窗口中可见。在这种情况下,我会完全绕过WebkitGtk对象,并包含一些代码,用于下载网页、渲染网页并将输出保存到PDF文件中;例如HTML2PDF。它可能是一种肮脏的低级方法,但它更健壮,更容易实现。

您正在寻找这个:

将页面另存为PDF:

screenshot.pl --output cpan.pdf http://search.cpan.org/

相关内容

  • 没有找到相关文章