Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #28659
| 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> |
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
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