création d'un logiciel d'impression
Bonjour.
Je suis un débutant programmeur en VB.NET, et je me lance dans un nouveau projet. Je sollicite votre aide SVP.
Voici mon problème :
Je dispose de papier sur lequel est imprimé un formulaire que la secrétaire doit remplir. Mais la société voudrais que la saisie se fasse
à l'aide d'un logiciel que je dois implémenter.
Comment faire de sorte qu'à l'impression on ne puisse imprimer que les éléments saisis et cela au bon endroit sur le formulaire.
Exemple d'un formulaire :
NOM : .........................................
PRÉNOMS : ..................................
La secrétaire dois compléter les nom et prénoms du client de sorte que lorsqu'on positionne,
dans l'imprimante, les papiers sur lesquels se trouve déjà le formulaire et qu'on lance l'impression, on puisse obtenir ceci par exemple:
NOM : DUBOIS
PRENOMS : LAVOISIER DUSABLE
J'espère avoir bien posé le problème. Merci pour votre aide.
imprimer une sortie ecran sur formulaire papier
la sortie d'un winform sur un formulaire papier exige :
Mise à l'echelle du Form et du Support papier formulaire ce qui manque dans les powerbasics3
Aussi je te demande de faire ceci:
1/Scanner ton formulaire à l'echelle 1:1 du scanner pour une bonne mise à l'echelle.
2/l'Inspecter avec photoshop ou paintshop pour avoir les dimensions en pixel
3/Mettre les memes dimension ou des dimensions proportionnelles(rapport hauteur/largeur à preserver) dans le winform(wide et height),meme s'il est grand par rapport à ton ecran(il y a scrollbars).
5/Dans la propriete backgroundimage charger le formulaire scanne.
6/positioner par dessus l'image les textbox de saisie.
Je t'envoi ci-apres le code dont le principe est tire de la doc msdn.Il consiste à capture une image bmp des elements -seulement visibles je souligne- du formulaire (donc tu mettras la propriete visible des boutons,et du backgroudimage à visible=false).
Ensuite J'ai ajoute à la doc msdn ce qui manquait c.à.d mettre à l'echelle l'image capture au format papier choisi et l'envoyer à l'imprimante.
Rajouter 3 boutons :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
'-MISE EN PAGE
'-APERCU AVANT IMPRESSIOn
'-IMPRIMER
'-Evidement si c'est pas satisfaisant on peut utiliser une 2ème fenetre
'-dedie au document en changeant un peu le code ou mieux dans la meme fentre
'-mettre un usercontrol pour l'imprime et rajouter des scrollbars.
Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Drawing.Printing
Public Class FormeImprime2
Inherits Form
Private WithEvents ImpressionDoc As New PrintDocument
Dim PageAjuste As Printing.PageSettings
Dim LargeurPage As Single
Dim HauteurPage As Single
Dim margeGD As Integer
Dim margeHB As Integer
Dim ImageArrierePlan As System.Drawing.Image = Nothing
Dim ArrierePlanVide As System.Drawing.Image = Nothing
Public Sub New()
InitializeComponent()
btnImprime.Text = "Imprime Formulaire"
Me.TopMost = True
End Sub
Dim ImageMemoire As Bitmap
Private Sub ImpressionDoc_PrintPage(ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles _
ImpressionDoc.PrintPage
e.Graphics.PageUnit = GraphicsUnit.Millimeter
e.Graphics.PageScale = 1.0
e.Graphics.DrawImage(ImageMemoire, margeGD, margeHB, LargeurPage, HauteurPage)
' ----- Limite sortie à une seule page.
e.HasMorePages = False
End Sub
Private Sub imprimeButton_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnImprime.Click
' rend invisibles les boutons
Me.TopMost = False
Me.btnApercu.Visible = False
Me.btnMiseEnPage.Visible = False
Me.btnImprime.Visible = False
Me.txtPage.Visible = False
Me.txtPage.Visible = False
'sauve arriere plan
ImageArrierePlan = Me.BackgroundImage
Me.BackgroundImage = Nothing
Me.Refresh()
Me.Invalidate()
CaptureEcran()
ImpressionDoc.Print()
' rend visibles les boutons
Me.TopMost = True
Me.btnApercu.Visible = True
Me.btnMiseEnPage.Visible = True
Me.btnImprime.Visible = True
'restaure arriere plan
Me.BackgroundImage = ImageArrierePlan
End Sub
Private Sub btnApercu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnApercu.Click
' ----- Apercu
'rend invisibles les boutons
Me.TopMost = False
Me.btnApercu.Visible = False
Me.btnMiseEnPage.Visible = False
Me.btnImprime.Visible = False
Me.txtPage.Visible = False
'sauve arriere plan
ImageArrierePlan = Me.BackgroundImage
Me.BackgroundImage = Nothing
Me.Refresh()
CaptureEcran()
PrintPreviewDialog1.Document = ImpressionDoc
PrintPreviewDialog1.ShowDialog()
'rend visibles les boutons
Me.TopMost = True
Me.btnApercu.Visible = True
Me.btnMiseEnPage.Visible = True
Me.btnImprime.Visible = True
Me.txtPage.Visible = True
'restaure arriere plan
Me.BackgroundImage = ImageArrierePlan
End Sub
Private Sub btnMiseEnPage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMiseEnPage.Click
' ----- mise en page.
PageAjuste = New Printing.PageSettings
PageSetupDialog1.Document = ImpressionDoc
PageSetupDialog1.PageSettings = PageAjuste
If PageSetupDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
PageAjuste = PageSetupDialog1.PageSettings
'Retrouve Dimension Page et Marges (Unites(1/00 pouces)
margeGD = PageAjuste.Margins.Left
margeHB = PageAjuste.Margins.Top
LargeurPage = PageAjuste.PaperSize.Width
HauteurPage = PageAjuste.PaperSize.Height
'Conversion en Unites(mm) = Unites(1/00 pouces) x25.4mm/100
margeGD = PageAjuste.Margins.Left * 25.4 / 100.0
margeHB = PageAjuste.Margins.Top * 25.4 / 100.0
LargeurPage = LargeurPage * 25.4 / 100.0
HauteurPage = HauteurPage * 25.4 / 100.0
'centrer la page aux marges
'(soustraire marges droite-gauche + marges haute-basse)
'paysage on permute
If PageAjuste.Landscape Then
Dim temp As Single = LargeurPage
LargeurPage = HauteurPage - 2 * margeGD
HauteurPage = LargeurPage - 2 * margeHB
Else
LargeurPage = LargeurPage - 2 * margeGD
HauteurPage = HauteurPage - 2 * margeHB
End If
Me.txtPage.Text = txtPage.Text & LargeurPage.ToString & " X " & HauteurPage.ToString & " mm"
Else
margeGD = 0
margeHB = 0
LargeurPage = 0
HauteurPage = 0
Me.txtPage.Text = ""
Exit Sub
End If
End Sub
Private Sub CaptureEcran()
Dim monObjetGraphics As Graphics = Me.CreateGraphics()
Dim taille As Size = Me.Size
'------------si on a un user control------------------
'Dim taille As Size = Me.monUserCtrl.Size
'----------------------------------------------
'on soustrait 80 pixels pour eviter la barre des taches windows et titre fenetre ImageMemoire = New Bitmap(taille.Width, taille.Height - 80, monObjetGraphics)
ImageMemoire = New Bitmap(taille.Width, taille.Height - 60, monObjetGraphics)
Dim GraphicsMemoire As Graphics = Graphics.FromImage(ImageMemoire)
Dim pt1 As Point
pt1 = Me.Location
'ici on convertit coord clients en coord.ecran si
'on utilise un user control
'pt1 = Me.monUserCtrl.PointToScreen(pt1)
GraphicsMemoire.CopyFromScreen(pt1.X, pt1.Y, 0, 0, ImageMemoire.Size)
End Sub
Public Shared Sub Main()
Application.Run(New FormeImprime2())
End Sub
End Class |
p.j:fichier code rar
bon code...
mesurer en mm,avec pageunit
Bonjour,je suis d'accord mais EventArgs de Paint n'est pas accesible dans un PageSetupDialog,helas .
Celui-ci fournit des dimenensions de pages et autres margins en centiemes de pouce par defaut dans l'argument papersize de printinSettings .
D'ou il s'ensuit qu'il faut diviser par cent pour obtenir des pouces et multiplier par 25.4 millimetres.
Le pageUnit est necessaire dans l'evenement Paint parce il dit à celui-ci que les arguments transmis sont en millimetres.
Ensuite il y a egalement l'echelle qu'on doit specficier si on veut retricir la sortie bitmap.
bon j'admets que l'impression a ete toujours un "Pensum" (a nightmare) c'est pour ca que microsoft d'apres la majorite des auteurs de code diffuse CrystalReport dans ses produits.
En matiere de code il y a mille et moyens da faire la meme chose,c'est connu et ca varie suivant l'objectif et les moyens qu'on est mets....
Bonne soiree....