Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

(.NET 2.0) M'assurer d'une impression identique d'une imprimante à l'autre

2 réponses
Avatar
Anne DeBlois
Bonjour,

Je sais qu'en raison des différences de marges physiques et de résolution
(dpi) d'une imprimante à l'autre, je cherche à faire en sorte que mon
imprimé ait une position absolue par rapplrt à la marge de gauche et à la
marge inférieure quel que soit le périphérique vers lequel j'envoie mon
PrintDocument.

Le code qui suit m'a l'air OK pour obtenir les marges physiques de
l'imprimante:

---Début---
Dim marge_physique_gauche As Single
Dim marge_physique_haute As Single
Dim dpiX As Integer
Dim dpiY As Integer

'API de lecture des capacités de l'imprimante
Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As
IntPtr, ByVal capIndex As Int32) As Int32

Private Const LOGPIXELSX As Integer = 88
Private Const LOGPIXELSY As Integer = 90
Private Const PHYSICALOFFSETX As Integer = 112
Private Const PHYSICALOFFSETY As Integer = 113

'on récupere les marges physiques de l'imprimante
Dim hdc As IntPtr = e.Graphics.GetHdc
dpiX = GetDeviceCaps(hdc, LOGPIXELSX) 'résolution horizontale
dpiY = GetDeviceCaps(hdc, LOGPIXELSY) 'résolution verticale
marge_physique_gauche = (GetDeviceCaps(hdc, PHYSICALOFFSETX)) / dpiX
* 100
marge_physique_haute = (GetDeviceCaps(hdc, PHYSICALOFFSETY)) / dpiY
* 100
e.Graphics.ReleaseHdc(hdc)

--------Fin----------------------

Cependant, pour m'assurer que la position d'un rectangle hypothétique que je
veux placer dans le coin supérieur gauche de ma page soit exactement au même
endroit peu importe l'imprimante et sa résolution...

e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(??,??,<la largeur>,<la
hauteur>)

...je cherchais d'abord un algo permettant de calculer un point X,Y de
départ qui ne «bougera» pas selon que je l'imprime sur un périphérique
gérant une résolution de 1200x1200 dpi ou sur une imprimante à jet d'encre à
360x260 dpi. Quelqu'un a-t-il une idée?

Entretemps, je me suis rappelé qu'il est possible de définir des marges
fixes avec l'option **OriginAtMargins = True** dans les propriétés de mon
PrintDocument.
J'ai donc essayé ceci (en mettant en commentaires les lignes pour
l'obtention des marges physiques):

---Début----
Try

Dim marges As New Printing.Margins(100, 100, 100, 100)
PrintDocument1.DefaultPageSettings.Margins = marges
' Crée une zone d'impression avec les marges définies ci-haut

Dim rectangle As New Rectangle(0, 0, 400, 80)
e.Graphics.FillRectangle(Brushes.Cyan, rectangle)
e.Graphics.DrawRectangle(Pens.Cyan, rectangle)

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
----Fin-----

Ce code fonctionne parfaitement, et à 1/32 près, j'obtiens une marge
uniforme quelle que soit l'imprimante que j'utilise. Cependant, en changeant
la ligne Dim marges As New Printing.Margins(100, 100, 100, 100) pour Dim
marges As New Printing.Margins(0, 0, 0, 0) (c'est-à-dire des zéros partout),
bizarrement mon rectangle s'imprime dans une marge de 2,5 cm de hauteur et
2,5 cm de hauteur, et ce peu importe l'imprimante que j'ai utilisée.

Normalement, je devrais avoir mon rectangle très près du coin supérieur
gauche de ma page, je n'arrive pas à trouver pourquoi. Faut-il réinitialiser
les DefaultSettings?

Merci pour votre aide. J'espère avoir été assez précise.

ANNE DEBLOIS

2 réponses

Avatar
Richard Clark
Les margin donnés par .NET sont une approximation (ouai, super ;-))),
ils ne prennent pas compte de la différence qu'il peut y avoir entre les
marges gauche et droite par exemple) mais qui suffisent dans 90% des cas
(on n'est pas à 3mm près pour imprimer une facture ou un état
comptable).
Maintenant pour avoir des données précises, tu es effectivement obligé
de passer par les API Win32.

--
Richard Clark - MVP .NET
http://www.c2i.fr
http://www.project-hoshimi.com


"Anne DeBlois" wrote in message
news::

Bonjour,

Je sais qu'en raison des différences de marges physiques et de résolution
(dpi) d'une imprimante à l'autre, je cherche à faire en sorte que mon
imprimé ait une position absolue par rapplrt à la marge de gauche et à la
marge inférieure quel que soit le périphérique vers lequel j'envoie mon
PrintDocument.

Le code qui suit m'a l'air OK pour obtenir les marges physiques de
l'imprimante:

---Début---
Dim marge_physique_gauche As Single
Dim marge_physique_haute As Single
Dim dpiX As Integer
Dim dpiY As Integer

'API de lecture des capacités de l'imprimante
Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As
IntPtr, ByVal capIndex As Int32) As Int32

Private Const LOGPIXELSX As Integer = 88
Private Const LOGPIXELSY As Integer = 90
Private Const PHYSICALOFFSETX As Integer = 112
Private Const PHYSICALOFFSETY As Integer = 113

'on récupere les marges physiques de l'imprimante
Dim hdc As IntPtr = e.Graphics.GetHdc
dpiX = GetDeviceCaps(hdc, LOGPIXELSX) 'résolution horizontale
dpiY = GetDeviceCaps(hdc, LOGPIXELSY) 'résolution verticale
marge_physique_gauche = (GetDeviceCaps(hdc, PHYSICALOFFSETX)) / dpiX
* 100
marge_physique_haute = (GetDeviceCaps(hdc, PHYSICALOFFSETY)) / dpiY
* 100
e.Graphics.ReleaseHdc(hdc)

--------Fin----------------------

Cependant, pour m'assurer que la position d'un rectangle hypothétique que je
veux placer dans le coin supérieur gauche de ma page soit exactement au même
endroit peu importe l'imprimante et sa résolution...

e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(??,??,<la largeur>,<la
hauteur>)

...je cherchais d'abord un algo permettant de calculer un point X,Y de
départ qui ne «bougera» pas selon que je l'imprime sur un périphérique
gérant une résolution de 1200x1200 dpi ou sur une imprimante à jet d'encre à
360x260 dpi. Quelqu'un a-t-il une idée?

Entretemps, je me suis rappelé qu'il est possible de définir des marges
fixes avec l'option **OriginAtMargins = True** dans les propriétés de mon
PrintDocument.
J'ai donc essayé ceci (en mettant en commentaires les lignes pour
l'obtention des marges physiques):

---Début----
Try

Dim marges As New Printing.Margins(100, 100, 100, 100)
PrintDocument1.DefaultPageSettings.Margins = marges
' Crée une zone d'impression avec les marges définies ci-haut

Dim rectangle As New Rectangle(0, 0, 400, 80)
e.Graphics.FillRectangle(Brushes.Cyan, rectangle)
e.Graphics.DrawRectangle(Pens.Cyan, rectangle)

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
----Fin-----

Ce code fonctionne parfaitement, et à 1/32 près, j'obtiens une marge
uniforme quelle que soit l'imprimante que j'utilise. Cependant, en changeant
la ligne Dim marges As New Printing.Margins(100, 100, 100, 100) pour Dim
marges As New Printing.Margins(0, 0, 0, 0) (c'est-à-dire des zéros partout),
bizarrement mon rectangle s'imprime dans une marge de 2,5 cm de hauteur et
2,5 cm de hauteur, et ce peu importe l'imprimante que j'ai utilisée.

Normalement, je devrais avoir mon rectangle très près du coin supérieur
gauche de ma page, je n'arrive pas à trouver pourquoi. Faut-il réinitialiser
les DefaultSettings?

Merci pour votre aide. J'espère avoir été assez précise.

ANNE DEBLOIS


Avatar
Anne DeBlois
Il n'est donc pas possible de forcer des marges de 0 partout comme me
l'avait suggéré quelqu'un de Microsoft? Même en mettant 200 pour les marges
j'arrive seulement à 2.5 cm, là c'est tout à fait illogique parce que je
m'attendais à 5 cm...

J'ai modifié le code de réglage des marges de mon document avec cette ligne:

PrinterDocument1.PrinterSettings.DefaultPageSettings.Margins = New
Printing.Margins(0,0,0,0) sans avoir plus de chance, donc je perds mon temps
avec l'option OriginAtMargins = True et le code que j'ai mis...

Merci!

Anne


"Richard Clark" <rc at c2i.fr> a écrit dans le message de news:
%
Les margin donnés par .NET sont une approximation (ouai, super ;-))), ils
ne prennent pas compte de la différence qu'il peut y avoir entre les
marges gauche et droite par exemple) mais qui suffisent dans 90% des cas
(on n'est pas à 3mm près pour imprimer une facture ou un état comptable).
Maintenant pour avoir des données précises, tu es effectivement obligé de
passer par les API Win32.

--
Richard Clark - MVP .NET
http://www.c2i.fr
http://www.project-hoshimi.com


"Anne DeBlois" wrote in message
news::

Bonjour,

Je sais qu'en raison des différences de marges physiques et de résolution
(dpi) d'une imprimante à l'autre, je cherche à faire en sorte que mon
imprimé ait une position absolue par rapplrt à la marge de gauche et à la
marge inférieure quel que soit le périphérique vers lequel j'envoie mon
PrintDocument.

Le code qui suit m'a l'air OK pour obtenir les marges physiques de
l'imprimante:

---Début---
Dim marge_physique_gauche As Single
Dim marge_physique_haute As Single
Dim dpiX As Integer
Dim dpiY As Integer

'API de lecture des capacités de l'imprimante
Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As
IntPtr, ByVal capIndex As Int32) As Int32

Private Const LOGPIXELSX As Integer = 88
Private Const LOGPIXELSY As Integer = 90
Private Const PHYSICALOFFSETX As Integer = 112
Private Const PHYSICALOFFSETY As Integer = 113

'on récupere les marges physiques de l'imprimante
Dim hdc As IntPtr = e.Graphics.GetHdc
dpiX = GetDeviceCaps(hdc, LOGPIXELSX) 'résolution
horizontale
dpiY = GetDeviceCaps(hdc, LOGPIXELSY) 'résolution verticale
marge_physique_gauche = (GetDeviceCaps(hdc, PHYSICALOFFSETX)) /
dpiX
* 100
marge_physique_haute = (GetDeviceCaps(hdc, PHYSICALOFFSETY)) /
dpiY
* 100
e.Graphics.ReleaseHdc(hdc)

--------Fin----------------------

Cependant, pour m'assurer que la position d'un rectangle hypothétique que
je
veux placer dans le coin supérieur gauche de ma page soit exactement au
même
endroit peu importe l'imprimante et sa résolution...

e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(??,??,<la
largeur>,<la
hauteur>)

...je cherchais d'abord un algo permettant de calculer un point X,Y de
départ qui ne «bougera» pas selon que je l'imprime sur un périphérique
gérant une résolution de 1200x1200 dpi ou sur une imprimante à jet
d'encre à
360x260 dpi. Quelqu'un a-t-il une idée?

Entretemps, je me suis rappelé qu'il est possible de définir des marges
fixes avec l'option **OriginAtMargins = True** dans les propriétés de mon
PrintDocument.
J'ai donc essayé ceci (en mettant en commentaires les lignes pour
l'obtention des marges physiques):

---Début----
Try

Dim marges As New Printing.Margins(100, 100, 100, 100)
PrintDocument1.DefaultPageSettings.Margins = marges
' Crée une zone d'impression avec les marges définies ci-haut

Dim rectangle As New Rectangle(0, 0, 400, 80)
e.Graphics.FillRectangle(Brushes.Cyan, rectangle)
e.Graphics.DrawRectangle(Pens.Cyan, rectangle)

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
----Fin-----

Ce code fonctionne parfaitement, et à 1/32 près, j'obtiens une marge
uniforme quelle que soit l'imprimante que j'utilise. Cependant, en
changeant
la ligne Dim marges As New Printing.Margins(100, 100, 100, 100) pour Dim
marges As New Printing.Margins(0, 0, 0, 0) (c'est-à-dire des zéros
partout),
bizarrement mon rectangle s'imprime dans une marge de 2,5 cm de hauteur
et
2,5 cm de hauteur, et ce peu importe l'imprimante que j'ai utilisée.

Normalement, je devrais avoir mon rectangle très près du coin supérieur
gauche de ma page, je n'arrive pas à trouver pourquoi. Faut-il
réinitialiser
les DefaultSettings?

Merci pour votre aide. J'espère avoir été assez précise.

ANNE DEBLOIS