Resolution d'impression

cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 - 17 mai 2004 à 18:45
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 - 18 mai 2004 à 22:19
encore un pb d'imression lol
mais il est serienx celui-là ;-(

j'étais en train de faire une joulie boîte pour configurer l' impression d'un JPanel : taille, centrage, apercu etc...
500 lignes plus tard, ca marche... presque

pour situer le problème :
en java, la resolution d'une image semble être obligatoirement 72 pixels par pouce

on peut contourner ce problème lors de l'impression en utilisant la méthode scale(double, double) de Graphics2D

ca donne un truc dans le genre pour la méthode print

public int print(Graphics pg, PageFormat pageFormat, int pageIndex) throws PrinterException {
BufferedImage image = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);

this.paintComponent(image.getGraphics());

if (pageIndex >=1)
return NO_SUCH_PAGE;

Graphics2D pg2 = (Graphics2D) pg;
pg2.translate((int) ((pageFormat.getImageableX() + impressionDecalageGauche)), (int) ((pageFormat.getImageableY() + impressionDecalageHaut)));

//les dimensions sont * par impressionEchelle
pg2.scale(impressionEchelle, impressionEchelle);

pg2.drawImage(image, 0, 0, this.getWidth() , this.getHeight(), this);
image = null;
System.gc();

return PAGE_EXISTS;
}

le problème, c'est que la taille de l'impression dépend de la résolution de l'imprimante (si elle est aussi en 72 px/pouce, c'est OK, mais sinon...)
(mon but, c'est de pouvoir choisir la taille de l'image quelque soit la résolution de l'imprimante)

donc la question (enfin ;-p)
Comment connaître la résolution de l'imprimante

on pourrait alors modifier les paramètres de scale pour ajuster la taille de l'image à la résolution de l'imprimante

ou sinon, comment forcer la résolution?

sans doute un rapport avec javax.print.attribute.standard.PrinterResolution
??

[si j'ai pas de réponse, j'ai plus qu'à remplacer la boîte d'impression par un enregistrement en BMP ;-p
ce serait pas très classe quand même...]

A+
DOBELIOU

3 réponses

cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
17 mai 2004 à 20:31
yop

ya bien une solution en utilisant le vieux PrintJob au lieu de PrinterJob, c'est à dire en laissant tomber toute l'API java.awt.print

ca donne un truc comme

int res = 360;
try {
PageAttributes pa = new PageAttributes();
pa.setPrinterResolution(res);
pa.setPrintQuality(pa.PrintQualityType.HIGH);
pa.setColor(pa.ColorType.COLOR);
if (portrait.isSelected())
pa.setOrientationRequested(pa.OrientationRequestedType.PORTRAIT);
else
pa.setOrientationRequested(pa.OrientationRequestedType.LANDSCAPE);
JobAttributes ja = new JobAttributes();
ja.setCopies(((Integer) copies.getValue()).intValue());
PrintJob prnJob = Toolkit.getDefaultToolkit().getPrintJob((Frame) this.getParent(), "JGeom", ja, pa);
Graphics pg = prnJob.getGraphics();
System.out.println(prnJob.getPageDimension());
pg.translate((int) ((margeGauche + impressionDecalageGauche)*res/72), (int) ((margeHaut + impressionDecalageHaut)*res/72));
BufferedImage image = new BufferedImage(plan.getWidth(), plan.getHeight(), BufferedImage.TYPE_INT_RGB);
plan.paintComponent(image.getGraphics());
pg.drawImage(image, 0, 0, (int) (plan.getWidth()*rapport*res/72) , (int) (plan.getHeight()*rapport*res/72), this);
prnJob.end();
}
catch (NullPointerException npe) {}
System.gc();

on peut choisir sa résolution

mais je ne sais toujours pas comment obtenir les résolutions disponibles
et ca fait un peu préhistoire comme méthode ;-p

A+

DOBELIOU
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
17 mai 2004 à 20:37
dans le code précédant :

- plan est le JPanel à imprimer
- rapport est un changement d'echelle indépendant
- le code est lancé depuis un JDialog d'où le
((Frame) this.getParent()
- margeHaut, impressionDecalageHaut, margeGauche, impressionDecalageGauche sont des marges indépendantes en pixels
- portrait est un JRadioButton
- copies est un JSpinner

voilou

ce code fonctionne très bien mais si qq'un sait comment régler la résolution d'impression en utilisant PrinterJob, ce serait cool
;-p

DOBELIOU
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
18 mai 2004 à 22:19
yep

vu la foule de réponse :big)
j'ai du mettre le doigt sur une faille du Java peut-être?

bon, je laisse tomber l'API java.awt.print
vive PrintJob dans java.awt tout court!!!

j'efface mon code, et je recommence
hop

A+
DOBELIOU

(jespère toujours une solution avec PrinterJob, on sait jamais :big) )
0
Rejoignez-nous