Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!eternal-september.org!feeder.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Knute Johnson Newsgroups: comp.lang.java.programmer Subject: Re: Java printing Margins Date: Wed, 04 Jun 2014 20:25:38 -0700 Organization: A noiseless patient Spider Lines: 328 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Thu, 5 Jun 2014 03:25:33 +0000 (UTC) Injection-Info: mx05.eternal-september.org; posting-host="aba33539224e5c782fe0c4053f7756fd"; logging-data="20070"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+IFo2QddUZ9ssd9kdC/H+j" User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 In-Reply-To: Cancel-Lock: sha1:2KpbRajIIINVShBaAVDGKNYrkQo= Xref: csiph.com comp.lang.java.programmer:28659 On 6/3/2014 11:04, Roedy Green wrote: > On Mon, 02 Jun 2014 13:15:05 -0700, Knute Johnson > 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