Ho fatto questo... fa qualcosa, ma c'è da giocare ancora con il codice proposto.

Classe di test (desktop, ma può essere qualsiasi altra cosa che derivi in qualche modo da Component)

codice:
import javax.swing.*;
import java.awt.*;

public class desktop extends JFrame {

  public desktop() {
      super("Ciao!");
      this.getContentPane().setLayout(new BorderLayout());
      JLabel north = new JLabel("In alto");
      JLabel south = new JLabel("In Basso");
      JLabel alcentro = new JLabel(new ImageIcon("C:/Documents and Settings/Andrea/Desktop/goofy.jpg"));
      this.getContentPane().add(north, BorderLayout.NORTH);
      this.getContentPane().add(south, BorderLayout.SOUTH);
      this.getContentPane().add(alcentro, BorderLayout.CENTER);
      this.setSize(400, 400);
      this.setVisible(true);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  public static void main (String[] args) {
    desktop d = new desktop();
    PrintPreview pp = new PrintPreview(d);
  }
}
e la classe rimaneggiata (appena) per l'antemprima:
codice:
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;

import java.awt.print.*;
import java.lang.Math.*;

import java.awt.image.*;


public class PrintPreview extends JDialog implements ActionListener{

public PrintPreview(Component pc){

        super((JFrame)pc, true);
        this.setSize(1024, 768);

        PC = pc;

// buttons

        pf1 = new JRadioButton("Portrait");
           pf1.setActionCommand("1");
           pf1.setSelected(true);

           pf2 = new JRadioButton("Landscape");
           pf2.setActionCommand("2");


           pf.add(pf1);
           pf.add(pf2);

           /*pf1.setBackground(Pref.tbgc);
           pf2.setBackground(Pref.tbgc);
           cp.setBackground(Pref.tbgc);*/


        preview.addActionListener(this);
           print.addActionListener(this);


// set

        pp.setPreferredSize(new Dimension(460, 460));
        pp.setBorder(BorderFactory.createLineBorder (Color.black, 2));
       // pp.setBackground(Pref.tbgc);


        hold.setPreferredSize(new Dimension(200, 280));
        hold.setBorder(BorderFactory.createLineBorder (Color.black, 2));
        //hold.setBackground(Pref.tbgc);


// make main panel


        //mp.setBackground(Pref.tbgc);

        GridBagLayout gridbag = new GridBagLayout();
         GridBagConstraints constraints = new GridBagConstraints();

        mp.setLayout(gridbag);

// make hold panel


        GridBagLayout g1 = new GridBagLayout();
         GridBagConstraints c1 = new GridBagConstraints();

        hold.setLayout(g1);

// DELETE


        PF.setOrientation(PF.PORTRAIT);



// GUI

// hold

        c1.insets.top = 5;
        c1.insets.left = 45;
        c1.insets.right = 5;


        buildConstraints(c1, 0, 2, 2, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(pf1, c1);

        hold.add(pf1);



        c1.insets.top = 2;

        buildConstraints(c1, 0, 4, 2, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(pf2, c1);

        hold.add(pf2);

//
        c1.insets.left = 5;
        c1.insets.right = 0;
        c1.insets.top = 25;

        buildConstraints(c1, 0, 6, 1, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(xsl, c1);

        hold.add(xsl);

        c1.insets.left = 0;
        c1.insets.right = 5;

        buildConstraints(c1, 1, 6, 1, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(xs, c1);

        hold.add(xs);

//
        c1.insets.left = 5;
        c1.insets.right = 0;
        c1.insets.top = 5;

        buildConstraints(c1, 0, 8, 1, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(ysl, c1);

        hold.add(ysl);

        c1.insets.left = 0;
        c1.insets.right = 5;

        buildConstraints(c1, 1, 8, 1, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(ys, c1);

        hold.add(ys);

        c1.insets.left = 25;
        c1.insets.right = 5;

        buildConstraints(c1, 0, 10, 2, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(cp, c1);

        hold.add(cp);

//

        c1.insets.left = 35;
        c1.insets.right = 35;
        c1.insets.top = 20;

        buildConstraints(c1, 0, 12, 2, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(ftp, c1);

        hold.add(ftp);


        c1.insets.left = 35;
        c1.insets.right = 35;
        c1.insets.top = 25;

        buildConstraints(c1, 0, 14, 2, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(preview, c1);

        hold.add(preview);

        c1.insets.bottom = 15;
        c1.insets.top = 5;

        buildConstraints(c1, 0, 16, 2, 1, 1, 1);
        c1.fill = GridBagConstraints.BOTH;
        g1.setConstraints(print, c1);

        hold.add(print);

//

        constraints.insets.top = 10;
        constraints.insets.left = 10;
        constraints.insets.bottom = 10;


        buildConstraints(constraints, 0, 2, 1, 1, 1, 1);
        constraints.fill = GridBagConstraints.NONE;
        gridbag.setConstraints(hold, constraints);

        mp.add(hold);

        constraints.insets.right = 10;


        buildConstraints(constraints, 1, 2, 1, 1, 1, 1);
        constraints.fill = GridBagConstraints.NONE;
        gridbag.setConstraints(pp, constraints);

        mp.add(pp);




// display

        this.setContentPane(mp);

        this.setVisible(true);
        this.setResizable(false);

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(720, 520);

           Dimension windowSize = getSize();
        setLocation(Math.max(0,(screenSize.width -windowSize.width)/2),
        (Math.max(0,(screenSize.height-windowSize.height)/2)));





}

public void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, double wx, double wy){

        gbc.gridx = gx;
        gbc.gridy = gy;
        gbc.gridwidth = gw;
        gbc.gridheight = gh;
        gbc.weightx = wx;
        gbc.weighty = wy;

}

public class PreviewPage extends JPanel{

public PreviewPage(){

}

public void paint(Graphics g){

        super.paint(g);
        Graphics2D g2 = (Graphics2D)g;

// PORTRAIT

        if(PF.getOrientation() == PF.PORTRAIT){

        g.setColor(Color.black);
        g.drawRect(60, 10, 340, 440);

        int x1 = (int)Math.rint( ( (double)PF.getImageableX() / 72 ) * 40 );
        int y1 = (int)Math.rint( ( (double)PF.getImageableY() / 72 ) * 40 );

        int l1 = (int)Math.rint( ( (double)PF.getImageableWidth() / 72 ) * 40 );
        int h1 = (int)Math.rint( ( (double)PF.getImageableHeight() / 72 ) * 40 );

        g.setColor(Color.red);
        g.drawRect(x1+60, y1+10, l1, h1);

        setScales();

        int x2 = (int)Math.rint( 1028 / XSC );
        int y2 = (int)Math.rint( 768 / YSC );


        Image image = new BufferedImage( x2, y2, BufferedImage.TYPE_INT_ARGB);

        PC.paint( image.getGraphics() );

        g.drawImage(image, x1+60, y1+10, l1, h1, this);





        }

// LANDSCAPE

        if(PF.getOrientation() == PF.LANDSCAPE){

        g.setColor(Color.black);
        g.drawRect(10, 60, 440, 340);

        int x1 = (int)Math.rint( ( (double)PF.getImageableX() / 72 ) * 40 );
        int y1 = (int)Math.rint( ( (double)PF.getImageableY() / 72 ) * 40 );

        int l1 = (int)Math.rint( ( (double)PF.getImageableWidth() / 72 ) * 40 );
        int h1 = (int)Math.rint( ( (double)PF.getImageableHeight() / 72 ) * 40 );

        g.setColor(Color.red);
        g.drawRect(x1+10, y1+60, l1, h1);

        setScales();

        int x2 = (int)Math.rint( 1028 / XSC );
        int y2 = (int)Math.rint( 768 / YSC );


        Image image = new BufferedImage( x2, y2, BufferedImage.TYPE_INT_ARGB);

        PC.paint( image.getGraphics() );

        g.drawImage(image, x1+10, y1+60, l1, h1, this);


        }


}

        Graphics P;

}

public void actionPerformed(ActionEvent e){


// fit to page
        if(e.getSource() == ftp){

        }

// preview
        if(e.getSource() == preview){

        setProperties();
        }


// print
        if(e.getSource() == print){
        doPrint();
        }

}

public void setProperties(){

        if(pf1.isSelected() == true){
        PF.setOrientation(PF.PORTRAIT);
        }

        if(pf2.isSelected() == true){
        PF.setOrientation(PF.LANDSCAPE);
        }

        setScales();

        pp.repaint();

}

public void setScales(){

        try{
        XSC = Double.parseDouble( xs.getText() );
        } catch (NumberFormatException e) { }

        try{
        YSC = Double.parseDouble( ys.getText() );
        } catch (NumberFormatException e) { }


}

public void doPrint(){

        PrintThis();

}

public void PrintThis(){

        PrinterJob printerJob = PrinterJob.getPrinterJob();

        Book book = new Book();
        book.append( new PrintPage(), PF );

        printerJob.setPageable(book);

        boolean doPrint = printerJob.printDialog();
        if (doPrint) {

        try {
        printerJob.print();
        } catch (PrinterException exception) {
        System.err.println("Printing error: " + exception);
        }

        }

}

public class PrintPage implements Printable{

public int print(Graphics g, PageFormat format, int pageIndex) {



        Graphics2D g2D = (Graphics2D) g;

        g2D.translate(format.getImageableX (), format.getImageableY ());

        disableDoubleBuffering(mp);

        System.out.println("get i x " + format.getImageableX ());
        System.out.println("get i x " + format.getImageableY ());
        System.out.println("getx: " + format.getImageableWidth() );
        System.out.println("getx: " + format.getImageableHeight() );



        // scale to fill the page
        double dw = format.getImageableWidth();
        double dh = format.getImageableHeight();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        setScales();

        double xScale = dw / (1028/XSC);
        double yScale = dh / (768/YSC);
        double scale = Math.min(xScale,yScale);



        System.out.println("" + scale);

        g2D.scale( xScale, yScale);


        ((JPanel)PC).paint(g);

        enableDoubleBuffering(mp);


        return Printable.PAGE_EXISTS;

}

public void disableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(false);
}

public void enableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(true);
}

}


        Component PC;

        PageFormat PF = new PageFormat();

        double XSC = 1;
        double YSC = 1;

// gui comp

        JPanel mp = new JPanel();
        JPanel hold = new JPanel();
        JPanel pp = new PreviewPage();

        ButtonGroup pf = new ButtonGroup();
        JRadioButton pf1;
        JRadioButton pf2;

        JLabel xsl = new JLabel("X Scale:", JLabel.LEFT);
        JTextField xs = new JTextField("1");

        JLabel ysl = new JLabel("Y Scale:", JLabel.LEFT);
        JTextField ys = new JTextField("1");

        JButton ftp = new JButton("Fit to Page");
        JCheckBox cp = new JCheckBox("Constrain Proportions");

        JButton preview = new JButton("PREVIEW");
        JButton print = new JButton("PRINT");


}
Auguri, in tutti i sensi