Распечатайте полный WebKitWebView (не только видимую часть) в PDF с помощью gtk3 и cairo

Я хочу сохранить веб-страницу с помощью 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 %s\n", filename);
        gtk_widget_get_allocation(GTK_WIDGET(widget), &allocation);
        printf("height: %d width: %d\n", 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[1G\t\x1b[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


person btwotch    schedule 04.07.2013    source источник
comment
Ваш код отлично работает здесь, в Fedora 19 с webkitgtk 2.0.3, вся страница сохраняется. Сохранение PDF в файл test.pdf, высота: 5781, ширина: 1225. people.gnome.org/ ~клембер/test.pdf   -  person kalev    schedule 07.07.2013
comment
@kalev хм, интересно; показывает ли открытое окно весь веб-сайт (т. е. вам не нужно прокручивать)? Возможно, у вас просто большой экран, и весь веб-сайт помещается в окно.   -  person btwotch    schedule 08.07.2013


Ответы (2)


Предположительно метод cairo_create() рисует только ту часть виджета WebView, которая видна внутри окна. В этом случае я бы полностью обошел объекты WebkitGtk и включил некоторый код, который загружает веб-страницу, отображает ее и сохраняет вывод в файл PDF; HTML2PDF, например. Это может быть грязный низкоуровневый подход, но он более надежный и простой в реализации.

person Neppomuk    schedule 06.07.2013
comment
Я не думаю, что проще создать визуализатор HTML;) - а как насчет javascript и css? - person btwotch; 08.07.2013

Вы ищете это:

Сохранить страницу в формате PDF:

screenshot.pl --output cpan.pdf http://search.cpan.org/
person Victor Henriquez    schedule 19.06.2014