Accueil > > > [WIN32][CB]CRÉATION DIRECTE DE PDF
[WIN32][CB]CRÉATION DIRECTE DE PDF
Information sur la source
Description
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);
}
Sources du même auteur
Sources de la même categorie
Commentaires et avis
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
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|