在程序中实现java.awt.print.Printable接口,然后用java.awt.print.PrinterJob类可以进行多页打印

解决方案 »

  1.   

    兄弟我也有这个疑问呀我这里有愿码但是有个问题还没有解决呢你看看吧要是能解决就更好了
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.font.*;
    import java.awt.geom.*;
    import java.awt.print.*;
    import java.util.*;
    import javax.swing.*;public class BookTest
     { public static void main(String[] args)
       {JFrame Frame = new BookTestFrame();
        Frame.show();
        }
      }
      class BookTestFrame extends JFrame
        implements ActionListener
     {public BookTestFrame()
       { setTitle("BookTest");
         setSize(300,100);
         addWindowListener(new WindowAdapter()
             { public void windowClosing(WindowEvent e)
             { System.exit(0);
             }
           });
           
         Container contentPane=getContentPane();
         text = new JTextField();
         contentPane.add(text,"South");
         
         JPanel buttonPanel = new JPanel();
         
         printButton = new JButton("Print");
         buttonPanel.add(printButton);
         printButton.addActionListener(this);
         
         //JButton
         pageSetupButton = new JButton("Page setup");
         buttonPanel.add(pageSetupButton);
         pageSetupButton.addActionListener(this);
         
         //JButton 
         printPreviewButton = new JButton("Print Preview");
         buttonPanel.add(printPreviewButton);
         printPreviewButton.addActionListener(this);
              contentPane.add(buttonPanel,"North");
          }      
          public Book makeBook()
          {  if (pageFormat == null)
             {PrinterJob PrintJob=PrinterJob.getPrinterJob();
              pageFormat = PrintJob.defaultPage();
            }
            Book book = new Book();
            String message = text.getText();
            Banner banner = new Banner(message);
            int pageCount
                =banner.getPageCount((Graphics2D)getGraphics(),
                pageFormat);
            book.append(new CoverPage(message+"("+pageCount
               +"pages)"),pageFormat);
            book.append(banner,pageFormat, pageCount);
            return book;
           }
           
           public void actionPerformed(ActionEvent Event)
           {  Object source=Event.getSource();
              if(source == printButton)
           { PrinterJob PrintJob = PrinterJob.getPrinterJob();
             PrintJob.setPageable(makeBook());
           {try
             { PrintJob.print();
             }
            catch(Exception Exception)
              { JOptionPane.showMessageDialog(this,Exception);
              }
            }
          }
          else if (source == pageSetupButton)
          { PrinterJob PrintJob=PrinterJob.getPrinterJob();
            if (pageFormat == null)
              pageFormat = PrintJob.defaultPage();
              pageFormat = PrintJob.pageDialog(pageFormat);
           }
           else if(source == printPreviewButton)
           {  
            PrintPreviewDialog Dialog
                 =new PrintPreviewDialog(makeBook());
                 Dialog.show();
                }
             }
          private JButton printButton;
          private JButton pageSetupButton;
          private JButton printPreviewButton;  
             
          private JTextField text;
          private PageFormat pageFormat; 
           }class Banner implements Printable
    { public Banner(String m)
     {message=m;
     }public int getPageCount(Graphics2D g2,PageFormat pf)
    { if (message.equals("")) return 0;
      layoutPages(g2,pf);
      float width=scale*layout.getAdvance();
      int pages = (int)Math.ceil(width/pf.getImageableWidth());
      return pages;
    }public int print(Graphics g,PageFormat pf,int page)
      throws PrinterException
      {Graphics2D g2=(Graphics2D)g;
      g2.setPaint(Color.black);
      if (page>getPageCount(g2,pf))
         return Printable.NO_SUCH_PAGE;
      g2.translate(pf.getImageableX(),pf.getImageableY());
      
      drawPage(g2,pf,page);
      return Printable.PAGE_EXISTS;
      }public void layoutPages(Graphics2D g2,PageFormat pf)
      { if(message.equals(""))return;
      FontRenderContext context=g2.getFontRenderContext();
      Font f = new Font("Serif",Font.PLAIN,72);
      layout=new TextLayout(message,f,context);
      float ascent=layout.getAscent();
      float descent=layout.getDescent();
      float height=ascent+descent;
      scale=(float)pf.getImageableHeight()/height;
    }public void drawPage(Graphics2D g2,PageFormat pf, int page)
     {if (message.equals(""))return;
      page--;//account for cover page
      layoutPages(g2,pf);
      
      drawCropMarks(g2,pf);
      g2.clip(new Rectangle2D.Double(0,0,
        pf.getImageableWidth(),pf.getImageableHeight()));
          g2.translate(-page*pf.getImageableWidth(),0);
          g2.scale(scale,scale);
          AffineTransform transform
          =AffineTransform.getTranslateInstance(0,
           layout.getAscent());
          Shape outline=layout.getOutline(transform);
          g2.draw(outline);
    }public void drawCropMarks(Graphics2D g2,PageFormat pf)
      {  final double c = 36;//crop  length =1/2 inch
      double w = pf.getImageableWidth();
      double h = pf.getImageableHeight();
      g2.draw(new Line2D.Double(0,0,0,c));
      g2.draw(new Line2D.Double(0,0,c,0));
      g2.draw(new Line2D.Double(w,0,w,c));
      g2.draw(new Line2D.Double(w,0,w-c,c));
      g2.draw(new Line2D.Double(0,h,0,h-c));
      g2.draw(new Line2D.Double(0,h,c,h));
      g2.draw(new Line2D.Double(w,h,w,h-c));
      g2.draw(new Line2D.Double(w,h,w-c,h));
    }
     private String message;
     private float scale;
     private float width;
     private TextLayout layout;
    }class CoverPage implements Printable
    { public CoverPage(String t)
    { title=t;
    }public  int print(Graphics g,PageFormat pf, int page)
       throws PrinterException
       {if(page>=1) return Printable.NO_SUCH_PAGE;
       Graphics2D g2=(Graphics2D)g;
       g2.setPaint(Color.black);
       g2.translate(pf.getImageableX(),pf.getImageableY());
       FontRenderContext context=g2.getFontRenderContext();
       Font f = g2.getFont();
       TextLayout layout = new TextLayout(title,f,context);
       float ascent = layout.getAscent();
      g2.drawString(title,0,ascent);
       return Printable.PAGE_EXISTS;
      }
    private String title;
    }
    class PrintPreviewDialog extends JDialog
    implements ActionListener
      { public PrintPreviewDialog(Printable p,PageFormat pf,
       int pages)
      {Book book = new Book();
      book.append(p,pf,pages);
      layoutUI(book);
      }public  PrintPreviewDialog(Book b)
     { layoutUI(b);
    }
    public void layoutUI(Book book)
    { setSize(200,200);
      Container contentPane = getContentPane();
      Canvas =new PrintPreviewCanvas(book);
      contentPane.add(Canvas,"Center");
      
      JPanel buttonPanel = new JPanel();
      
      //JButton 
      nextButton = new JButton("Next");
      buttonPanel.add(nextButton);
      nextButton.addActionListener(this);
      
      previousButton = new JButton("Previous");
      buttonPanel.add(previousButton);
      previousButton.addActionListener(this);
      
      //JButton 
      closeButton = new JButton("Close");
      buttonPanel.add(closeButton);
      closeButton.addActionListener(this);
      
     contentPane.add(buttonPanel,"South");
      }public void actionPerformed(ActionEvent Event)
    { Object source = Event.getSource();
        if(source==nextButton)
        {  Canvas.flipPage(1);
         else if(source==nextButton)
        {  Canvas.flipPage(-1);
        }
    else if(source==previousButton)
    { setVisible(false);
    }
    }
    private JButton nextButton;
    private JButton previousButton;
    private JButton closeButton;
    private PrintPreviewCanvas Canvas;
    }class PrintPreviewCanvas extends JPanel
    { public PrintPreviewCanvas(Book b)
      {book = b;
       currentPage = 0;
    }public void PaintComponent(Graphics g)
    { super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    PageFormat pageFormat = book.getPageFormat(currentPage);double xoff;//x offset of page start in window
    double yoff;//y offset of page start in window
    double scale;// scale factor to fit page in window
    double px = pageFormat.getWidth();
    double py = pageFormat.getHeight();
    double sx = getWidth()-1;
    double sy = getHeight()-1;
    if(px/py<sx/sy)//center horizontally
    { scale=sy/py;
    xoff=0.5*(sx-scale*px);
    yoff=0;
    }
    else// center vertically
    {scale = sx/px;
    xoff = 0;
    yoff = 0.5*(sy-scale*py);
    }
    g2.translate((float)xoff,(float)yoff);
    g2.scale((float)scale,(float)scale);
    //draw page outline(ignoring margins)
    Rectangle2D page = new Rectangle2D.Double(0,0,px,py);
    g2.setPaint(Color.white);
    g2.fill(page);
    g2.setPaint(Color.black);
    g2.draw(page);Printable  printable = book.getPrintable(currentPage);
    try 
      {printable.print(g2,pageFormat,currentPage);
    }
    catch(PrinterException Exception)
    {g2.draw(new Line2D.Double(0,0,px,py));
    g2.draw(new Line2D.Double(0,px,0,py));
    }
    }
    public void flipPage(int by)
    { int newPage = currentPage+by;
    if(0<=newPage&&newPage<book.getNumberOfPages())
    {currentPage=newPage;
     repaint();
    }
    }
    private Book book;
    private int currentPage;

          如果问题解决了的话就给我发一个回来呀谢谢了