2013-07-04 7 views
0

webkit, gtk3 및 cairo를 사용하여 웹 페이지를 PDF로 저장하고 싶습니다. 완성 된 WebKitWebView (보이는 부분 만)를 gtk3 및 카이로로 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.0pkg-config --libs --cflags webkitgtk-3.0 yourfile.c

+0

당신의 코드가 webkitgtk 2.0.3로 잘 여기에 페도라 19 일을, 전체 페이지가 저장됩니다. "파일을 test.pdf 파일로 저장, 높이 : 5781 너비 : 1225." http://people.gnome.org/~klember/test.pdf – kalev

+0

@kalev 흠, 흥미 롭습니다. 열린 창에 완전한 웹 사이트가 표시됩니까 (예 : 스크롤 할 필요가 없음)? 아마도 당신은 더 큰 화면을 가지고 있고 완벽한 웹 사이트는 창문에 들어 맞을 것입니다. – btwotch

답변

0

추측 컨대 cairo_create() 메서드는 웹보기 위젯의 일부를 그립니다 창 안쪽에 표시됩니다. 이 경우 WebkitGtk 객체를 완전히 우회하고 웹 페이지를 다운로드하고 렌더링 한 다음 출력을 PDF 파일에 저장하는 코드를 포함합니다. 예를 들어 HTML2PDF. 더러운 낮은 수준의 접근 방식 일 수 있지만 더 강력하고 구현하기가 쉽습니다.

+0

HTML 렌더러를 만드는 것이 더 쉽지 않다고 생각합니다.) - 자바 스크립트와 CSS는 어떻습니까? – btwotch

0

당신은 this를 찾고 있습니다 :

저장 PDF로 페이지 :

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