IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Lost in translation


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Par défaut Lost in translation
    Salut à tous.

    Je me casse les dents sur l'api d'impression, et donc, le dessin 2D.

    J'essaye d'imprimer sur une imprimante à rouleau, avec du papier de 80mm de large.

    Quoique je fasse, mon texte est centré et affiché sur une largeur ridicule d'environ 2cm de large. Avec de chaque coté une belle marge blanche de 25mm...

    Je n'arrive pas à trouver une méthode simple pour parmetrer ces marges.

    J'ai envi de casser mon ordi ;-)

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    public Print2DPrinterJob()
    {
    PrinterJob pj = PrinterJob.getPrinterJob();       
    pj.setPrintable(this);
     
    PrintService[] services = PrinterJob.lookupPrintServices();
     
    PageFormat pf= pj.defaultPage();
    Paper paper = pf.getPaper();
     
    paper.setSize( 225, 850);
    paper.setImageableArea(5, 5, 220, 812);
     
    PrintRequestAttributeSet format = new HashPrintRequestAttributeSet();
     
    format.add( new Copies(1) );
    format.add( new JobName("My job", null ) );
     
    if ( services.length > 0)
    {
    	System.out.println("------------------- selected printer : ------------------");
            System.out.println("selected printer " + services[0].getName() );
     
    	try {
    	        pj.setPrintService( services[0] );
    		pj.print();
    	}
    	catch (PrinterException pe) { 
    		System.err.println(pe);
    	}
    }
     
     
    public int print( Graphics g, PageFormat pf,int pageIndex)
    {
    	if (pageIndex == 0)
    	{
    		double pageX = pf.getImageableX();
    		double pageY = pf.getImageableY();
     
    		Graphics2D g2d = ( Graphics2D ) g;
    		g2d.translate( pageX, pageY ); 
     
    		g2d.setFont( new Font("Serif", Font.PLAIN,12 ) );
    		g2d.setColor(Color.black);
     
    		g2d.drawString("La sottise, l'erreur, le péche, la lésine,\n",0, 0);
    		g2d.drawString("Occupent nos esprits et travaillent nos corps,\n",0, 10);
    		g2d.drawString("Et nous alimentons nos aimables remords,\n",0, 20);
    		g2d.drawString("Comme les mendiants nourrissent leur vermine.\n",0, 30);
     
     
    		return Printable.PAGE_EXISTS;					
    	}
    	else
    	{
    		return Printable.NO_SUCH_PAGE;
    	}
    }
    Si qq1 a une idée, je prends. J'en ai un peu marre ...

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Sinon tu peux créer un bon vieux PDF qui est le format parfait pour l'impression puis déléguer l'impression à Adobe Reader via un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Desktop.print(Filee f);
    Pour la création de PDF, Itext fera parfaitement l'affaire.

  3. #3
    Membre confirmé Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Par défaut
    C'est gentil à toi, mais la seule technique qui semble fonctionner, c'est via l'api de dessin appliqué au print. De plus lorsque tu fait ça, Acrobat s'ouvre, ce qui n'est pas possible ici.

    Non, je cherche un coup de main sur la définition des marges.

    Qq1 peut il me parler de ça, que je trouve bien mystérieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MediaSizeName media = (MediaSizeName) format.get( Media.class );
     
    MediaSize ms = MediaSize.getMediaSizeForName(media);
     
    MediaPrintableArea mediaarea = (MediaPrintableArea) format.get(MediaPrintableArea.class );
     
    if( mediaarea != null )
    	pap.setImageableArea( (double)( mediaarea.getX( MediaPrintableArea.INCH )*72 ), (double)( mediaarea.getY( MediaPrintableArea.INCH )*72 ), (double)( mediaarea.getWidth( MediaPrintableArea.INCH )*72 ), (double)( mediaarea.getHeight( MediaPrintableArea.INCH )*72 ) );
     
    if( ms!=null )
    	pap.setSize( (double)(ms.getX( MediaSize.INCH )*72 ),( double )( ms.getY(MediaSize.INCH)*72) );
    Je ne trouve pas beaucoup de doc sur MediaPrintableArea.

    Quant à l'interface d'impression :

    public int print( Graphics g, PageFormat pf,int pageIndex)

    si on fait pf.getImageableX();

    D'où vient ce X ? Comment le réduire ?

    Qu'en est il de l'autre API : DocFlavor.STRING.SERVICE_FORMATTED.PRINTABLE;

    Je ne comprends pas bien la différence ...

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 905
    Billets dans le blog
    54
    Par défaut
    Je dirai que ces valeurs sont probablement fournies par le MediaPrintableArea sous-jacent utilise par le mecanisme des services d'impression lui-meme fourni par un Paper (java.awt.print.Paper) representant la taille d'une page sur l'imprimante choisie ?

    Apparement puisqu'on peut les construire soit-meme, ne peux-tu pas deriver un MediaPrintableArea a partir de celui par defaut en reduisant les marges ?

    Ou te restreindre a utiliser l'API AWT print plutot que le service d'impression et specifier ton propre Paper ?

    Note : je n'ai jamais essaye l'API d'impression de cette maniere donc l'a j'y vais au pifometre.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre confirmé Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Par défaut
    Ce code fonctionne à peu près :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    public class Print2DPrinterJob implements Printable
    {
     
    	final int POINTS_PER_INCH = 72;
     
    	private PrinterJob _printerJob;
     
    	private PrintService[] _printServices;
     
    	private PageFormat _pageFormat;
     
    	private Paper _paper;
     
    	private PrintRequestAttributeSet _printAttributeSet;
     
    	private TextLayout _txtLayout;
     
     
    	public static String textToPrint = new String();
     
     
    	public Print2DPrinterJob( String textToPrintParam )
    	{
    		if( textToPrintParam.equals("") )
    			Print2DPrinterJob.textToPrint = "Manipulating raw fonts would be too complicated to render paragraphs of "
    				+"text. Trying to write an algorithm to fully justify text using "      
    				+"proportional fonts is not trivial. Adding support for international "
    				+"characters adds to the complexity. That's why we will use the "        
    				+"TextLayout and the LineBreakMeasurer class to "
    				+"render text.";
    		else
    			Print2DPrinterJob.textToPrint = textToPrintParam;
     
    		_printerJob = PrinterJob.getPrinterJob();       
     
    		_printServices = PrinterJob.lookupPrintServices();
     
    		for( int k = 0 ; k < _printServices.length ; k++ )
    			System.out.println("Found printer : " + _printServices[k].getName() );
     
     
    		_printAttributeSet = new HashPrintRequestAttributeSet();
    		_printAttributeSet.add( new Copies(1) );
    		_printAttributeSet.add( new JobName("My job", null ) );
    		_printAttributeSet.add( OrientationRequested.PORTRAIT );
     
    		_pageFormat =_printerJob.defaultPage();
    		_paper=_pageFormat.getPaper();
     
    		_paper.setSize( 204, 13106);
    		_paper.setImageableArea(31, 31, 204, 12962);
     
    		_pageFormat.setPaper(_paper);
     
    		_printerJob.setPrintable(this, _pageFormat);
     
     
    		if ( _printServices.length > 0)
    		{
    			System.out.println("------------------- selected printer : ------------------");
    			System.out.println("selected printer " + _printServices[0].getName() );
     
    			try {
    				_printerJob.setPrintService( _printServices[0] );
     
    				_printerJob.print(_printAttributeSet);
     
    			}
    			catch (PrinterException pe) { 
    				System.err.println(pe);
    			}
     
    		}
    	}
     
     
     
    	@Override
    	public int print( Graphics graphik, PageFormat pageFormat, int pageIndex) throws PrinterException
    	{
    		if ( pageIndex == 0 )
    		{
    			double pageX = pageFormat.getImageableX();
    			double pageY = pageFormat.getImageableY();
    			double pageWidth = pageFormat.getWidth();
    			double pageHeight = pageFormat.getHeight();
     
    			Graphics2D g2d = ( Graphics2D ) graphik;
    			g2d.translate( pageX, pageY ); 
     
    			g2d.setFont( new Font("Serif", Font.PLAIN, 12 ) );
    			g2d.setColor(Color.black);
     
    			Point2D.Double pen = new Point2D.Double (0.5 * POINTS_PER_INCH, 0.5 * POINTS_PER_INCH);
     
    			double width = 2.2 * POINTS_PER_INCH;
     
    			AttributedString paragraphText = new AttributedString ( Print2DPrinterJob.textToPrint );
     
    			paragraphText.addAttribute ( TextAttribute.FONT, new Font ("serif", Font.PLAIN, 10) );
     
    			LineBreakMeasurer lineBreaker = new LineBreakMeasurer ( paragraphText.getIterator(),
    			                                                                 new FontRenderContext (null, true, true) );
     
    			while ( ( _txtLayout = lineBreaker.nextLayout( (float) width ) ) != null )
    			{
    				//--- Align the Y pen to the ascend of the font, remember that
    				//--- the ascend is origin (0, 0) of a font. Refer to Figure 1
    				pen.y += _txtLayout.getAscent ();
     
    				//--- Draw the line of text
    				_txtLayout.draw ( g2d, (float) pen.x, (float) pen.y );
     
    				//--- Move the pen to the next position adding the descent and
    				//--- the leading of the font
    				pen.y += _txtLayout.getDescent () + _txtLayout.getLeading ();
    			}
     
    			return Printable.PAGE_EXISTS;					
    		}
    		else
    		{
    			return Printable.NO_SUCH_PAGE;
    		}
    	}
    }
    Les marges semble ok, mais :

    1/ Il imprime 3x, alors qu'il me semble n'avoir définit que 1 impression

    2/ Le début du texte est remplacé par toute une série de meta-charactère bizarre, puis j'ai bien le texte "That's why we will use the TextLayout and the LineBreakMeasurer class to render text."

    Comment es-ce que ça peut fonctionner à moitié ?

    ???

  6. #6
    Membre confirmé Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Par défaut
    Ok, c'est bon, j'imprime

    C'était un pb lié à l'imprimante, le fait que la page de test commence par les mêmes meta char bizarres m'a mis la puce à l'oreille.

    Merci à vous pour vos suggestions, c'est TOUJOURS réconfortant d'obtenir un ptit mot d'un collègue.

    Voici donc le code qui imprime directement (sans dialog ) sur une TRP-100, avec un papier de 80mm de large :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    public class PrinterManager implements Printable
    {
     
    	final int POINTS_PER_INCH = 72;
     
    	private PrinterJob _printerJob;
     
    	private PrintService[] _printServices;
     
    	private PageFormat _pageFormat;
     
    	private Paper _paper;
     
    	private PrintRequestAttributeSet _printAttributeSet;
     
    	private TextLayout _txtLayout;
     
     
    	public static String textToPrint = new String();
     
     
    	public PrinterManager( String textToPrintParam )
    	{
    		if( textToPrintParam.equals("") )
    			PrinterManager.textToPrint = "Manipulating raw fonts would be too complicated to render paragraphs of "
    				+"text. Trying to write an algorithm to fully justify text using "      
    				+"proportional fonts is not trivial. Adding support for international "
    				+"characters adds to the complexity. That's why we will use the "        
    				+"TextLayout and the LineBreakMeasurer class to "
    				+"render text.";
    		else
    			PrinterManager.textToPrint = textToPrintParam;
     
    		_printerJob = PrinterJob.getPrinterJob();       
     
    		_printServices = PrinterJob.lookupPrintServices();
     
    		for( int k = 0 ; k < _printServices.length ; k++ )
    			System.out.println("Found printer : " + _printServices[k].getName() );
     
     
    		_printAttributeSet = new HashPrintRequestAttributeSet();
    		_printAttributeSet.add( new Copies(1) );
    		_printAttributeSet.add( new JobName("My job", null ) );
    		_printAttributeSet.add( OrientationRequested.PORTRAIT );
     
    		_pageFormat =_printerJob.defaultPage();
    		_paper=_pageFormat.getPaper();
     
    		_paper.setSize( 204, 13106);
    		_paper.setImageableArea( 35, 72, 134, 12962);
     
    		_pageFormat.setPaper(_paper);
     
    		_printerJob.setPrintable(this, _pageFormat);
     
     
    		if ( _printServices.length > 0)
    		{
    			System.out.println("------------------- selected printer : ------------------");
    			System.out.println("selected printer " + _printServices[0].getName() );
     
    			try {
    				_printerJob.setPrintService( _printServices[0] );
     
    				_printerJob.print(_printAttributeSet);
     
    			}
    			catch (PrinterException pe) { 
    				System.err.println(pe);
    			}
     
    		}
    	}
     
     
     
    	@Override
    	public int print( Graphics graphik, PageFormat pageFormat, int pageIndex) throws PrinterException
    	{
    		if ( pageIndex == 0 )
    		{
    			double pageX = pageFormat.getImageableX();
    			double pageY = pageFormat.getImageableY();
    			double pageWidth = pageFormat.getWidth();
    			double pageHeight = pageFormat.getHeight();
     
    			Graphics2D g2d = ( Graphics2D ) graphik;
     
    			g2d.translate( pageX, pageY ); 
     
    			g2d.setColor(Color.black);
     
    			Point2D.Double pen = new Point2D.Double (0, 0);
     
    			double width = pageWidth - 70;
     
    			AttributedString paragraphText = new AttributedString ( PrinterManager.textToPrint );
     
    			paragraphText.addAttribute ( TextAttribute.FONT, new Font ("serif", Font.PLAIN, 10) );
     
    			LineBreakMeasurer lineBreaker = new LineBreakMeasurer ( paragraphText.getIterator(),
    			                                                                 new FontRenderContext (null, true, true) );
     
    			while ( ( _txtLayout = lineBreaker.nextLayout( (float) width ) ) != null )
    			{
    				//--- Align the Y pen to the ascend of the font, remember that
    				//--- the ascend is origin (0, 0) of a font. Refer to Figure 1
    				pen.y += _txtLayout.getAscent ();
     
    				//--- Draw the line of text
    				_txtLayout.draw ( g2d, (float) pen.x, (float) pen.y );
     
    				//--- Move the pen to the next position adding the descent and
    				//--- the leading of the font
    				pen.y += _txtLayout.getDescent () + _txtLayout.getLeading ();
    			}
     
    			//Rectangle2D outline = new Rectangle2D.Double( pageX, pageY, pageWidth, 300);
    			//g2d.setPaint(Color.black);
    			//g2d.draw(outline);
     
     
    			return Printable.PAGE_EXISTS;					
    		}
    		else
    		{
    			return Printable.NO_SUCH_PAGE;
    		}
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL]DBX error : invalid translation
    Par billoum dans le forum C++Builder
    Réponses: 7
    Dernier message: 27/01/2006, 20h55
  2. translate ---> @ attribut
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/08/2005, 16h55
  3. Corba et translation d'adresse
    Par LyR dans le forum CORBA
    Réponses: 1
    Dernier message: 10/12/2004, 15h29
  4. Réponses: 9
    Dernier message: 14/09/2004, 20h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo