Comment trouver la réelle zone imprimable? (PrintDocument)
Pourquoi, c'est de découvrir cette magie Rectangle si difficile?
Dans le OnPrintPage événement, j'ai PrintPageEventArgs et je suis en train de dessiner à l'aide de Graphiques dans les limites du maximum de la zone imprimable.
J'ai essayé d'utiliser PageBounds, PrintableArea, Graphiques.VisibleClipBounds, etc. Tous ne parviennent pas à obtenir régulièrement la zone de dessin, en particulier lors de la commutation du mode Paysage au mode Portrait. PrintableArea ne semblent jamais à changer lorsque vous passez du mode Paysage au mode Portrait.
J'ai aussi remarqué qu'il y a une différence dans la façon dont les Graphiques.VisibleClipBounds est définie en fonction de si je suis en train de faire un aperçu avant impression et l'impression. En avant-première, il montre toujours le Portrait largeur/hauteur, de sorte que je dois vérifier si c'est un aperçu et j'ai manuellement swap de la largeur ou de la hauteur, quand il s'agit d'un Paysage.
J'ai besoin d'un algorithme pour le calcul de la zone imprimable comme il se rapporte à l'actuel contexte Graphique, pas un arbitraire théorique de la zone d'impression qui n'est pas utilisée dans le dessin.
Ma préoccupation est de traiter avec le Graphique de la matrice de décalage. Jusqu'à présent j'ai remarqué graves incohérences entre la façon dont le contexte Graphique est pré-traduits à l'aide de la dur des marges en fonction de facteurs comme:
- Si OriginAtMargins est vrai ou faux (ne pas se comporter comme je le pense)
- Si je suis d'impression à une imprimante ou à l'aide de la PrintPreviewControl (je dois vérifier si c'est une impression de l'aperçu ou l'impression de la page pour gérer la traduction correctement)
- Si je suis avec mon imprimante à la maison ou mon imprimante au travail (à la fois se comporter différemment)
Est-il un moyen standard pour gérer cela? Dois-je tout simplement réinitialiser la matrice? Lorsque j'ai mis OriginAtMargins à true, le Graphisme est pré-traduit de 84,84, mais mes marges sont 100,100. Le dur marges sont 16,16. Ne devrait-elle pas être convertis en 100,100? Depuis 0,0 devrait être à la page limites, pas le dur marges.
Fondamentalement, ma méthode doit toujours travailler à obtenir le meilleur imprimable rectangle. J'ai juste besoin d'un uniforme, indépendamment du périphérique de faire en sorte que mon dessin d'origine (0, 0) est en haut à gauche de la page, dans l'ordre ci-dessus par le Rectangle pour être d'une quelconque utilité pour moi.
- L'utilisation de e.MarginBounds. Et ensemble PrintDocument.OriginAtMargins de Vrai.
- J'ai fait un projet simple pour tester que avec juste un défaut PrintDocument/PageSetupDialog/PrintDialog et j'ai mis le OriginAtMargins à true et que les marges de 0,0,0,0. Il semble amende d'impression dans un fichier PDF (CutePDFWriter), mais l'impression à une imprimante, elle ne l'est pas. Je dessine un rectangle avec un 3.0 f largeur de la plume et la page n'a même pas d'imprimer quoi que ce soit (la page sort blanche). Je suppose que cela signifie qu'il pense que il n'y a rien dans les limites de l'impression.
- Si vous voulez tirer dans le dur marges, alors vous feriez mieux de les utiliser. Il ne peut pas imprimer à 0, c'est à l'intérieur de la dur de la marge. Vous pourriez toujours rien sur le côté du chemin du papier est un peu hors de l'endroit où le pilote pense qu'il est, dépend.
Vous devez vous connecter pour publier un commentaire.
Votre question manque un peu de clarté sur ce qu'est le "meilleur" est rectangle. Je vais supposer que vous entendez le plus grand rectangle qui sera 100% visible lors de l'impression.
Permet donc commencer par s'assurer que nous comprenons ce que le document à imprimer les graphiques de l'objet "origines", et comment la OriginAtMargins propriété affecte cette origine.
Donc, avec
OriginAtMargins
ensemble defalse
(par défaut) de l'objet graphics sera ajusté à la PrintableArea rectangle (environ 5/32 à partir de chaque bord de la page pour mon imprimante laser, de vieilles imprimantes laser peut être plus, de nouvelles imprimantes jet d'encre peut imprimer jusqu'au bord, logiciel de PDF aux imprimeurs d'imprimer jusqu'au bord). Afin de 0,0 à mon objet graphique est en fait 16,16 sur la physique de la page de mon imprimante laser (votre imprimante peut être différent).Avec la valeur par défaut de 1 pouce de marges de page et
OriginAtMargins
ensemble detrue
, l'objet graphique sera ajusté à la 100,100,650,1100 rectangle normal d'un portrait de page lettre. C'est un pouce à l'intérieur de chaque page physique de pointe. Afin de 0,0 à votre objet graphique est en fait 100,100 sur la page physique.Les marges sont également connus comme "doux marges" qu'ils sont définis dans le logiciel et n'est pas affectée par la physique du périphérique d'impression. Cela signifie qu'ils seront à la taille de la page dans le logiciel et de refléter la réelle dimension de la page (portrait ou paysage).
PrintableArea est également connu comme "dur marges", qui reflètent les limites physiques de votre périphérique d'impression. Cela peut varier d'une imprimante à une, à partir d'un fabricant à l'autre. Parce que ce sont des matériels de mesures, elles ne tourne pas lorsque vous définissez la page en mode paysage/portrait. Les limites physiques ne changent pas sur l'imprimante indépendamment de logiciel les paramètres d'impression, de sorte que nous devons nous assurer de les appliquer sur l'axe en fonction des paramètres du logiciel pour l'impression de document (orientation).
Ainsi, en suivant le modèle rugueux de l'exemple de code que vous avez posté, voici un PrintDocument.PrintPage gestionnaire d'événement qui va dessiner un rectangle aussi grande que possible, tout en étant toujours visible (avec la valeur par défaut
PrintDocument.OriginsAtMargins
êtrefalse
). Si vous définissezPrintDocument.OriginsAtMargins
àtrue
il dessine un rectangle aussi grande que possible, tout en étant toujours visible à l'intérieur de la configuration du soft marges (1 par défaut" à partir des bords de la page).Les deux lignes qui déterminent la largeur et la hauteur disponible sont, je pense, ce que vous cherchez dans votre question. Ces deux lignes à prendre en compte si vous voulez soft marges dur ou de marges et de savoir si le document à imprimer est configuré en mode paysage ou portrait.
J'ai utilisé
Math.Floor()
pour le chemin le plus facile de tout laisser tomber, tout le passé de la virgule (ex: 817.96 -> 817) juste pour s'assurer que la largeur et la hauteur était juste à l'intérieur des dimensions disponibles. Je suis "à défaut sûr" ici, si vous vouliez vous pourriez maintenir le flotteur en fonction des coordonnées (au lieu de int), il suffit de faire attention à regarder les erreurs d'arrondi qui entraînera l'coupées graphique (si elle arrondit 817.96 jusqu'à 818 et ensuite le pilote d'imprimante décide qui n'est plus visible).J'ai testé cette procédure à la fois portrait et paysage à la fois dur marges et doux marges sur un Dell 3115CN, un Samsung SCX-4x28 et CutePDF logiciel de l'imprimante. Si cela ne devait pas répondre adéquatement à votre question, pensez à réviser votre question à clarifier "la magie rectangle" et "rectangle".
EDIT: Notes à Propos de "Soft Marges"
Doux marges sont appliquées dans le logiciel et ne pas prendre en considération les limites matérielles de l'imprimante. C'est intentionnel, et de par leur conception. Vous pouvez définir le doux marges en dehors de la zone imprimable si vous le souhaitez et la sortie peuvent être coupées par votre pilote d'imprimante. Si cela n'est pas souhaitable pour votre application, vous devez ajuster les marges dans le code de votre programme. Vous pouvez empêcher l'utilisateur de sélectionner les marges en dehors de la zone imprimable (ou avertir si ils le font) ou vous pouvez appliquer quelques min/max des conditions dans votre code quand vous commencez à l'impression (dessin) du document.
Exemple de Cas: Si vous définissez les marges de la page de 0,0,0,0 dans Microsoft Word 2007, une boîte de dialogue d'avertissement s'affiche indiquant "Une ou plusieurs marges sont définies en dehors de la zone imprimable de la page. Cliquez sur le bouton Correction pour augmenter les marges appropriées." Si vous cliquez sur réparer, Word, copiez simplement le dur marges dans le soft de marges, de sorte que la boîte de dialogue affiche maintenant 0.16" pour toutes les marges (mon imprimante laser capacités).
C'est le comportement attendu. Il n'est pas un bug/problème avec Microsoft Word si la page imprimée est coupé parce que l'utilisateur a choisi d'ignorer cet avertissement et utilisé 0,0,0,0 les marges de la page. C'est la même chose dans votre application. Vous devez appliquer les limites de ce que si approprié dans votre cas d'utilisation. Soit avec un boîte de dialogue d'avertissement, ou vous pouvez forcer la limite de plus en plus fortement dans le code (ne pas offrir un choix à l'utilisateur).
Stratégie Alternative
Bien, alors peut-être que vous ne voulez pas de simplement faire le dur marges, mais plutôt trouver le soft marges et puis appliquer que le soft marges restent à l'intérieur de la zone d'impression lors de l'impression. Nous allons développer une autre stratégie ici.
Dans cet exemple, je vais utiliser les origines sur les bords, et de permettre à l'utilisateur de sélectionner la marge qu'ils veulent, mais je vais les appliquer dans le code que la sélection de la marge ne pas être en dehors de la zone imprimable. Si les marges sont en dehors de la zone imprimable, je suis tout simplement aller pour les ajuster à l'intérieur de la zone imprimable.
Actuellement la suivante est de travailler sur mon imprimante. J'ai OriginAtMargins définie sur false. Cela provoque de traduction automatique à l'HardMarginX et HardMarginY quand je suis d'impression de mon imprimante, mais PAS de traduction quand je suis à l'impression à la PrintPreviewControl. Donc, je dois vérifier pour ce cas.
Si quelqu'un peut tester ce code sur leur imprimante pour vérifier qu'il fonctionne universellement, ou les corriger si je me trompe, ce serait génial.
Je ne sais pas si la pré-traduction de l'origine de la dur marges lorsque OriginAtMargins est fausse est en standard avec toutes les imprimantes, ou si c'est juste le faire sur mon imprimante.
Je pense que ce que vous avez besoin est tout simplement redessiner l'image pour l'adapter quel que soit le format de papier utilisé. Voici mon code:
C#
. Même siVB
etC#
sont tout à fait semblables, ne fournissent qu'C#
code s'il vous plaît.