处理A4不能打印大图片

原创 2007年10月15日 10:00:00

         前段时间在学习关于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;
                }

            }

            
        }

}

java 图片合成到A4纸上

最近2天在做移动端的项目,需要安卓 ios将拍完照的身份证正面和反面以Base64字符串传递给我,我拿到2个图片的地址,将这2张图片通过后台java技术合成到一张A4纸上之后以图片格式给移动端一个UR...
  • liguanghui1311
  • liguanghui1311
  • 2016年07月22日 00:10
  • 985

PPT打印技巧——你还在一页打六张吗?

转自:http://www.360doc.com/content/12/0510/17/178_210130394.shtml 很多朋友,特别是学生,在期末复习时要打印老师的幻灯片,ppt自己带...
  • shuimenghen1111
  • shuimenghen1111
  • 2014年12月04日 14:36
  • 5216

c#实现打印功能,可以设置纸张大小,字体和颜色等

原文:http://www.cnblogs.com/zhcw/archive/2011/11/30/2269083.html 窗体中填加控件:按钮、printDocument、printPr...
  • wky1709
  • wky1709
  • 2016年12月21日 12:47
  • 1347

快速掌握LODOP打印使用方法

下载LODOP包:http://www.lodop.net/ 下载LODOP技术文档:http://pan.baidu.com/s/1qWsgjJe 将 install_lodop32.exe 、...
  • lovelylord
  • lovelylord
  • 2015年02月02日 11:00
  • 10108

Delphi xe4 实现图像类似浮雕效果的函数改进后可以处理多种格式图片

  • 2013年06月24日 17:41
  • 3.23MB
  • 下载

gif4j-1.0.jar(gif图片处理 java jar包)

  • 2017年12月07日 15:20
  • 44KB
  • 下载

数字图像处理常用测试图片part4

  • 2008年11月21日 21:52
  • 15MB
  • 下载

用python简单处理图片(4):图像中的像素访问

前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作。如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了。因此,通常我们加载完图片后,都...
  • haluoluo211
  • haluoluo211
  • 2016年10月14日 15:03
  • 3890

im4java包处理图片

package com.stu.util; import java.io.IOException; import java.util.ArrayList; import org.im4java.c...
  • xielibohoudi
  • xielibohoudi
  • 2012年09月17日 11:32
  • 8343

用python简单处理图片(4):图像中的像素访问

前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作。如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了。因此,通常我们加载完图片后,都...
  • haoji007
  • haoji007
  • 2016年07月29日 11:26
  • 4156
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:处理A4不能打印大图片
举报原因:
原因补充:

(最多只允许输入30个字)