begin process at 2012 05 27 19:33:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > [WIN32][CB]CRÉATION DIRECTE DE PDF

[WIN32][CB]CRÉATION DIRECTE DE PDF


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Classé sous :pdf, createfile, graphique, création Niveau :Débutant Date de création :26/05/2010 Vu / téléchargé :2 493 / 218

Auteur : omnia

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Sa fait un bout de temps que je devais me mettre au PDF sans passer par des librairies non maîtrisées,
au final le fonctionnement est assez simple, étrangement il y a très peu de source sur le sujet, je poste donc une ébauche de création de fichier PDF.

Pour répondre aux questions :
- oui ce programme ne permet pas grand chose
- oui il manque 1 000 000 de fonctions
- oui le code n'est pas terminé/propre/ complètement documenté
- oui la fonction image n'est pas finie

Mais je vais voir pour le mettre à jour et pourquoi pas faire une interface GUI/RTF/PDF.

on verra, enjoy :p

Si vous avez la moindre remarque n'hésitez pas !!!

Source

  • //---------------------------------------------------------------------------------------------------------------
  • // Auteur : Hanteville Nicolas
  • // mail : nico248@free.fr
  • // site : http://omni.a.free.fr
  • // (coder en C sur Code::Blocks)
  • // Cette application est libre de droits et
  • // est inspiré des documents PDF officiels et de la source si dessous.
  • //---------------------------------------------------------------------------------------------------------------
  • //doc gratuit d'adoble pour le format PDF : http://www.adobe.com/devnet/pdf/pdf_reference.html
  • //exemple d'ajout d'image : //http://www.codeproject.com/KB/graphics/imagestotextboxes.aspx
  • //---------------------------------------------------------------------------------------------------------------
  • #include "ressources.h"
  • //---------------------------------------------------------------------------------------------------------------
  • #define IDENTIFIANT_DOCUMENT "0123456789ABCDEF0123456789ABCDEF"
  • //---------------------------------------------------------------------------------------------------------------
  • // dessiner une image
  • //en dehors d'une stream !!!
  • void PDF_write_img(int x, int y, int x_s, int y_s, char *path_img, char *titre, HANDLE file_ext)
  • {
  • //ouverture de l'image
  • DWORD copiee;
  • HANDLE Hsrc = CreateFile(path_img,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • char *buffer;
  • long taille_fic = 0;
  • if (Hsrc != INVALID_HANDLE_VALUE)
  • {
  • taille_fic = GetFileSize(Hsrc,NULL); //__int64 aurait été plus adapté mais ici que pour des fichiers texte de petites tailles
  • if (taille_fic)
  • {
  • buffer = malloc(sizeof(char*)*taille_fic+1);
  • ReadFile(Hsrc, buffer, taille_fic,&copiee,0);
  • buffer[taille_fic]=0;
  • //on crée l'entête + ajouter une image
  • char tmp[MAX_PATH];
  • DWORD copiee;
  • _snprintf(tmp,MAX_PATH,"%d 0 obj << /Type /Page/Parent 2 0 R/Rotate 0/MediaBox [0 0 595 842]/CropBox [0 0 595842] /Resources"
  • "<</ProcSet [/PDF/Text] /Font<</T1 3 0 R/T2 4 0 R/T3 5 0 R/T4 6 0 R>> /XObject <</I1 %d 0 R >>>>"
  • "/Contents %d 0 R >>\r\nendobj\r\n",++nb_items,nb_items+1,nb_items+2);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • //contenu du stream
  • //ajout de l'image (emplacement /taille
  • char stream[MAX_PATH];
  • _snprintf(stream,MAX_PATH,"\r\n"
  • "q\r\n"
  • "%d 0 0 %d 300 700 cm\r\n"
  • "1 0 0 1 0 0 cm\r\n"
  • "/I1 Do\r\n"
  • "Q\r\n"
  • "BT/T3 12 Tf\r\n"
  • "%d %d Td\r\n"
  • "(%s) Tj\r\n"
  • "ET\r\n"
  • ,x_s,y_s,x,y,titre);
  • //création pour écriture
  • _snprintf(tmp,MAX_PATH,"%d 0 obj\r\n"
  • "<</Length %d >>\r\n"
  • "stream%s"
  • "endstream\r\n"
  • "endobj\r\n"
  • ,++nb_items,strlen(stream),stream);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • //ajout du contenu du fichier (entête
  • _snprintf(tmp,MAX_PATH,"%d 0 obj\r\n"
  • "<</Name/I1/Type/XObject/Subtype/Image\r\n"
  • "/Width %d\r\n"
  • "/Height %d\r\n"
  • "/Length %d\r\n"
  • "/Filter/DCTDecode/ColorSpace/DeviceRGB\r\n"
  • "/BitsPerComponent 8>>\r\n"
  • "stream\r\n"
  • ,++nb_items,x_s,y_s,taille_fic+4);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • //contenu du fichier
  • //manque l'encodage + commentaires
  • WriteFile(file_ext,buffer,taille_fic,&copiee,0);
  • debut_emplacement += taille_fic;
  • //fin de stream
  • _snprintf(tmp,MAX_PATH,"\r\nendstream\r\n"
  • "endobj\r\n"
  • ,++nb_items,x_s,y_s,taille_fic+2);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • free(buffer);
  • }
  • }
  • CloseHandle(Hsrc);
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // dessiner une ligne
  • void PDF_write_ligne(int x, int y, int x2, int y2, unsigned int epaisseur, HANDLE file_ext)
  • {
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • _snprintf(tmp,MAX_PATH,"\r\n"
  • "%d w\r\n" //épaisseur de la ligne en point
  • "%d %d m\r\n" //point de départ de la ligne x,y
  • "%d %d l\r\n" //point de fin de la ligne x,y
  • "S\r\n" //c'est une ligne
  • "1 w\r\n" //on remet l'épaisseur des traits à 1 pt / defaut
  • ,epaisseur,x,y,x2,y2);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • taille_stream += strlen(tmp);
  • ListeItem[nb_items].debut = debut_emplacement;
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // dessiner une ligne en pointillé
  • void PDF_write_ligne_pointille(int x, int y, int x2, int y2,unsigned int epaisseur, HANDLE file_ext)
  • {
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • _snprintf(tmp,MAX_PATH,"\r\n"
  • "%d w\r\n" //épaisseur de la ligne en point
  • "[4 6] 0 d\r\n" //format de pointillé en pts : 4pts en dur et 6pts vides
  • "%d %d m\r\n" //point de départ de la ligne x,y
  • "%d %d l\r\n" //point de fin de la ligne x,y
  • "S\r\n" //c'est une ligne
  • "[ ] 0 d\r\n" //on remet le format par défaut des lignes
  • "1 w\r\n" //on remet l'épaisseur des traits à 1 pt / defaut
  • ,epaisseur,x,y,x2,y2);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • taille_stream += strlen(tmp);
  • ListeItem[nb_items].debut = debut_emplacement;
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // dessiner un rectangle avec couleur
  • void PDF_write_rectangle(int x, int y, int x2, int y2,unsigned int epaisseur
  • ,unsigned char c_r,unsigned char c_g,unsigned char c_b //% contour RGB
  • ,unsigned char i_r,unsigned char i_g,unsigned char i_b //% intérieur RGB
  • , HANDLE file_ext)
  • {
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • _snprintf(tmp,MAX_PATH,"%d w\r\n" //épaisseur de la ligne en point
  • "%2.1f %2.1f %2.1f RG\r\n" //couleur de contour en RGB sur 1 : 0.0 0.0 0.0 = noir
  • "%2.1f %2.1f %2.1f rg\r\n" //couleur intérieur en RGB sur 1 : 0.0 0.0 0.0 = noir
  • "%d %d %d %d re\r\n" //pt de début x,y et point opposé de fin x,y
  • "B\r\n" //un rectangle
  • "1 w\r\n" //on remet l'épaisseur des traits à 1 pt / defaut
  • "0.0 0.0 0.0 rg\r\n" //réinit des couleur en noir par défaut
  • "0.0 0.0 0.0 RG\r\n"
  • ,epaisseur,c_r/100.0,c_g/100.0,c_b/100.0,i_r/100.0,i_g/100.0,i_b/100.0,x,y,x2,y2);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • taille_stream += strlen(tmp);
  • ListeItem[nb_items].debut = debut_emplacement;
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // dessiner une elipse avec couleur
  • // pt_d_x = point de début, pt_f_x = de fin, pt_i_x = intermédiaire
  • void PDF_write_elipse(int x, int y, int pt_d_x, int pt_d_y, int pt_i_x, int pt_i_y,int pt_f_x, int pt_f_y
  • ,unsigned int epaisseur
  • ,unsigned char c_r,unsigned char c_g,unsigned char c_b //% contour RGB
  • ,unsigned char i_r,unsigned char i_g,unsigned char i_b //% intérieur RGB
  • , HANDLE file_ext)
  • {
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • _snprintf(tmp,MAX_PATH,"%d w\r\n" //épaisseur de la ligne en point
  • "%2.1f %2.1f %2.1f RG\r\n" //couleur de contour en RGB sur 1 : 0.0 0.0 0.0 = noir
  • "%2.1f %2.1f %2.1f rg\r\n" //couleur intérieur en RGB sur 1 : 0.0 0.0 0.0 = noir
  • "%d %d m\r\n" //point central de départ
  • "%d %d %d %d %d %d c\r\n" //point de début x,y, point intermédiaire x,y et point final x,y
  • "b\r\n" //elipse
  • "1 w\r\n" //on remet l'épaisseur des traits à 1 pt / defaut
  • "0.0 0.0 0.0 rg\r\n" //réinit des couleur en noir par défaut
  • "0.0 0.0 0.0 RG\r\n"
  • ,epaisseur,c_r/100.0,c_g/100.0,c_b/100.0,i_r/100.0,i_g/100.0,i_b/100.0,x,y
  • ,pt_d_x,pt_d_y,pt_i_x,pt_i_y,pt_f_x,pt_f_y);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • taille_stream += strlen(tmp);
  • ListeItem[nb_items].debut = debut_emplacement;
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // écrire du texte
  • void PDF_write_txt(int x, int y, unsigned int taille_txt, char *txt, HANDLE file_ext)
  • {
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • _snprintf(tmp,MAX_PATH,"\r\n"
  • "BT\r\n" //begin/début de la zone de texte
  • "/F1 %d Tf\r\n" //taille du texte écrit horizontalement
  • "%d %d Td\r\n" //coordonnées du point
  • "(%s) Tj\r\n" //text à écrire
  • "ET\r\n" //end/fin de la zone de texte
  • ,taille_txt,x,y,txt);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • taille_stream += strlen(tmp);
  • ListeItem[nb_items].debut = debut_emplacement;
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // écrire du texte en couleur
  • void PDF_write_txt_color(int x, int y, unsigned int taille_txt, char *txt, HANDLE file_ext
  • ,unsigned char c_r,unsigned char c_g,unsigned char c_b)
  • {
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • _snprintf(tmp,MAX_PATH,"\r\n"
  • "%2.1f %2.1f %2.1f rg\r\n" //couleur intérieur en RGB sur 1 : 0.0 0.0 0.0 = noir
  • "BT\r\n" //begin/début de la zone de texte
  • "/F1 %d Tf\r\n" //taille du texte écrit horizontalement
  • "%d %d Td\r\n" //coordonnées du point
  • "(%s) Tj\r\n" //text à écrire
  • "ET\r\n" //end/fin de la zone de texte
  • "0.0 0.0 0.0 rg\r\n" //réinit des couleur en noir par défaut
  • ,c_r/100.0,c_g/100.0,c_b/100.0,taille_txt,x,y,txt);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • taille_stream += strlen(tmp);
  • ListeItem[nb_items].debut = debut_emplacement;
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // debut de stream pour écrire ^^
  • void PDF_write_debut_stream(HANDLE file_ext)
  • {
  • taille_stream = 0;
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • nb_items++;
  • _snprintf(tmp,MAX_PATH,"%d 0 obj\r\n" //numéro de l'objet
  • "<</Length %d 0 R >>\r\n" //taille de la stream (contenant le text, images, lignes)
  • //et numéro de l'objet contenant la taille
  • "stream" //début de la zone stream
  • ,nb_items,nb_items+1);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • ListeItem[nb_items].debut = debut_emplacement;
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // fin de stream pour écrire ^^
  • void PDF_write_fin_stream(HANDLE file_ext)
  • {
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • nb_items++;
  • _snprintf(tmp,MAX_PATH,"sendstream\r\n" //fin de la stream
  • "endobj\r\n" //fin de l'objet
  • "%d 0 obj\r\n" //nouvel objet contenant
  • "%d\r\n" //taille de la stream précédente
  • "endobj\r\n" //fin de l'objet
  • ,++nb_items,taille_stream);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement += strlen(tmp);
  • ListeItem[nb_items].debut = debut_emplacement;
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // début du document
  • void PDF_write_start(HANDLE file_ext, unsigned int nb_page_total)
  • {
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • //écriture de la version PDF utilisée
  • _snprintf(tmp,MAX_PATH,"%%PDF-1.7\r\n"); //version du format PDF utilisé
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • debut_emplacement = strlen(tmp);
  • //format du document
  • _snprintf(tmp,MAX_PATH,"%d 0 obj<</Type/Catalog/Outlines 2 0 R/Pages 3 0 R>>\r\nendobj\r\n",++nb_items);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • ListeItem[nb_items].debut = debut_emplacement;
  • debut_emplacement += strlen(tmp);
  • _snprintf(tmp,MAX_PATH,"%d 0 obj<</Type/Outlines/Count 0>>\r\nendobj\r\n",++nb_items);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • ListeItem[nb_items].debut = debut_emplacement;
  • debut_emplacement += strlen(tmp);
  • _snprintf(tmp,MAX_PATH,"%d 0 obj<</Type/Pages/Kids [4 0 R]/Count %d>>\r\nendobj\r\n",++nb_items,nb_page_total); //ici on spécifié le nb de page
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • ListeItem[nb_items].debut = debut_emplacement;
  • debut_emplacement += strlen(tmp);
  • //taille de la page
  • _snprintf(tmp,MAX_PATH,"%d 0 obj<</Type/Pages/Parent 3 0 R/MediaBox [0 0 612 792]/Contents 5 0 R/Resources <</ProcSet 6 0 R/Font <</F1 7 0 R>> >> >>\r\nendobj\r\n",++nb_items);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • ListeItem[nb_items].debut = debut_emplacement;
  • debut_emplacement += strlen(tmp);
  • }
  • //---------------------------------------------------------------------------------------------------------------
  • // fin du document
  • void PDF_write_end(HANDLE file_ext)
  • {
  • DWORD copiee;
  • char tmp[MAX_PATH];
  • //format de fin du document
  • _snprintf(tmp,MAX_PATH,"%d 0 obj [/PDF]\r\nendobj\r\n",++nb_items);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • ListeItem[nb_items].debut = debut_emplacement;
  • debut_emplacement += strlen(tmp);
  • _snprintf(tmp,MAX_PATH,"%d 0 obj <</Type/Font/Subtype/Type1/Name/F1/BaseFont/Helvetica/Encoding/MacRomanEncoding>>\r\nendobj\r\n",++nb_items);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • ListeItem[nb_items].debut = debut_emplacement;
  • debut_emplacement += strlen(tmp);
  • //début de l'index
  • _snprintf(tmp,MAX_PATH,"xref\r\n0 %d\r\n0000000000 65535 f\r\n",nb_items+1);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • //index des objets (octet de début) + infos divers
  • unsigned int i;
  • for (i=1;i<nb_items-1;i++)
  • {
  • _snprintf(tmp,MAX_PATH,"%010d 00000 n\r\n",ListeItem[i].debut);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • }
  • //trailer de fin
  • _snprintf(tmp,MAX_PATH,"trailer\r\n<</Size %d/Root 1 0 R/ID[<%s><%s>]>>\r\nstartxref\r\n%d\r\n%%%%EOF\r\n"
  • ,nb_items+1
  • ,IDENTIFIANT_DOCUMENT
  • ,IDENTIFIANT_DOCUMENT
  • ,debut_emplacement);
  • WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  • }
//---------------------------------------------------------------------------------------------------------------
// Auteur :  Hanteville Nicolas
// mail : nico248@free.fr
// site : http://omni.a.free.fr
// (coder en C sur Code::Blocks)
// Cette application est libre de droits et
// est inspiré des documents PDF officiels et de la source si dessous.
//---------------------------------------------------------------------------------------------------------------
//doc gratuit d'adoble pour le format PDF : http://www.adobe.com/devnet/pdf/pdf_reference.html
//exemple d'ajout d'image : //http://www.codeproject.com/KB/graphics/imagestotextboxes.aspx
//---------------------------------------------------------------------------------------------------------------
#include "ressources.h"
//---------------------------------------------------------------------------------------------------------------
#define IDENTIFIANT_DOCUMENT "0123456789ABCDEF0123456789ABCDEF"
//---------------------------------------------------------------------------------------------------------------
// dessiner une image
//en dehors d'une stream !!!
void PDF_write_img(int x, int y, int x_s, int y_s, char *path_img, char *titre, HANDLE file_ext)
{
  //ouverture de l'image
  DWORD copiee;
  HANDLE Hsrc = CreateFile(path_img,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  char *buffer;
  long taille_fic = 0;
  if (Hsrc != INVALID_HANDLE_VALUE)
  {
    taille_fic = GetFileSize(Hsrc,NULL);  //__int64 aurait été plus adapté mais ici que pour des fichiers texte de petites tailles
    if (taille_fic)
    {
      buffer = malloc(sizeof(char*)*taille_fic+1);
      ReadFile(Hsrc, buffer, taille_fic,&copiee,0);
      buffer[taille_fic]=0;

      //on crée l'entête + ajouter une image
      char tmp[MAX_PATH];
      DWORD copiee;
      _snprintf(tmp,MAX_PATH,"%d 0 obj << /Type /Page/Parent 2 0 R/Rotate 0/MediaBox [0 0 595 842]/CropBox [0 0 595842] /Resources"
                             "<</ProcSet [/PDF/Text] /Font<</T1 3 0 R/T2 4 0 R/T3 5 0 R/T4 6 0 R>> /XObject <</I1 %d 0 R >>>>"
                             "/Contents %d 0 R >>\r\nendobj\r\n",++nb_items,nb_items+1,nb_items+2);
      WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
      debut_emplacement += strlen(tmp);

      //contenu du stream
      //ajout de l'image (emplacement /taille
      char stream[MAX_PATH];
      _snprintf(stream,MAX_PATH,"\r\n"
                             "q\r\n"
                             "%d 0 0 %d 300 700 cm\r\n"
                             "1 0 0 1 0 0 cm\r\n"
                             "/I1 Do\r\n"
                             "Q\r\n"
                             "BT/T3 12 Tf\r\n"
                             "%d %d Td\r\n"
                             "(%s) Tj\r\n"
                             "ET\r\n"
                ,x_s,y_s,x,y,titre);

      //création pour écriture
      _snprintf(tmp,MAX_PATH,"%d 0 obj\r\n"
                             "<</Length %d >>\r\n"
                             "stream%s"
                             "endstream\r\n"
                             "endobj\r\n"
                ,++nb_items,strlen(stream),stream);
      WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
      debut_emplacement += strlen(tmp);

      //ajout du contenu du fichier (entête
      _snprintf(tmp,MAX_PATH,"%d 0 obj\r\n"
                             "<</Name/I1/Type/XObject/Subtype/Image\r\n"
                             "/Width %d\r\n"
                             "/Height %d\r\n"
                             "/Length %d\r\n"
                             "/Filter/DCTDecode/ColorSpace/DeviceRGB\r\n"
                             "/BitsPerComponent 8>>\r\n"
                             "stream\r\n"
                ,++nb_items,x_s,y_s,taille_fic+4);
      WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
      debut_emplacement += strlen(tmp);

      //contenu du fichier

      //manque l'encodage + commentaires

      WriteFile(file_ext,buffer,taille_fic,&copiee,0);
      debut_emplacement += taille_fic;

      //fin de stream
      _snprintf(tmp,MAX_PATH,"\r\nendstream\r\n"
                             "endobj\r\n"
                ,++nb_items,x_s,y_s,taille_fic+2);
      WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
      debut_emplacement += strlen(tmp);

      free(buffer);
    }
  }
  CloseHandle(Hsrc);
}
//---------------------------------------------------------------------------------------------------------------
// dessiner une ligne
void PDF_write_ligne(int x, int y, int x2, int y2, unsigned int epaisseur, HANDLE file_ext)
{
  DWORD copiee;

  char tmp[MAX_PATH];
  _snprintf(tmp,MAX_PATH,"\r\n"
                         "%d w\r\n"       //épaisseur de la ligne en point
                         "%d %d m\r\n"    //point de départ de la ligne x,y
                         "%d %d l\r\n"    //point de fin de la ligne x,y
                         "S\r\n"          //c'est une ligne
                         "1 w\r\n"        //on remet l'épaisseur des traits à 1 pt / defaut
            ,epaisseur,x,y,x2,y2);

  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  debut_emplacement += strlen(tmp);
  taille_stream += strlen(tmp);

  ListeItem[nb_items].debut = debut_emplacement;
}
//---------------------------------------------------------------------------------------------------------------
// dessiner une ligne en pointillé
void PDF_write_ligne_pointille(int x, int y, int x2, int y2,unsigned int epaisseur, HANDLE file_ext)
{
  DWORD copiee;

  char tmp[MAX_PATH];
  _snprintf(tmp,MAX_PATH,"\r\n"
                         "%d w\r\n"       //épaisseur de la ligne en point
                         "[4 6] 0 d\r\n"  //format de pointillé en pts : 4pts en dur et 6pts vides
                         "%d %d m\r\n"    //point de départ de la ligne x,y
                         "%d %d l\r\n"    //point de fin de la ligne x,y
                         "S\r\n"          //c'est une ligne
                         "[ ] 0 d\r\n"    //on remet le format par défaut des lignes
                         "1 w\r\n"        //on remet l'épaisseur des traits à 1 pt / defaut
            ,epaisseur,x,y,x2,y2);

  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  debut_emplacement += strlen(tmp);
  taille_stream += strlen(tmp);

  ListeItem[nb_items].debut = debut_emplacement;
}
//---------------------------------------------------------------------------------------------------------------
// dessiner un  rectangle avec couleur
void PDF_write_rectangle(int x, int y, int x2, int y2,unsigned int epaisseur
                         ,unsigned char c_r,unsigned char c_g,unsigned char c_b //% contour RGB
                         ,unsigned char i_r,unsigned char i_g,unsigned char i_b //% intérieur RGB
                        , HANDLE file_ext)
{
  DWORD copiee;

  char tmp[MAX_PATH];
  _snprintf(tmp,MAX_PATH,"%d w\r\n"                   //épaisseur de la ligne en point
                         "%2.1f %2.1f %2.1f RG\r\n"   //couleur de contour en RGB sur 1 : 0.0 0.0 0.0 = noir
                         "%2.1f %2.1f %2.1f rg\r\n"   //couleur intérieur en RGB sur 1 : 0.0 0.0 0.0 = noir
                         "%d %d %d %d re\r\n"         //pt de début x,y et point opposé de fin x,y
                         "B\r\n"                      //un rectangle
                         "1 w\r\n"                    //on remet l'épaisseur des traits à 1 pt / defaut
                         "0.0 0.0 0.0 rg\r\n"         //réinit des couleur en noir par défaut
                         "0.0 0.0 0.0 RG\r\n"
            ,epaisseur,c_r/100.0,c_g/100.0,c_b/100.0,i_r/100.0,i_g/100.0,i_b/100.0,x,y,x2,y2);

  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  debut_emplacement += strlen(tmp);
  taille_stream += strlen(tmp);

  ListeItem[nb_items].debut = debut_emplacement;
}
//---------------------------------------------------------------------------------------------------------------
// dessiner une elipse avec couleur
// pt_d_x = point de début, pt_f_x =  de fin, pt_i_x = intermédiaire
void PDF_write_elipse(int x, int y, int pt_d_x, int pt_d_y, int pt_i_x, int pt_i_y,int pt_f_x, int pt_f_y
                         ,unsigned int epaisseur
                         ,unsigned char c_r,unsigned char c_g,unsigned char c_b //% contour RGB
                         ,unsigned char i_r,unsigned char i_g,unsigned char i_b //% intérieur RGB
                         , HANDLE file_ext)
{
  DWORD copiee;

  char tmp[MAX_PATH];
  _snprintf(tmp,MAX_PATH,"%d w\r\n"                 //épaisseur de la ligne en point
                         "%2.1f %2.1f %2.1f RG\r\n" //couleur de contour en RGB sur 1 : 0.0 0.0 0.0 = noir
                         "%2.1f %2.1f %2.1f rg\r\n" //couleur intérieur en RGB sur 1 : 0.0 0.0 0.0 = noir
                         "%d %d m\r\n"              //point central de départ
                         "%d %d %d %d %d %d c\r\n"  //point de début x,y, point intermédiaire x,y et point final x,y
                         "b\r\n"                    //elipse
                         "1 w\r\n"                  //on remet l'épaisseur des traits à 1 pt / defaut
                         "0.0 0.0 0.0 rg\r\n"       //réinit des couleur en noir par défaut
                         "0.0 0.0 0.0 RG\r\n"
            ,epaisseur,c_r/100.0,c_g/100.0,c_b/100.0,i_r/100.0,i_g/100.0,i_b/100.0,x,y
            ,pt_d_x,pt_d_y,pt_i_x,pt_i_y,pt_f_x,pt_f_y);

  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  debut_emplacement += strlen(tmp);
  taille_stream += strlen(tmp);

  ListeItem[nb_items].debut = debut_emplacement;
}
//---------------------------------------------------------------------------------------------------------------
// écrire du texte
void PDF_write_txt(int x, int y, unsigned int taille_txt, char *txt, HANDLE file_ext)
{
  DWORD copiee;

  char tmp[MAX_PATH];
  _snprintf(tmp,MAX_PATH,"\r\n"
                         "BT\r\n"           //begin/début de la zone de texte
                         "/F1 %d Tf\r\n"    //taille du texte écrit horizontalement
                         "%d %d Td\r\n"     //coordonnées du point
                         "(%s) Tj\r\n"      //text à écrire
                         "ET\r\n"           //end/fin de la zone de texte
            ,taille_txt,x,y,txt);

  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  debut_emplacement += strlen(tmp);
  taille_stream += strlen(tmp);

  ListeItem[nb_items].debut = debut_emplacement;
}
//---------------------------------------------------------------------------------------------------------------
// écrire du texte en couleur
void PDF_write_txt_color(int x, int y, unsigned int taille_txt, char *txt, HANDLE file_ext
                         ,unsigned char c_r,unsigned char c_g,unsigned char c_b)
{
  DWORD copiee;

  char tmp[MAX_PATH];
  _snprintf(tmp,MAX_PATH,"\r\n"
                         "%2.1f %2.1f %2.1f rg\r\n"   //couleur intérieur en RGB sur 1 : 0.0 0.0 0.0 = noir
                         "BT\r\n"                     //begin/début de la zone de texte
                         "/F1 %d Tf\r\n"              //taille du texte écrit horizontalement
                         "%d %d Td\r\n"               //coordonnées du point
                         "(%s) Tj\r\n"                //text à écrire
                         "ET\r\n"                     //end/fin de la zone de texte
                         "0.0 0.0 0.0 rg\r\n"         //réinit des couleur en noir par défaut
            ,c_r/100.0,c_g/100.0,c_b/100.0,taille_txt,x,y,txt);

  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  debut_emplacement += strlen(tmp);
  taille_stream += strlen(tmp);

  ListeItem[nb_items].debut = debut_emplacement;
}

//---------------------------------------------------------------------------------------------------------------
// debut de stream pour écrire ^^
void PDF_write_debut_stream(HANDLE file_ext)
{
  taille_stream = 0;
  DWORD copiee;

  char tmp[MAX_PATH];
  nb_items++;
  _snprintf(tmp,MAX_PATH,"%d 0 obj\r\n"             //numéro de l'objet
                         "<</Length %d 0 R >>\r\n"  //taille de la stream (contenant le text, images, lignes)
                                                    //et numéro de l'objet contenant la taille
                         "stream"                   //début de la zone stream
            ,nb_items,nb_items+1);
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);

  debut_emplacement += strlen(tmp);
  ListeItem[nb_items].debut = debut_emplacement;
}
//---------------------------------------------------------------------------------------------------------------
// fin de stream pour écrire ^^
void PDF_write_fin_stream(HANDLE file_ext)
{
  DWORD copiee;

  char tmp[MAX_PATH];
  nb_items++;
  _snprintf(tmp,MAX_PATH,"sendstream\r\n" //fin de la stream
                         "endobj\r\n"     //fin de l'objet
                         "%d 0 obj\r\n"   //nouvel objet contenant
                         "%d\r\n"         //taille de la stream précédente
                         "endobj\r\n"     //fin de l'objet
            ,++nb_items,taille_stream);
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);

  debut_emplacement += strlen(tmp);
  ListeItem[nb_items].debut = debut_emplacement;
}
//---------------------------------------------------------------------------------------------------------------
// début du document
void PDF_write_start(HANDLE file_ext, unsigned int nb_page_total)
{
  DWORD copiee;
  char tmp[MAX_PATH];

  //écriture de la version PDF utilisée
  _snprintf(tmp,MAX_PATH,"%%PDF-1.7\r\n");          //version du format PDF utilisé
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  debut_emplacement = strlen(tmp);

  //format du document
  _snprintf(tmp,MAX_PATH,"%d 0 obj<</Type/Catalog/Outlines 2 0 R/Pages 3 0 R>>\r\nendobj\r\n",++nb_items);
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  ListeItem[nb_items].debut = debut_emplacement;
  debut_emplacement += strlen(tmp);

  _snprintf(tmp,MAX_PATH,"%d 0 obj<</Type/Outlines/Count 0>>\r\nendobj\r\n",++nb_items);
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  ListeItem[nb_items].debut = debut_emplacement;
  debut_emplacement += strlen(tmp);

  _snprintf(tmp,MAX_PATH,"%d 0 obj<</Type/Pages/Kids [4 0 R]/Count %d>>\r\nendobj\r\n",++nb_items,nb_page_total); //ici on spécifié le nb de page
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  ListeItem[nb_items].debut = debut_emplacement;
  debut_emplacement += strlen(tmp);

  //taille de la page
  _snprintf(tmp,MAX_PATH,"%d 0 obj<</Type/Pages/Parent 3 0 R/MediaBox [0 0 612 792]/Contents 5 0 R/Resources <</ProcSet 6 0 R/Font <</F1 7 0 R>> >> >>\r\nendobj\r\n",++nb_items);
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  ListeItem[nb_items].debut = debut_emplacement;
  debut_emplacement += strlen(tmp);
}
//---------------------------------------------------------------------------------------------------------------
// fin du document
void PDF_write_end(HANDLE file_ext)
{
  DWORD copiee;
  char tmp[MAX_PATH];

  //format de fin du document
  _snprintf(tmp,MAX_PATH,"%d 0 obj [/PDF]\r\nendobj\r\n",++nb_items);
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  ListeItem[nb_items].debut = debut_emplacement;
  debut_emplacement += strlen(tmp);

  _snprintf(tmp,MAX_PATH,"%d 0 obj <</Type/Font/Subtype/Type1/Name/F1/BaseFont/Helvetica/Encoding/MacRomanEncoding>>\r\nendobj\r\n",++nb_items);
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  ListeItem[nb_items].debut = debut_emplacement;
  debut_emplacement += strlen(tmp);

  //début de l'index
  _snprintf(tmp,MAX_PATH,"xref\r\n0 %d\r\n0000000000 65535 f\r\n",nb_items+1);
  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);

  //index des objets (octet de début) + infos divers
  unsigned int i;

  for (i=1;i<nb_items-1;i++)
  {
    _snprintf(tmp,MAX_PATH,"%010d 00000 n\r\n",ListeItem[i].debut);
    WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
  }

  //trailer de fin
  _snprintf(tmp,MAX_PATH,"trailer\r\n<</Size %d/Root 1 0 R/ID[<%s><%s>]>>\r\nstartxref\r\n%d\r\n%%%%EOF\r\n"
            ,nb_items+1
            ,IDENTIFIANT_DOCUMENT
            ,IDENTIFIANT_DOCUMENT
            ,debut_emplacement);

  WriteFile(file_ext,tmp,strlen(tmp),&copiee,0);
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   bin
    • Release
  • exemple.pdfTélécharger ce fichier [Réservé aux membres club]1 326 octets
  • main.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 747 octets
  • my_create_PDF.cbpTélécharger ce fichier [Réservé aux membres club]932 octets
  • my_create_PDF.dependTélécharger ce fichier [Réservé aux membres club]381 octets
  • my_create_PDF.layoutTélécharger ce fichier [Réservé aux membres club]456 octets
  • ressources.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 353 octets
  • ressources_PDF.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier16 540 octets
  • test.jpgTélécharger ce fichier [Réservé aux membres club]Voir ce fichier41 512 octets

Télécharger le zip


 Sources du même auteur

[C][RTF] EXEMPLE DE TABLEAU EN RTF (POUR RICHEDIT)
Source avec Zip [WMI][C++][DEV-C++] LECTURES D'INFORMATIONS AVEC WMI SOUS DE...
Source avec Zip [WIN32][C][DEV-C++] AUTO LIST EN HTML
Source avec Zip Source avec une capture [WIN32][C][DEV-C++] GRAPH TRANSPARENT DEBIT RESEAU
Source avec Zip Source avec une capture [WIN32][C][DEV-C++] WSEARCH GOOGLE HACK

 Sources de la même categorie

Source avec Zip Source avec une capture PLANNING D'EQUIPE par grephit
Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture IRC CLIENT MULTISERVEUR EN MFC (TXIRC) par TeniX
Source avec Zip ENTETE DU FICHIER BMP (BIPMAP) par k.Lutchi

 Sources en rapport avec celle ci

Source avec Zip EVALUATEUR D'EXPRESSION ARITHMÉTIQUE par matrx180vTitanium
COMPTER LE NOMBRE DE PAGES D'UN FICHIER PDF par Renfield
Source avec Zip Source avec une capture CONTACTS MANAGER par eapaceinfo
Source avec Zip Source avec une capture OPENCL : CALCUL ET AFFICHAGE DU GRADIENT COULEUR D'UNE WEBCA... par ciddiju
Source avec Zip Source avec une capture PDFGEN- CREATION DE FICHIERS PDF par xtremejames183

Commentaires et avis

Commentaire de loupapetjpr le 31/05/2010 10:26:59

Bonjour,
Personnellement, j'utilise CutePDF gratuit sous Windows et sous Ubuntu comme pseudo-imprimante et la méthode marche donc avec tous les logiciels. La solution est standard et me paraît assez élégante.
Lou Papet

Commentaire de LeFauve42 le 31/05/2010 11:38:19

Bonjour,

C'est effectivement un bon depart, et ca permet de demystifier un peu le PDF.
Merci de partager cette ebauche avec nous !

Eric

Commentaire de omnia le 31/05/2010 16:24:11

Bonjour,
  pour répondre à "loupapetjpr", pour info nous sommes sur un site de dev, donc dire qu'il est mieux d'utiliser une application que de dev...

pour info la création d'une librairie permettrait d'ajouter simplement une exportation en PDF sans installer tout un tas d'applications.

C'est d'ailleurs le but, je vais m'y mettre pour un besoins d'exportation dans une application multi-Os.

cette source n'est qu'une ébauche encore assez mal commenté, pour simplement montrer que faire un PDF n'est pas si compliqué.

Bon codage

Commentaire de moimoi45 le 08/06/2010 11:07:12 9/10

Très belle source bo taff  9 pour pas dire 10 j'étais à la recherche et voila je butais sur plusieur partie en écriture surtout//////
Merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

création d'une interface graphique [ par ordy ] bonjour, j'aimerais créer une interface graphique assez simple.l'interface graphique comprend 2 champs. un champ unicast et un autremulticast.avec 2 b création de graphique [ par johnASP ] Bonjour! Quelqu'un pourrait me dire comment je pourrai faire pour créer un graphique à 2 axes X et Y ? J'utilise le logiciel Visual Studio 2005. Et s création d'un éditeur graphique sous borland C++ [ par cocanash ] Mon but est de créer un logiciel de pilotage d'un système CFAO.Donc ce qui m'incombre est là partie graphique......Donc on doit charger un plan préala conception d'interface graphique [ par triton057 ] Bonjour,Je souhaite créer un outil de conception d'interface graphique multi plateformes. Quelqu'un aurait il un exemple d'interface de conception d'i Création de fichier excel et ajout d'un diagramme en c++ [ par btsig ] Bonjour,Nous sommes un groupuscule de quiches en programmation (notre niveau est indigne voire irréel) et notre sadique de prof nous a demandé de crée interface graphique [ par elhajjajireda ] Bonjour, j'ai crée une bibliothèque qui fait le traitement d'image et je veux savoir quel outil je dois utiliser pour créer une interface graphique ( création d'un processus en C sous linux [ par azimhamid1975 ] salut à tous j'ai un probléme [^^confus2] [^^sad1] je cherche un programme C qui crée un processus sachant que : le processus parent (en C sous linux bibliotheque graphique de dev c++ [ par mustaf21 ] bonjour je voudrai me documenter sur le bibliotheque de dev c++ j'ai un projet sur le jeu du snake. Création de fichier sous Window7 [ par ArthurAuguste ] Bonjour, Bon je suis toujours sous XP, mais j'ai voulu bidouiller chez quelqu'un dont le micro est sous windows 7. Quand je crée à la main (copié-coll visualiser un fichier pdf dans une Cdialog sans uliser l'activeX Adobe Reader [ par Nouaim90 ] Bonjour tout le monde !! Je suis en stage d'application , et j'ai comme projet (mini projet plutot :p) une application en Visual C++ consistant à cha


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,061 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales