6

Estoy creando una aplicación la cual manda imprimir objetos Graphics a una impresora determinada, lo que necesito es poder cambiar la configuración del tamaño de papel mediante código en java.

Este es mi código con el cual imprimo y pongo atributos de impresión, como por ejemplo el numero de copias, el color del papel, orientación, etc, eso si lo hace correctamente.

PrinterJob job = PrinterJob.getPrinterJob();
PageFormat pf = new PageFormat();

int numero = Integer.parseInt(SNumero.getValue().toString());



PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(numero));
aset.add(new MediaPrintableArea(0, 0, 62, 29, MediaPrintableArea.MM));
aset.add(Chromaticity.COLOR);
aset.add(OrientationRequested.PORTRAIT);

Paper paper = new Paper();
paper.setSize(175.748031496, 82.204724409);
double margin = 8.503937008;
paper.setImageableArea(0, 0, 175.748031496, 82.204724409);

pf.setPaper(paper);

job.setPrintable(new ObjetoDeImpresion(),pf);
job.setJobName("nombre_de_impresion");

try {
  job.print(aset);
} catch (PrinterException ex) {
  System.out.println(ex);
}


}

He intentado agregar algo como esto para decirle a la impresora que imprima un tamaño de papel que yo quiera, pero no da resultado:

aset.add(new MediaSize(62, 29, MediaSize.MM));

Mi tamaño de papel es de 62mm de ancho y de largo el papel es continuo, osea que debería poder definirse un tamaño de largo.

¿Alguien tiene idea de como hacerlo?

Ruslan López
  • 10,060
  • 11
  • 35
  • 68
  • 1
    Creí que ya lo habías solucionado al realizar la pregunta [Problema con el tamaño del papel de una impresora](https://es.stackoverflow.com/questions/92929). – Davlio Aug 23 '17 at 23:34
  • No, si te fijas bien la pregunta es parecida, pero pregunto cosas totalmente diferentes. En la otra pregunta no me dejaba imprimir el tamaño de papel que yo le ponía en la configuración, ahora quiero que por medio de java pueda cambiar esas medidas. No se si me de a entender. – Giovani Preciado Ortiz Aug 23 '17 at 23:44
  • Comprenderte ahora ya. – Davlio Aug 23 '17 at 23:52
  • se debe poder revisa alguna de las opciones de aquí https://www.adictosaltrabajo.com/tutoriales/java-printing/. PageFormat Clase PageFormat define el tamaño de la página y la orientación. Esto también define Paper usar cuando se renderiza una página. – Jhon Henry Aug 24 '17 at 14:51
  • Ya intente usando el `Paper` pero no da resultado usando esta función. ¿No abra un funcion `PrintRequestAttributeSet` para asignar un tamaño de papel? – Giovani Preciado Ortiz Aug 24 '17 at 16:17

2 Answers2

1

¿Has probado con Paper de este modo?

  1. Crea un Paper con tus medidas usando los métodos setSize y setImageableArea, por ejemplo.
  2. Crea un PageFormat y le asignas el paper que has creado previamente con el método setPaper.
  3. Añade a tu aset el PageFormat que has creado.

aset.add(myPageFormat);

Espero que te sirva.

EDITO: Viendo que esta solución no te ha servido. Indícame si has probado lo siguiente: El método setPrintable lo usas de este modo: job.setPrintable(new ObjetoDeImpresion());

Pero también podrías usarlo de este: setPrintable(Printable painter, PageFormat format) Esta podría ser una buena forma de pasarle tu PageFormat que puedes crear como te comentaba en mi primera respuesta.

Otra opción:

Sacada de aquí, tiene buena pinta.

Book book = new Book(); //java.awt.print.Book
book.append(this, pf);
job.setPageable(book);

en vez de:

job.setPrintable(new ObjetoDeImpresion(),pf);

DanielGS
  • 912
  • 5
  • 9
  • 1
    No yo también ya había intentado hacer algo como eso pero me marca error al ejecutar. No acepta el `PageFormat` como atributo. – Giovani Preciado Ortiz Aug 28 '17 at 14:33
  • He editado la pregunta con una nueva solución que creo que te puede servir. – DanielGS Aug 29 '17 at 14:10
  • Si también ya lo he intentado cambiar así y si funciona, si cambia las medidas, el problema que tengo es que las cambia a otra medida que yo no le digo, por eso quiero saber si no existe una forma de cambiar esas medidas con un `PrintRequestAttributeSet` – Giovani Preciado Ortiz Aug 29 '17 at 14:17
  • @GiovaniPreciadoOrtiz ¿Podrías editar tu pregunta poniendo el nuevo código donde has probado esta opción? – DanielGS Aug 29 '17 at 14:19
  • Listo ya quedo editada – Giovani Preciado Ortiz Aug 29 '17 at 15:00
  • ¿Que medidas te saca? dices que son distintas a las que tu le pones. Prueba a ir cambiando las medidas que le pones y ver si las medidas que te sacan van cambiando en función de las que le pasas o son siempre las mismas. – DanielGS Aug 29 '17 at 15:33
  • No resulta, ya intente demasiadas veces y no da resultado, por eso pregunto que si no hay forma de cambiar las medidas de otra manera que no sea con `Paper` – Giovani Preciado Ortiz Aug 29 '17 at 17:56
  • Acabo de editar la respuesta con una nueva solución. – DanielGS Aug 30 '17 at 07:03
0

Tal vez esto te pueda ayudar, para modificar los margenes de la hoja

public void actionPerformed(ActionEvent e)
{
 if (e.getSource() instanceof mxGraphComponent)
 {
  mxGraphComponent graphComponent = (mxGraphComponent) e
    .getSource();
  PrinterJob pj = PrinterJob.getPrinterJob();

  if (pj.printDialog())
  {
   PageFormat pf = graphComponent.getPageFormat();
   Paper paper = new Paper();
   double margin = 36;
   paper.setImageableArea(margin, margin, paper.getWidth()
     - margin * 2, paper.getHeight() - margin * 2);
   pf.setPaper(paper);
   pj.setPrintable(graphComponent, pf);

   try
   {
    pj.print();
   }
   catch (PrinterException e2)
   {
    System.out.println(e2);
   }
  }
 }
}
 
Tridam
  • 386
  • 1
  • 9
  • Aquí te dejo la documentación, es para poder manejar los bordes https://jgraph.github.io/mxgraph/java/docs/com/mxgraph/swing/mxGraphComponent.html – Tridam Aug 28 '17 at 23:47