Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #28659

Re: Java printing Margins

From Knute Johnson <eternal@knutejohnson.com>
Newsgroups comp.lang.java.programmer
Subject Re: Java printing Margins
Date 2014-06-04 20:25 -0700
Organization A noiseless patient Spider
Message-ID <lmonvd$jj6$1@dont-email.me> (permalink)
References <a09po9pqijpqnrnohtd3etkb3b52qanood@4ax.com> <lmim07$9sa$1@dont-email.me> <bpuro9pjieki3r116m5lbdd0kbvg2qm8gg@4ax.com>

Show all headers | View raw


On 6/3/2014 11:04, Roedy Green wrote:
> On Mon, 02 Jun 2014 13:15:05 -0700, Knute Johnson
> <eternal@knutejohnson.com> wrote, quoted or indirectly quoted someone
> who said :
>
>> See PageFormat.setPaper(), Paper.setImageableArea() and Paper.setSize().
>
> That lets me handle setting margins a bit more elegantly, and tells me
> where the 1" margins came from, but it does not let me query now
> narrow the margins of any given printer can be.
>
> Another related question. When you print landscape, are you supposed
> to just pretend you are printing on an 11 x 8.5 paper, or are you
> supposed two print on an 8.5 x 11 paper and rotate the image yourself?
>

I think you should set the PageFormat to landscape.  Please see the 
following code that I wrote to print images.

//
//
//  ImagePrinter
//
//
//  Version     Date        Modification
// 
---------------------------------------------------------------------------
//  00.10       20 Jun 08   Incept
//  00.11       23 Jun 08   add image file path to frame
//  00.12       11 Jul 08   correct minor bug with page format
//  00.20       22 Aug 08   add file filter to filechooser
//  00.30       11 Dec 09   add code to persist page format
//  00.31       22 Feb 10   change Image menu name to View and move Load 
Image
//                           to File menu
//  00.32       01 Apr 10   remove the orientation parameter from the page
//                           format persistence
//  00.34       09 Mar 12   modify to put data file in user.home
//  00.40       03 Dec 13   center frame in screen
//
//

package com.knutejohnson.tools.imageprinter;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.print.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class ImagePrinter extends JFrame implements ActionListener, 
Printable {
     static final String VERSION = "00.40";
     static final String DATE = "3 Decemter 2013";
     static final String HOME = 
System.getProperties().getProperty("user.home");
     static final String DATA_FILE = ".imageprinter";

     private final File dataFile;
     private final JFileChooser fc;
     private final PrinterJob pj;

     // the following are thread constrained
     private PageFormat pf;
     private BufferedImage bi;
     private boolean centered;
     private boolean scaled;
     private String fileName = "";

     public ImagePrinter() {
         super("ImagePrinter");

         setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

         addWindowListener(new WindowAdapter() {
             public void windowClosed(WindowEvent we) {
                 saveData(pf);
             }
         });

         dataFile = new File(HOME,DATA_FILE);

         pj = PrinterJob.getPrinterJob();
         pf = pj.defaultPage();
         pj.setPrintable(this);
         fc = new JFileChooser("/");
         fc.addChoosableFileFilter(new ImageFileFilter());

         loadData(pf);

         JMenuBar mb = new JMenuBar();
         setJMenuBar(mb);

         JMenu file = new JMenu("File");
         JMenu view = new JMenu("View");
         JMenu help = new JMenu("Help");

         mb.add(file);
         mb.add(view);
         mb.add(help);

         JMenuItem pageFormat = new JMenuItem("Page Format");
         JMenuItem print = new JMenuItem("Print");
         JMenuItem quit = new JMenuItem("Quit");
         JMenuItem selectImage = new JMenuItem("Load Image");
         JCheckBoxMenuItem center = new JCheckBoxMenuItem("Center");
         JCheckBoxMenuItem scale = new JCheckBoxMenuItem("Scale To Fit");
         JMenuItem about = new JMenuItem("About");

         pageFormat.addActionListener(this);
         print.addActionListener(this);
         quit.addActionListener(this);
         selectImage.addActionListener(this);
         center.addActionListener(this);
         scale.addActionListener(this);
         about.addActionListener(this);

         file.add(selectImage);
         file.add(pageFormat);
         file.add(print);
         file.add(new JSeparator());
         file.add(quit);
         view.add(center);
         view.add(scale);
         help.add(about);

         add(new ImagePanel(),BorderLayout.CENTER);

         pack();
         setLocationRelativeTo(null);
         setVisible(true);
     }

     public void actionPerformed(ActionEvent ae) {
         String ac = ae.getActionCommand();
         if (ac.equals("Page Format")) {
             pf = pj.pageDialog(pf);
             repaint();
         } else if (ac.equals("Print")) {
             if (pj.printDialog())
                 try {
                     if (bi == null)
                         throw new PrinterException("No Image Loaded");
                     pj.print();
                 } catch (PrinterException pe) {
                     JOptionPane.showMessageDialog(ImagePrinter.this,pe,
                      "Printing Error",JOptionPane.ERROR_MESSAGE);
                 }
         } else if (ac.equals("Quit")) {
             dispose();
         } else if (ac.equals("Load Image")) {
             int opt = fc.showOpenDialog(ImagePrinter.this);
             if (opt == JFileChooser.APPROVE_OPTION) {
                 try {
                     File file = fc.getSelectedFile();
                     bi = ImageIO.read(file);
                     if (bi == null) {
                         JOptionPane.showMessageDialog(ImagePrinter.this,
                          "Selected File Is Not An Image File",
                          "Error Loading Image",JOptionPane.ERROR_MESSAGE);
                         fileName = "";
                     } else {
                         fileName = file.getPath();
                     }
                 } catch (IOException ioe) {
                     JOptionPane.showMessageDialog(ImagePrinter.this,
                      ioe,"Error Loading Image",
                      JOptionPane.ERROR_MESSAGE);
                 }
                 repaint();
             }
         } else if (ac.equals("Center")) {
             JCheckBoxMenuItem center = (JCheckBoxMenuItem)ae.getSource();
             centered = center.isSelected();
             repaint();
         } else if (ac.equals("Scale To Fit")) {
             JCheckBoxMenuItem scale = (JCheckBoxMenuItem)ae.getSource();
             scaled = scale.isSelected();
             repaint();
         } else if (ac.equals("About")) {
             JOptionPane.showMessageDialog(ImagePrinter.this,
              "ImagePrinter\nVersion: " + VERSION + " - " + DATE + "\n" +
             "Copyright \u00a9 Knute Johnson 2008-2013.  All rights 
reserved.",
              "About",JOptionPane.INFORMATION_MESSAGE);
         }
     }

     public int print(Graphics g,PageFormat pf,int index) {
         if (index == 0) {
             render(g);
             return Printable.PAGE_EXISTS;
         } else
             return Printable.NO_SUCH_PAGE;
     }

     void render(Graphics g2D) {
         Graphics2D g = (Graphics2D)g2D;
         int x = (int)pf.getImageableX();
         int y = (int)pf.getImageableY();
         int w = bi.getWidth();
         int h = bi.getHeight();

         if (scaled) {
             double aspectRatioOfPage =
              pf.getImageableWidth() / pf.getImageableHeight();
             double aspectRatioOfImage = (double)w / h;
             if (aspectRatioOfImage > aspectRatioOfPage) {
                 double scale = pf.getImageableWidth() / bi.getWidth();
                 w = (int)(w * scale);
                 h = (int)(h * scale);
             } else {
                 double scale = pf.getImageableHeight() / bi.getHeight();
                 w = (int)(w * scale);
                 h = (int)(h * scale);
             }
         }
         if (centered) {
             int adjust = ((int)pf.getImageableWidth() - w) / 2;
             x += adjust;

             adjust = ((int)pf.getImageableHeight() - h) / 2;
             y += adjust;
         }
         g.drawImage(bi,x,y,w,h,null);
     }

     private void loadData(PageFormat pf) {
         Paper paper = pf.getPaper();
         try {
             BufferedReader br = new BufferedReader(new 
FileReader(dataFile));
             double x = Double.parseDouble(br.readLine());
             double y = Double.parseDouble(br.readLine());
             double iX = Double.parseDouble(br.readLine());
             double iY = Double.parseDouble(br.readLine());
             double w = Double.parseDouble(br.readLine());
             double h = Double.parseDouble(br.readLine());
             br.close();
             paper.setImageableArea(x,y,iX,iY);
             paper.setSize(w,h);
             pf.setPaper(paper);
         } catch (IOException ioe) {
             ioe.printStackTrace();
         } catch (NumberFormatException nfe) {
             nfe.printStackTrace();
         }
     }

     private void saveData(PageFormat pf) {
         Paper paper = pf.getPaper();
         try {
             BufferedWriter bw = new BufferedWriter(new 
FileWriter(dataFile));
             bw.write(Double.toString(paper.getImageableX()));
             bw.newLine();
             bw.write(Double.toString(paper.getImageableY()));
             bw.newLine();
             bw.write(Double.toString(paper.getImageableWidth()));
             bw.newLine();
             bw.write(Double.toString(paper.getImageableHeight()));
             bw.newLine();
             bw.write(Double.toString(paper.getWidth()));
             bw.newLine();
             bw.write(Double.toString(paper.getHeight()));
             bw.newLine();
             bw.close();
         } catch (IOException ioe) {
             ioe.printStackTrace();
         }
     }

     class ImagePanel extends JPanel {
         public ImagePanel() {
             setPreferredSize(new Dimension(500,500));
         }

         public void paintComponent(Graphics g2D) {
             // anti-alias all drawing
             Graphics2D g = (Graphics2D)g2D;
             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
              RenderingHints.VALUE_ANTIALIAS_ON);
             // draw file pathname
             g.drawString(fileName,10,20);
             // set scale
             g.scale(0.5,0.5);
             // center the paper in the frame
             g.translate((getWidth() * 2.0 - pf.getWidth()) / 2.0,
              (getHeight() * 2.0 - pf.getHeight()) / 2.0);
             // draw the paper
             g.drawRect(0,0,(int)pf.getWidth(),(int)pf.getHeight());
             // draw the imageable area
             g.drawRect((int)pf.getImageableX(),(int)pf.getImageableY(),
              (int)pf.getImageableWidth(),(int)pf.getImageableHeight());
             // draw the image if it exists
             if (bi != null)
                 render(g);
         }
     }

     static class ImageFileFilter extends 
javax.swing.filechooser.FileFilter {
         public boolean accept(File file) {
             return file.isDirectory() ||  file.getName().matches(
              "^.*\\.(?i:jpg|jpeg|png|bmp|wbmp|gif)$");
         }

         public String getDescription() {
             return "Image Files";
         }
     }

     public static void main(String[] args) {
         EventQueue.invokeLater(new Runnable() {
             public void run() {
                 new ImagePrinter();
             }
         });
     }
}



-- 

Knute Johnson

Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Java printing Margins Roedy Green <see_website@mindprod.com.invalid> - 2014-06-02 09:20 -0700
  Re: Java printing Margins Roedy Green <see_website@mindprod.com.invalid> - 2014-06-02 09:38 -0700
  Re: Java printing Margins Roedy Green <see_website@mindprod.com.invalid> - 2014-06-02 09:51 -0700
  Re: Java printing Margins Knute Johnson <eternal@knutejohnson.com> - 2014-06-02 13:15 -0700
    Re: Java printing Margins Roedy Green <see_website@mindprod.com.invalid> - 2014-06-03 11:04 -0700
      Re: Java printing Margins Knute Johnson <eternal@knutejohnson.com> - 2014-06-04 20:25 -0700
        Re: Java printing Margins Roedy Green <see_website@mindprod.com.invalid> - 2014-06-08 06:17 -0700
          Re: Java printing Margins Knute Johnson <eternal@knutejohnson.com> - 2014-06-08 14:09 -0700
            Re: Java printing Margins Martin Gregorie <martin@address-in-sig.invalid> - 2014-06-08 22:40 +0000
              Re: Java printing Margins Knute Johnson <eternal@knutejohnson.com> - 2014-06-09 07:26 -0700
                Re: Java printing Margins Martin Gregorie <martin@address-in-sig.invalid> - 2014-06-09 16:10 +0000
                Re: Java printing Margins Knute Johnson <eternal@knutejohnson.com> - 2014-06-09 11:41 -0700
                Re: Java printing Margins Martin Gregorie <martin@address-in-sig.invalid> - 2014-06-09 22:02 +0000
                Re: Java printing Margins Knute Johnson <eternal@knutejohnson.com> - 2014-06-09 15:56 -0700
      Re: Java printing Margins Knute Johnson <eternal@knutejohnson.com> - 2014-06-04 20:27 -0700
        Re: Java printing Margins Jeff Higgins <jeff@invalid.invalid> - 2014-06-05 19:56 -0400
          Re: Java printing Margins Knute Johnson <eternal@knutejohnson.com> - 2014-06-05 20:38 -0700
        Re: Java printing Margins Roedy Green <see_website@mindprod.com.invalid> - 2014-06-08 06:19 -0700
          Re: Java printing Margins Martin Gregorie <martin@address-in-sig.invalid> - 2014-06-08 15:49 +0000
            Re: Java printing Margins Jeff Higgins <jeff@invalid.invalid> - 2014-06-08 22:50 -0400
              Re: Java printing Margins Jeff Higgins <jeff@invalid.invalid> - 2014-06-08 23:32 -0400
                Re: Java printing Margins Martin Gregorie <martin@address-in-sig.invalid> - 2014-06-09 15:30 +0000
                Re: Java printing Margins Jeff Higgins <jeff@invalid.invalid> - 2014-06-09 13:29 -0400
                Re: Java printing Margins Jeff Higgins <jeff@invalid.invalid> - 2014-06-09 14:00 -0400
                Re: Java printing Margins Jeff Higgins <jeff@invalid.invalid> - 2014-06-09 14:16 -0400
                Re: Java printing Margins markspace <markspace@nospam.nospam> - 2014-06-09 14:04 -0700
                Re: Java printing Margins Jeff Higgins <jeff@invalid.invalid> - 2014-06-09 17:38 -0400
  Re: Java printing Margins Roedy Green <see_website@mindprod.com.invalid> - 2014-06-03 11:36 -0700
    Re: Java printing Margins Roedy Green <see_website@mindprod.com.invalid> - 2014-06-05 12:47 -0700

csiph-web