Autor Tema: Imprimir JEditorPane modo horizontal y hoja media carta Java (formato impresión)  (Leído 13985 veces)

cardiobeta

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Hola a todos. Tengo un JEditorPane el cual se llena con un codigo html. El asunto es que quiero imprimirlo pero en una hoja media carta y horizontalmente, y no he podido. Gracias de antemano.
« Última modificación: 20 de Octubre 2014, 12:04 por Alex Rodríguez »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Imprimir JEditorPane en modo horizontal y en hoja media carta.
« Respuesta #1 en: 05 de Mayo 2013, 00:33 »
¿Podrías poner el código y explicar mejor dónde falla?
Responsable de departamento de producción aprenderaprogramar.com

cardiobeta

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:Imprimir JEditorPane en modo horizontal y en hoja media carta.
« Respuesta #2 en: 06 de Mayo 2013, 20:10 »
El codigo parcial es este:

Código: [Seleccionar]
JScrollPane scroll = new JScrollPane(editor);
 editor.setContentType("text/html");
            scroll.setBounds(10, 20, 360, 470);
            boton1.setBounds(10, 500, 180, 40);
            boton1.setText("Imprimir");
           v.getContentPane().add(scroll);
            v.getContentPane().add(boton1);
            boton1.addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {                     
                     try {
                        editor.print();
                    } catch (PrinterException ex) {
                        Logger.getLogger(Tratamiento.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }           
        });

   Este editor se lo anexo a un scroll y este a su vez a un jForm llamado v. Este jForm es llamado al hacer click en un jButton. Todo funciona bien excepto que no puedo lograr la impresion deseada.
 ¿De que manera puedo imprimir automaticcamete el editor en forma horizontal y en la mitad de una hoja tamaño carta?. Gracias de antemano
« Última modificación: 20 de Octubre 2014, 12:04 por Alex Rodríguez »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Imprimir JEditorPane en modo horizontal y en hoja media carta.
« Respuesta #3 en: 08 de Mayo 2013, 08:07 »
Usando la clase PrinterJob del api de Java puedes configurar el tamaño de papel, orientación, etc. o también puedes hacer que se muestre un cuadro de diálogo para que el usuario elija las opciones de configuración.

http://docs.oracle.com/javase/6/docs/api/java/awt/print/PrinterJob.html

Responsable de departamento de producción aprenderaprogramar.com

cardiobeta

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:Imprimir JEditorPane en modo horizontal y en hoja media carta.
« Respuesta #4 en: 08 de Mayo 2013, 22:07 »
Okey. Cambié un poco el codigo he hice esto:

Código: [Seleccionar]
JFrame v = new JFrame("Recipe");
           
           
            v.setLayout(null);
            v.setBounds(300, 100, 400, 600);
           v.setMinimumSize(new Dimension(400, 600));
            JButton boton1 = new JButton();           
            v.setUndecorated(false);
           
            JScrollPane scroll = new JScrollPane(editor);
            scroll.setBounds(10, 20, 360, 470);
            boton1.setBounds(10, 500, 180, 40);
            boton1.setText("Imprimir");
           v.getContentPane().add(scroll);
            v.getContentPane().add(boton1);
            boton1.addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {                     
                    imprimir();
                }           
        });
            v.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
           
            // Marcamos el editor para que use HTML
            editor.setContentType("text/html");

Ahora se crea una clase cuyo codigo es el siguiente:
public void imprimir(){
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable( new imprimir());
    try
     {
       job.print();
      }
     catch (PrinterException e)
     {
     }
     }
private static class imprimir implements Printable {

protected int currentPage = -1;           

  protected JEditorPane editor;           

  protected double pageEndY = 0;               

  protected double pageStartY = 0;             

  protected boolean scaleWidthToFit = true;     



  protected PageFormat pFormat;
  protected PrinterJob pJob;
  public imprimir() {
    pFormat = new PageFormat();
    pJob = PrinterJob.getPrinterJob();
  }


  public Document getDocument() {
    if (editor != null) return editor.getDocument();
    else return null;
  }


  public boolean getScaleWidthToFit() {
    return scaleWidthToFit;
  }


  public void pageDialog() {
    pFormat = pJob.pageDialog(pFormat);
  }


        @Override
  public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
    double scale = 1.0;
    Graphics2D graphics2D;
    View rootView;
//  I
    graphics2D = (Graphics2D) graphics;
//  II
    editor.setSize((int) pageFormat.getImageableWidth(),Integer.MAX_VALUE);
    editor.validate();
//  III
    rootView = editor.getUI().getRootView(editor);
//  IV
    if ((scaleWidthToFit) && (editor.getMinimumSize().getWidth() >
    pageFormat.getImageableWidth())) {
      scale = pageFormat.getImageableWidth()/
      editor.getMinimumSize().getWidth();
      graphics2D.scale(scale,scale);
    }
//  V
    graphics2D.setClip((int) (pageFormat.getImageableX()/scale),
    (int) (pageFormat.getImageableY()/scale),
    (int) (pageFormat.getImageableWidth()/scale),
    (int) (pageFormat.getImageableHeight()/scale));
//  VI
    if (pageIndex > currentPage) {
      currentPage = pageIndex;
      pageStartY += pageEndY;
      pageEndY = graphics2D.getClipBounds().getHeight();
    }
//  VII
    graphics2D.translate(graphics2D.getClipBounds().getX(),
    graphics2D.getClipBounds().getY());
//  VIII
    Rectangle allocation = new Rectangle(0,
    (int) -pageStartY,
    (int) (editor.getMinimumSize().getWidth()),
    (int) (editor.getPreferredSize().getHeight()));
//  X
    if (printView(graphics2D,allocation,rootView)) {
      return Printable.PAGE_EXISTS;
    }
    else {
      pageStartY = 0;
      pageEndY = 0;
      currentPage = -1;
      return Printable.NO_SUCH_PAGE;
    }
  }


  public void print(HTMLDocument htmlDocument) {
    setDocument(htmlDocument);
    printDialog();
  }


  public void print(JEditorPane jedPane) {
    setDocument(jedPane);
    printDialog();
  }


  public void print(PlainDocument plainDocument) {
    setDocument(plainDocument);
    printDialog();
  }


  protected void printDialog() {
    if (pJob.printDialog()) {
      pJob.setPrintable(this,pFormat);
      try {
        pJob.print();
      }
      catch (PrinterException printerException) {
        pageStartY = 0;
        pageEndY = 0;
        currentPage = -1;
        System.out.println("Error Printing Document");
      }
    }
  }


  protected boolean printView(Graphics2D graphics2D, Shape allocation,
  View view) {
    boolean pageExists = false;
    Rectangle clipRectangle = graphics2D.getClipBounds();
    Shape childAllocation;
    View childView;

    if (view.getViewCount() > 0 &&
          !view.getElement().getName().equalsIgnoreCase("td")) {
      for (int i = 0; i < view.getViewCount(); i++) {
        childAllocation = view.getChildAllocation(i,allocation);
        if (childAllocation != null) {
          childView = view.getView(i);
          if (printView(graphics2D,childAllocation,childView)) {
            pageExists = true;
          }
        }
      }
    } else {
//  I
      if (allocation.getBounds().getMaxY() >= clipRectangle.getY()) {
        pageExists = true;
//  II
        if ((allocation.getBounds().getHeight() > clipRectangle.getHeight()) &&
        (allocation.intersects(clipRectangle))) {
          view.paint(graphics2D,allocation);
        } else {
//  III
          if (allocation.getBounds().getY() >= clipRectangle.getY()) {
            if (allocation.getBounds().getMaxY() <= clipRectangle.getMaxY()) {
              view.paint(graphics2D,allocation);
            } else {
//  IV
              if (allocation.getBounds().getY() < pageEndY) {
                pageEndY = allocation.getBounds().getY();
              }
            }
          }
        }
      }
    }
    return pageExists;
  }

/*  Method to set the content type the JEditorPane.
*/
  protected void setContentType(String type) {
    editor.setContentType(type);
  }


  public void setDocument(HTMLDocument htmlDocument) {
    editor = new JEditorPane();
    setDocument("text/html",htmlDocument);
  }


  public void setDocument(JEditorPane jedPane) {
    editor = new JEditorPane();
    setDocument(jedPane.getContentType(),jedPane.getDocument());
  }


  public void setDocument(PlainDocument plainDocument) {
    editor = new JEditorPane();
    setDocument("text/plain",plainDocument);
  }


  protected void setDocument(String type, Document document) {
    setContentType(type);
    editor.setDocument(document);
  }


  public void setScaleWidthToFit(boolean scaleWidth) {
    scaleWidthToFit = scaleWidth;
  }
    }



Pero aun asi no imprime. Esta clase no la manejo bien y no se que parte tengo  que modificar para obtener el tamaño de pagina deseado y la orientacion que quiero.
« Última modificación: 20 de Octubre 2014, 12:05 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Imprimir JEditorPane en modo horizontal y en hoja media carta.
« Respuesta #5 en: 11 de Mayo 2013, 13:55 »
Pienso que cuando creas el objeto Document en que te basas para imprimir tienes que especificarle los datos relativos a la impresión usando este constructor:

Document(Rectangle pageSize, float marginLeft, float marginRight, float marginTop, float marginBottom)  por ejemplo Document document = new Document(PageSize.A4, 50, 50, 50, 50); sería para imprimir sobre un DINA4

Aquí le estás especificando el tamaño de página y los márgenes.

Para elegir el tamaño de página puedes elegir el que te interese, hay un montón de formatos que puedes ver aquí:  http://api.itextpdf.com/itext/com/itextpdf/text/PageSize.html


cardiobeta

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:Imprimir JEditorPane en modo horizontal y en hoja media carta.
« Respuesta #6 en: 14 de Mayo 2013, 22:25 »
Hola Alex. Gracias por tu respuesta. Pero especificamente en que parte del codigo que muestro inserto lo que dices: document = new Document(PageSize.A4, 50, 50, 50, 50);. Saludos.
     

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Imprimir JEditorPane en modo horizontal y en hoja media carta.
« Respuesta #7 en: 28 de Mayo 2013, 10:17 »
He estado revisando cómo podría hacerse y hasta donde he llegado es al código que te pongo aquí abajo;

Para hacerlo imprimible la clase donde está el JEditorPane la he hecho que implemente la interface Printable.

Para crear el trabajo de impresión he usado la clase PrinterJob que parece lo más sencillo para que se encargue de todo. Luego he establecido la orientación y el tamaño de página con PageFormat y finalmente le digo a PrinterJob que use el PageFormat que he creado para imprimir. Lo que se imprime es el objeto (que incluye el JFrame, el JEditorPane y el JButton) ya que es lo que implementa la interface Printable, pero creo que se podría imprimir solo el JEditor si se independiza en una clase que implemente Printable.

Código: [Seleccionar]
import java.awt.*;
import java.awt.print.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * Ejemplo de JEditorPane con HTML
 *
 */
public class EjemploJEditorPaneHtml implements ActionListener, Printable
{

    JButton boton1;
    JFrame v;
    JEditorPane editor;
    /**
     * Crea un nuevo objeto EjemploJEditorPaneHtml.
     */
    public EjemploJEditorPaneHtml()     {

        try         {
            // Preparamos la ventana de ejemplo
            v = new JFrame("JEditorPane con HTML");

            boton1=new JButton("Imprimir");
            boton1.setBounds(300,250,100,30);
            v.add(boton1);
            boton1.addActionListener(this);

            editor = new JEditorPane();
            JScrollPane scroll = new JScrollPane(editor);
            v.getContentPane().add(scroll);
            v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

            // Marcamos el editor para que use HTML
            editor.setContentType("text/html");

            // Insertamos un texto
            editor.setText(
                "<head><base href=\"file:d:/\"></head>"+
                "<b>hola</b><br>" + "<i>adios</i><br>" +
                "<font face=\"arial\">fuente arial</font><br>" +
                "<font face=\"courier\">fuente courier</font><br>" +
                "<font size=\"24\">fuente grande</font><br>" +
                "<font color=\"red\">color rojo</font><br>" +
                "<img src=\"amanecer.gif\"></img>");

            // Se visualiza la ventana
            v.pack();
            v.setVisible(true);
        }
        catch (Exception e) {e.printStackTrace();        }
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==boton1) {
            System.out.println("Has pulsado el boton imprimir");
            PrinterJob job = PrinterJob.getPrinterJob();
            PageFormat formaPagina = new PageFormat();
            formaPagina.setOrientation( PageFormat.PORTRAIT); //Establecemos la orientación de la página
            Paper papel = new Paper();
            papel.setSize(8.3*72, 11.7*72); //Tamaños en 1/72 de inch, aquí hemos puesto el A4
            formaPagina.setPaper (papel); //Establecemos el tamaño del papel para el trabajo
            job.setPrintable(this, formaPagina);
            try { job.print(); }
            catch (PrinterException ex) { ex.printStackTrace(); }
        }
    }

    public int print(Graphics g, PageFormat pf, int page) throws PrinterException {

        if (page > 0) { return NO_SUCH_PAGE; }
        Graphics2D g2d = (Graphics2D)g;
        g2d.translate(pf.getImageableX(), pf.getImageableY());
        // Print the entire visible contents of a java.awt.Frame.
        v.printAll(g);
        return PAGE_EXISTS;
    }

    /**
     * main de prueba
     */
    public static void main(String[] args) {
        new EjemploJEditorPaneHtml();
    }
}

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".