处理A4不能打印大图片

         前段时间在学习关于java打印的,瞎忙乎了好久。就是一张关于股票的数据分析表打印出来的结果A4不能完全显示,会截取一部分打印不出来,如下图做了简单的例子点击正常打印后的图有的字不能完全显示:

      本打算拿得所要打印的panel的画笔,然后将他转换成Graphics2D,再调用他的translate(double tx, double ty)scale(double sx, double sy)直接进行坐标转移缩放,然后对其打印,但是printJob.getGraphics()不能转换成g2,会抛出sun.print.ProxyPrintGraphics cannot be cast to java.awt.Graphics2D这个异常。在这个异常上花了很长时间,总想一定有什么办法在上面行的通。但是最后还是放弃。

   最后还是把当前的panel画成图片存在内存中,然后对这张图片进行缩放处理,下图是点击按比例缩小打印后的图,不过这样处理后的图有个问题就是有的字会模糊,缩放比例越小越不清楚,对照上下两张图看button上的字就能对比出来,不过对于缩放出来的图,这种问题也是正常情况。

        下面是源码:

 

package  kissJava.print;
/**
 * 
@author jxliangby
 * 
@since  2007.10.14
 * 
*/

import  java.awt.BorderLayout;
import  java.awt.Color;
import  java.awt.Font;
import  java.awt.Frame;
import  java.awt.Graphics;
import  java.awt.Graphics2D;
import  java.awt.Image;
import  java.awt.PageAttributes;
import  java.awt.PrintJob;
import  java.awt.RenderingHints;
import  java.awt.Toolkit;
import  java.awt.event.ActionEvent;
import  java.awt.event.ActionListener;
import  java.awt.geom.AffineTransform;
import  java.awt.image.AffineTransformOp;
import  java.awt.image.BufferedImage;
import  java.awt.print.PageFormat;
import  java.awt.print.Paper;
import  java.awt.print.Printable;
import  java.awt.print.PrinterException;
import  java.awt.print.PrinterJob;
import  java.io.IOException;
import  javax.print.PrintService;
import  javax.swing.JButton;
import  javax.swing.JComponent;
import  javax.swing.JFrame;
import  javax.swing.JPanel;

public   class  BigPrintExample  extends  JFrame  implements  ActionListener {
    
private JPanel panel = new JPanel();
    
private JPanel btnPanel = new JPanel();
    
private JButton normBtn = new JButton("正常打印(打印不完)");
    
private JButton zoomBtn = new JButton("按比例缩小打印");
    
private JComponent component = new PaintComponent();
    
    
public BigPrintExample(){
       
this.setTitle("Print Test");
       
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
this.setBounds((int)((SystemProperties.SCREEN_WIDTH - 800/ 2), (int)((SystemProperties.SCREEN_HEIGHT - 600/ 2), 800600);
       initLayout();
    }

    
//组件布局
    private void initLayout(){
        
this.getContentPane().setLayout(new BorderLayout());
        btnPanel.add(normBtn);
        btnPanel.add(zoomBtn);
        panel.setLayout(
new BorderLayout());
        panel.add(component, BorderLayout.CENTER);
        panel.add(btnPanel, BorderLayout.SOUTH);
        
this.getContentPane().add(panel);
        normBtn.addActionListener(
this);
        zoomBtn.addActionListener(
this);
    }

    
    
public void actionPerformed(ActionEvent e) {  
        
if(e.getSource() == normBtn)    
            normalPrint();
        
else    
            zoomInPrint();
        
    }

    
//截取打印,A4不能完全显示
    private void normalPrint(){
        
final PageAttributes pa = new PageAttributes();
        pa.setOrigin(java.awt.PageAttributes.OriginType.PRINTABLE);
        pa.setColor(java.awt.PageAttributes.ColorType.COLOR);
        pa.setMedia(java.awt.PageAttributes.MediaType.A4);
        
final Toolkit tk = panel.getToolkit();
        
final Graphics pg = panel.getGraphics();
        
final Graphics gr = pg.create();
        
final PrintJob pjob = tk.getPrintJob(
            
new Frame() {
                 
public Graphics getGraphics(){
                      
return gr;
                 }

            }
"printing pop-up frame"null, pa);

        
if(pjob != null{
            
final Graphics2D ppg = (Graphics2D)pjob.getGraphics();
            
if(ppg != null){
                panel.printAll(ppg);
//打印
                 ppg.dispose();
            }

            pjob.end();
        }
 
    }

    
    
private void zoomInPrint(){
        BufferedImage imag 
= create(this.getWidth(), this.getHeight());
        BufferedImage   image 
=null;
        
try{
             image 
= zoomImage(imag, 0.70);  //变成0.8的图片
             
//ImageIO.write(image, "jpg", new File("d:/tt.jpg"));
        }

        
catch(Exception ed){
             System.out.println(ed.toString());
         }
 
        PrinterJob pj 
= PrinterJob.getPrinterJob();    
        PrintService[] services 
= PrinterJob.lookupPrintServices();
        PageFormat pageFormat 
= pj.defaultPage();//得到默认页格式
        
//pageFormat.setOrientation(PageFormat.LANDSCAPE);//横向打印
        Paper paper = pageFormat.getPaper();
        
int nExtWidth = (int)paper.getImageableX()*4/5;
        
int nExtHeight = (int)paper.getImageableY()*2/3;
       
//设置页面显示大小,如调边距等。。。。
       paper.setImageableArea(paper.getImageableX()-nExtWidth, paper.getImageableY()-nExtHeight,
           paper.getImageableWidth()
+nExtWidth*2, paper.getImageableHeight()+nExtHeight*2);
       pageFormat.setPaper(paper);
       pj.setPrintable(
new PrintableDemo(image), pageFormat);
       
if (services.length > 0{
            
try {
                pj.setPrintService(services[
0]);
                
if(pj.printDialog()) {
                    pj.print();
                }

            }
 catch (PrinterException pe) 
                System.err.println(pe);
            }

        }
 
    }

    
/**
     * 将这个frame画成BufferedImage;
     * 
*/

    
private  BufferedImage create( int width, int height) {
        BufferedImage image 
= null;
        
try {    
            image 
= new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            getContentPane().paint(image.getGraphics()); 
        }
 catch (Exception e) {
            System.out.println(
"ffff = " + e);
        }

        
return image;
    }

    
/**
     * 将BufferedImage按比例变换
     * scale为变换比例
     * 
*/

    
private BufferedImage zoomImage(BufferedImage image, double scale)   throws   IOException  {  
 
        RenderingHints renderingHints 
=  new  RenderingHints(  
            RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);  
        AffineTransformOp scaleOp 
= new AffineTransformOp(  
                AffineTransform.getScaleInstance(scale, scale), renderingHints);  
        BufferedImage targetImage 
= new BufferedImage(  
            (
int)(image.getWidth() * scale),    
            (
int)(image.getHeight() * scale), image.getType());  
        scaleOp.filter(image, targetImage);  
        
return   targetImage;  
    }

    
    
public static void main(String[] args) {
        
new BigPrintExample().setVisible(true);
    }


    
class PaintComponent extends JComponent{
        
private String mString = "Java Source and Support";
        
private String javaStr = "I Love Java";
        
private String author = "By jxliangby";
        
private Font mFont = new Font("Serif", Font.PLAIN, 64);
        
private  int strX = 50, strY = 150

        
protected void paintComponent(Graphics g) {
            g.setFont(mFont);
            g.setColor(Color.red);
            g.drawString(mString, strX, strY);
            g.drawString(javaStr, strX , strY 
+ 150);
            g.drawString(author, strX 
+ 400 , strY + 300);
        }
    
    }

    
/**
     * 实现Printtable,将图片画出。
     * 
*/

    
class PrintableDemo implements Printable {
            Image image ;
//= new ImageIcon("1.gif").getImage();
             public PrintableDemo(Image image){
                
this.image = image;
             }

            
public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
                
if (pageIndex == 0{
                    Graphics2D g2d
= (Graphics2D)g;
                    g2d.translate(pf.getImageableX(), pf.getImageableY()); 
                    g2d.setColor(Color.red);            
                    g2d.drawImage(image, 
00null);
                    g2d.setColor(Color.black);
                    
return Printable.PAGE_EXISTS;                    
                }
 else {
                    
return Printable.NO_SUCH_PAGE;
                }

            }

            
        }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值