begin process at 2008 08 29 08:23:16
1 233 523 membres
62 nouveaux aujourd'hui
14 291 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CRÉER UN PDF AVEC GTK ET LATEX


Description

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

  • #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
  • }
  • //------------------------------------------------------------
#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
  • signaler à un administrateur
    Commentaire de calogerogigante le 07/07/2005 15:52:16

    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...
         }
    }
    //------------------------------------------------------------

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

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS