[RESOLU] Impression selon un modèle

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

[RESOLU] Impression selon un modèle

Message par wood51 »

Bonsoir,
Je cherche à imprimer des documents selon un modèle déterminer . En gros je fait mon modèle avec des variables du genre #ma_variable
qui seront remplacé par les données généré par mon code PureBasic .
J'ai étudier plusieurs pistes :

* Créer un modèle RTF puis l'imprimer . Le soucis, a priori le format ne gère pas les "tableaux dans les tableaux :?: "

* Créer un modèle HTML puis l'imprimer . Autre soucis quand j'imprime j'ai l'entête et le pied de page tout moche qui s'imprime.
j'ai cherché à désactiver ce truc par les feuilles de style mais , c'est pas possible et je voudrait que çà soit transparent pour l'utilisateur (pas besoin de désactiver l'impression de l'entête etc dans la boite de dialogue )

J'ai la solution ( ce que j'ai utiliser déjà ) de "dessiner" dans mon code le modèle mais si je veut géré plusieurs modèle c’est plus que galère

La dernière solution que j'ai trouvé c'est de générer directement le code de mon modèle en "analysant" le modèle html mais là je ne pense pas que ce soit de mon niveau (gestion de la taille de la page , taille des polices , tableau etc ...)
Je continus mes recherche mais je voit pas trop .

Auriez vous une piste pour moi SVP ?

David
Dernière modification par wood51 le dim. 13/mai/2012 17:33, modifié 1 fois.
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Re: Impression selon un modèle

Message par wood51 »

Bonsoir,
J'ai opté pour l'analyse du code HTML et la génération dynamique du code d'impression .
J'arrive a extraire les balises et à savoir quel type de balises c'est . Je comptait aussi essayer de gérer l'imbrication des balises mais je ne sais pas si c'est nécessaire :?:
La suite c'est de retrouver le texte entre balises et de dessiner :) .
La grande question est de savoir si je suis dans le vrai et si la solution est faisable ou est ce que je suis complètement à coté de la plaque :?: :?: :?:

Voici le début du code (Adapté d'un code de "Benny" trouvé sur CodeArchiv) :

Code : Tout sélectionner

Structure Balise
  start_pos.i
  longueur.i 
  imbrication.i
  type.i
  nom.s
EndStructure

html.s="première ligne<br><i>deuxième ligne</i><br><u>3ème ligne</u>"
Debug "Code HTML :"
Debug html.s
Debug ""
  
lg.l = Len (html.s) 
  capture.l= 0               ; Pas de balise ouverte
  imbrication_flag.b
  Balise.s = ""
  NewList Balise.Balise()
  
  For i =1 To lg
    part.s = Mid(html.s, i, 1) 
    
    If part.s = "<"             ; une balise a été ouverte
      AddElement(Balise())      ; on ajoute une balise
      Balise()\start_pos = i    ; on enregistre la postition de la balise
      Balise()\imbrication = 0  ; niveau d'imbrication de la balise
      Balise()\type = 1
      capture.l = 1            
    EndIf 
    
    If capture = 1
      part.s = Mid(html.s, i, 1)  ; on capture la balise
      
      If part.s ="/"
        Balise()\type = 0         ; balise de fermeture   
      EndIf   
      
      Balise.s +part.s 
    EndIf
    
    If capture.l = 1 And part.s = ">"    
      Balise()\nom = Balise.s           ; nom de la balise
      Balise()\longueur = Len(Balise.s) ; longueur de la balise
           
      Balise.s=""
      capture.l = 0                     ; la balise à été refermé
    EndIf    
    
  Next i
  
  ForEach Balise()
    With Balise()
      If \type = 0
        type.s="Fermeture"
      Else
        type.s="Ouverture"
      EndIf
      
      Debug "Balise " + \nom + " Position "  + Str(\start_pos) + " Longueur " + Str(\longueur) + " Type " + type.s
    EndWith
  Next
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Impression selon un modèle

Message par Mesa »

On peut faire la même chose mais avec moins de code en utilisant les expressions régulières :

Code : Tout sélectionner

;Expression régulière pour trouver "<une chaine de caractère pouvant contenir le signe/>" : <([^>]*[^/])>
html.s="<br>première ligne<br>deuxième ligne<br>3ème ligne"

;html.s="première ligne<br><i>deuxième ligne</i><br><u>3ème ligne</u>"
Debug "Code HTML :"
Debug html
Debug ""

If CreateRegularExpression(0, "<([^>]*[^/])>")
Dim Result$(0)
 
  a = ExtractRegularExpression(0, html, result$())
 
  Debug ( "Nb de balises trouvées : "+Str(a))
 
  position =1
  For k=0 To a-1
    Debug( Result$(k))
    Position = FindString(html, Result$(k), position) 
    Debug position
    
     Position + Len(Result$(k));Position + 1 
  Next
   
Else
  MessageRequester("Erreur", RegularExpressionError())
EndIf

Mesa.
Dernière modification par Mesa le sam. 12/mai/2012 8:25, modifié 1 fois.
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Impression selon un modèle

Message par wood51 »

Merci beaucoup . J'y avais pensé mais comme je ne maîtrise pas je me suis rabattu sur une autre solution . Je vais faire la modification
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Re: Impression selon un modèle

Message par wood51 »

euh petit soucis ,
quand je mets deux balises qui se suivent il m'indique la même position pour les 2 balises.

exemple :

Code : Tout sélectionner

html.s="première ligne<br>deuxième ligne<br>3ème ligne"
les résultats renvoyé est position 15 et 15
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Impression selon un modèle

Message par G-Rom »

met à jour ta position dès lors que tu trouves la première occurrence.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Impression selon un modèle

Message par Mesa »

Code mis à jour.

Mesa.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Impression selon un modèle

Message par falsam »

je pense que je n'ai pas compris ce que tu veux faire.

A partir du moment ou tu veux juste remplacer tes variable du type #MaVariable par tes propres données, quel est l’intérêt de localiser les balises html.

Supprimer les balises html ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Re: Impression selon un modèle

Message par wood51 »

bonjour ,
en fait je veut générer un impression à partir du code html . donc dès je tombe sur un balise "<br>" , je fait un draw text à la ligne suivante , si c'est <i> je change la police etc ... et je n’oublie pas , au passage , de remplacer mes variables par mes données (qui se trouve dans une BD sqlite).
Je ne sais si c'est possible ( surtout à mon niveau ) mais qui ne tente à rien n'a rien :D

PS : Je suis désolé j'ai un peu de mal a m'exprimer , toute mes excuses :oops:
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Re: Impression selon un modèle

Message par wood51 »

En farfouillant , j'ai trouvé la solution à mon problème !!!
* Créer un modèle HTML puis l'imprimer . Autre soucis quand j'imprime j'ai l'entête et le pied de page tout moche qui s'imprime.
j'ai cherché à désactiver ce truc par les feuilles de style mais , c'est pas possible et je voudrait que çà soit transparent pour l'utilisateur (pas besoin de désactiver l'impression de l'entête etc dans la boite de dialogue )
J'ai trouvé un code pour modifier la mise en page (code de gnozal) .

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Button_Preview
  #Button_Print
  #CheckBox
  #Editor
  #Web
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}

; Constants for the ExecWB Method:
#OLECMDID_PRINT             = 6
#OLECMDID_PRINTPREVIEW      = 7
#OLECMDEXECOPT_PROMPTUSER       = 1
#OLECMDEXECOPT_DONTPROMPTUSER   = 2


Procedure.s GetKeyString(HKEY_Folder.l, key.s, Subkey.s)
  Protected OpenKey.l, Type.l, cbData.l, *lpbData, ReturnValue.s
  cbData = (#MAX_PATH * 2) + 2
  *lpbData = AllocateMemory(cbData)
  If RegOpenKeyEx_(HKEY_Folder, key, 0, #KEY_ALL_ACCESS, @OpenKey) = #ERROR_SUCCESS
    If RegQueryValueEx_(OpenKey, Subkey, 0, @Type, *lpbData, @cbData) = #ERROR_SUCCESS
      If Type = #REG_SZ
        ReturnValue = PeekS(*lpbData)
      EndIf
    EndIf
    RegCloseKey_(OpenKey)
  EndIf
  FreeMemory(*lpbData)
  ProcedureReturn ReturnValue
EndProcedure

Procedure.l SetKeyString(HKEY_Folder.l, key.s, Subkey.s, Value.s)
  Protected OpenKey.l, ReturnValue.l
  If RegOpenKeyEx_(HKEY_Folder, key, 0, #KEY_ALL_ACCESS, @OpenKey) = #ERROR_SUCCESS
    If RegSetValueEx_(OpenKey, Subkey, 0, #REG_SZ, @Value, Len(Value) + 1) = #ERROR_SUCCESS
      ReturnValue = #True
    EndIf
    RegCloseKey_(OpenKey)
  EndIf
  ProcedureReturn ReturnValue
EndProcedure

Procedure ModifyIEHeaderFooter(State.l) ; #TRUE : modify , #FALSE : reverse to original
  Static FirstTime.l, IEHeader.s, IEFooter.s, IELeft.s, IERight.s, IEBottom.s
  If FirstTime = 0
    IEHeader = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "header") ; default : "&w&bPage &p de &P"
    IEFooter = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "footer") ; default : "&u&b&d"
    IELeft = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_left") ; default : "0.750000"
    IERight = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_right") ; default : "0.750000"
    IEBottom = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_bottom") ; default : "0.750000"
    FirstTime = 1
  EndIf
  If State = #True
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "header", "")
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "footer", "")
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_left", IELeft)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_right", IERight)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_bottom", IEBottom)
  Else
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "header", IEHeader)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "footer", IEFooter)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_left", IELeft)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_right", IERight)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_bottom", IEBottom)
  EndIf
EndProcedure 

Procedure Print_HTML(mode.i = 1)
WebObject.IWebBrowser2 = GetWindowLong_(GadgetID(#Web), #GWL_USERDATA)
Repeat
  WebObject\get_Busy(@IsBusy.l)
  Delay(1)
  While WindowEvent(): Wend
Until IsBusy = 0

Select mode
  Case 1
    ; Ouverture de PrintDlg pour impression
    WebObject\ExecWB(#OLECMDID_PRINT, #OLECMDEXECOPT_PROMPTUSER, 0, 0)
  Case 2
    ; Impression directe
    WebObject\ExecWB(#OLECMDID_PRINT, #OLECMDEXECOPT_DONTPROMPTUSER, 0, 0)
  Case 3
    ; Aperçu avant impression
    WebObject\ExecWB(#OLECMDID_PRINTPREVIEW, #OLECMDEXECOPT_DONTPROMPTUSER, 0, 0)
EndSelect

EndProcedure




Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 520, 166, 344, 298, "HTML Print", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget)
    ButtonGadget(#Button_Preview, 15, 255, 90, 30, "Aperçu")
    ButtonGadget(#Button_Print, 120, 255, 90, 30, "Imprimer")
    CheckBoxGadget(#CheckBox, 225, 255, 105, 30, "Afficher PrintDlg")
    EditorGadget(#Editor, 15, 15, 315, 225)
    WebGadget(#Web, 0, 0, 10, 10, "")
    SetGadgetState(#CheckBox,#PB_Checkbox_Checked)
  EndIf
EndProcedure
style$ = "<style>.Break { page-Break-after: always; }</style>" + #CRLF$
html$ = style$ + "<h1>Page 1</h1>" + #CRLF$ + "<div class='Break'></div>" + #CRLF$ + "<h1>Page 2</h1>"

OpenWindow_Window_0()
SetGadgetText(#Editor,html$)

;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
      ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Button_Preview
        txt$=GetGadgetText(#Editor)
        SetGadgetItemText(#Web,#PB_Web_HtmlCode,txt$)
        Print_HTML(3)
        
      ElseIf EventGadget = #Button_Print
        txt$=GetGadgetText(#Editor)
        SetGadgetItemText(#Web,#PB_Web_HtmlCode,txt$)
        If GetGadgetState(#CheckBox)
          Print_HTML(1)
        Else
          Print_HTML(2)
        EndIf
      EndIf
      
        ; ////////////////////////
      Case #PB_Event_CloseWindow
        EventWindow = EventWindow()
        If EventWindow = #Window_0
          CloseWindow(#Window_0)
          Break
        EndIf
    EndSelect
  ForEver
  ;
;}
J'ai plus qu'à faire mon modèle en html avec mes variables à remplacer et le tour est joué :D
depuis le temps que je voulais faire un truc comme çà . En tous cas merci de vos réponses ...
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Répondre