CRÉER UN PDF AVEC GTK ET LATEX

cs_calogerogigante Messages postés 28 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 25 octobre 2009 - 7 juil. 2005 à 15:52
cs_calogerogigante Messages postés 28 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 25 octobre 2009 - 7 juil. 2005 à 15:52
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31725-creer-un-pdf-avec-gtk-et-latex

cs_calogerogigante Messages postés 28 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 25 octobre 2009
7 juil. 2005 à 15:52
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...
}
}
//------------------------------------------------------------

===========================================================
Rejoignez-nous