Créer un pdf avec gtk et latex

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 952 fois - Téléchargée 29 fois

Contenu du snippet

En GTK+ pur, il n'y a pas de widgets capable de gérer directement la création ou l'affichage de fichiers pdf.
Donc, pour palier à ce manque, on va passer par l'utilisation de latex, et son équivalent pdflatex, pour générer de beaux rapports !!

Voici un code qui fonctionne parfaitement sous Fedora Core 3 (encodage utf8)...
A vous de vous en inspirer...

Source / Exemple :


#include <gtk/gtk.h>
#include <stdlib.h>
#include <stdio.h>

// gcc pdf_maker_v3.c -o pdf_maker.exe `pkg-config --cflags --libs gtk+-2.0`

static GtkWidget *fenetre;
static GtkWidget *vbox;
static GtkWidget *label1;
static GtkWidget *entrynom;
static GtkWidget *label2;
static GtkObject *spinbutton_adj;
static GtkWidget *spinbutton;
static GtkWidget *bout_creer;

void creer_un_pdf(void);

int main(int argc, char **argv)
{  
  gtk_init(&argc, &argv);

  fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_set_size_request (fenetre, 420, 240);
  gtk_window_set_title (GTK_WINDOW (fenetre), "PDF-Maker");
  g_signal_connect(G_OBJECT(fenetre),"destroy",G_CALLBACK(gtk_main_quit), NULL);

  vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER (fenetre), vbox);
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 15);

  label1 = gtk_label_new ("Tapez votre nom");
  gtk_box_pack_start (GTK_BOX (vbox), label1, FALSE, FALSE, 0);

  entrynom = gtk_entry_new ();
  gtk_box_pack_start (GTK_BOX (vbox), entrynom, TRUE, TRUE, 0);

  label2 = gtk_label_new ("Entrez votre âge :");
  gtk_box_pack_start (GTK_BOX (vbox), label2, FALSE, FALSE, 0);

  spinbutton_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 10);
  spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
  gtk_box_pack_start (GTK_BOX (vbox), spinbutton, TRUE, TRUE, 0);

  bout_creer = gtk_button_new_with_label("Créer le PDF");
  gtk_box_pack_start (GTK_BOX (vbox), bout_creer, FALSE, FALSE, 0);
  gtk_container_set_border_width (GTK_CONTAINER (bout_creer), 11);

  g_signal_connect(G_OBJECT(bout_creer),"clicked",G_CALLBACK(creer_un_pdf), NULL);

  gtk_widget_show_all(fenetre);
  gtk_main();

  return EXIT_SUCCESS;
}
//------------------------------------------------------------
void creer_un_pdf(void)
{
FILE *futur_pdf;

const gchar* nom;
gdouble age;

nom = gtk_entry_get_text(GTK_ENTRY(entrynom));
age = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton));

futur_pdf = fopen("./pdf_maker.tex","w");

fprintf( futur_pdf, "\\documentclass{article}\n");
fprintf( futur_pdf, "\\begin{document}\n");
fprintf( futur_pdf, "Nom : %s \\\\ \n",nom);
fprintf( futur_pdf, "Age : %.0f \n",age);
fprintf( futur_pdf, "\\end{document}\n");

fclose(futur_pdf);

// lance la compilation du fichier *.tex créé plus haut
system("pdflatex ./pdf_maker.tex");

// lance kpdf une fois que le fichier pdf a été créé
system("kpdf ./pdf_maker.pdf");

// Si on lance le programme gtk depuis la console, le chemin où se trouvera
   // le pdf sera l'endroit où l'on est
// Si on lance le programme depuis l'environnement graphique KDE, le pdf
   // se trouvera dans le folder par défaut, càd /home/utilisteur
}
//------------------------------------------------------------

Conclusion :


Voilà, en espérant que cela vous aide...

http://www.langagec.be/

http://forums.apinc.org/index.php

Ciao

A voir également

Ajouter un commentaire

Commentaire

Messages postés
28
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
25 octobre 2009

Voici la version modifiée, avec un fork : càd que le programme se duplique en père-fils.

Le fils s'occupe de la gestion des pdf, et le père reprends le contrôle de lui-même :

==============================================================

#include <gtk/gtk.h>
#include <stdlib.h>
#include <stdio.h>

// gcc pdf_maker_v4.c -o pdf_maker.exe `pkg-config --cflags --libs gtk+-2.0`

static GtkWidget *fenetre;
static GtkWidget *vbox;
static GtkWidget *label1;
static GtkWidget *entrynom;
static GtkWidget *label2;
static GtkObject *spinbutton_adj;
static GtkWidget *spinbutton;
static GtkWidget *bout_creer;

void creer_un_pdf(void);

int main(int argc, char **argv)
{
gtk_init(&argc, &argv);

fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (fenetre, 420, 240);
gtk_window_set_title (GTK_WINDOW (fenetre), "PDF-Maker");
g_signal_connect(G_OBJECT(fenetre),"destroy",G_CALLBACK(gtk_main_quit), NULL);

vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (fenetre), vbox);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 15);

label1 = gtk_label_new ("Tapez votre nom");
gtk_box_pack_start (GTK_BOX (vbox), label1, FALSE, FALSE, 0);

entrynom = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (vbox), entrynom, TRUE, TRUE, 0);

label2 = gtk_label_new ("Entrez votre âge :");
gtk_box_pack_start (GTK_BOX (vbox), label2, FALSE, FALSE, 0);

spinbutton_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 10);
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
gtk_box_pack_start (GTK_BOX (vbox), spinbutton, TRUE, TRUE, 0);

bout_creer = gtk_button_new_with_label("Créer le PDF");
gtk_box_pack_start (GTK_BOX (vbox), bout_creer, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (bout_creer), 11);

g_signal_connect(G_OBJECT(bout_creer),"clicked",G_CALLBACK(creer_un_pdf), NULL);

gtk_widget_show_all(fenetre);
gtk_main();

return EXIT_SUCCESS;
}
//------------------------------------------------------------
void creer_un_pdf(void)
{
FILE *futur_pdf;

const gchar* nom;
gdouble age;

nom = gtk_entry_get_text(GTK_ENTRY(entrynom));
age = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton));

futur_pdf = fopen("./pdf_maker.tex","w");

fprintf( futur_pdf, "\\documentclass{article}\n");
fprintf( futur_pdf, "\\begin{document}\n");
fprintf( futur_pdf, "Nom : %s \\\\ \n",nom);
fprintf( futur_pdf, "Age : %.0f \n",age);
fprintf( futur_pdf, "\\end{document}\n");

fclose(futur_pdf);

// on sépare en deux processus le programme :
if (fork() == 0)
{
gtk_main_quit();
// lance la compilation du fichier *.tex créé plus haut
system("pdflatex ./pdf_maker.tex");

// lance kpdf une fois que le fichier pdf a été créé
system("kpdf ./pdf_maker.pdf");

// Si on lance le programme gtk depuis la console, le chemin où se trouvera
// le pdf sera l'endroit où l'on est
// Si on lance le programme depuis l'environnement graphique KDE, le pdf
// se trouvera dans le folder par défaut, càd /home/utilisteur
exit(0);
}
else {
// le processus père continue...
}
}
//------------------------------------------------------------

===========================================================

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.