หน้าเว็บ

วันพุธที่ 24 เมษายน พ.ศ. 2556

send image to jasper report (step by step) : java

จาก บทความที่แล้ว  inject jasper report pdf viewer into java application (step by step)  เราก็ได้ report ออกมาหนึ่ง report  เราจะใช้ report ตัวนั้นมาต่อยอดครับ

1. ไปหารูปภาพมาวางใน class path ของ project 



2. ไปที่ iReport  แล้วเปิด report ขึ้นมา


3. ลาก Image pallete มาวางครับ   โดยเลือกรูปภาพมาเลย




4. ลาก Image pallete อันที่ 2 มาวาง  โดยตัวนี้  ยังไม่ต้องเลือกรูปภาพครับ  (ถ้ามี dialog เด้งขึ้นมาก็ให้ปิดไปเลย)


5.  จากนั้นลอง compile report ดูครับ  ด้วยการคลิ๊กที่ปุ่ม Preview
ใน report ก็จะมีรูปภาพแสดงขึ้นมา


6. ลองกลับไปที่ Netbeans : java application  แล้วลอง run file App.java ดูครับ


ได้ผลลัพธ์ออกมาเป็น jasper pdf viewer


7. กลับมาที่ iReport  เพิ่ม field image เข้าไปครับ  ซึ่งในที่นี้เราจะรับ image มาจากภายนอก
ที่เราทำไปก่อนหน้านี้เป็นการ fixed image location ซึ่งถือว่าไม่เหมาะสมเท่าไหร่ครับ


8. ผูก Image pallete เข้ากับ field ที่เราสร้างขึ้น  ด้วยการคลิ๊กที่ Image pallete นั้นๆ  แล้วดูที่ properties ครับ (ถ้าไม่ขึ้นก็ให้ไปที่ Toolbar Menu Window แล้วเลือก Properties ครับ)

คลิ๊กที่ Image pallete ที่ต้องการ  แล้วไปที่ properties Image Expression  เพื่อผูก Image pallete เข้ากับ field นั้นๆ

ทำตามตัวเลขในรูปข้างล่างน่ะครับ (ตัวเลขข้อ 4 ให้ double click ครับ)


ตรง Expression Class ให้เลือกเป็น java.lang.String ครับ



ตอนนี้เรา bind Image pallete เข้ากับ field $F{profileImage} แล้วครับ


9. แก้ไข type ของ field viewerImage (ให้ไปคลิกที่ field ที่เราเพิ่มเข้ามาก่อนน่ะครับ) แล้วไปที่ properties Field Class เปลี่ยนจาก java.lang.String ไปเป็น java.lang.Object (iReport บาง version อาจจะเห็นเป็นแค่ Object)


10. คลิ๊กที่ Image pallete อีกตัว  แล้วแก้ไข properties ดังนี้
        - Image Expression : $F{viewerImage} คือการ bind image เข้ากับ field ที่ต้องการ
        - Expression Class : java.awt.Image


11. ลอง compile report ดูครับ
รูปภาพจะยังไม่ออกน่ะครับ  เพราะเรายังไม่ได้ส่งอะไรเข้ามา


12. กลับไปที่ Netbeans IDE : java application
แก้ code User.java ใหม่ด้วยการเพื่อ attribute : String profileImage, BufferedImage viewerImage เข้าไป
package com.blogspot.na5cent.jasper.viewer;

import java.awt.image.BufferedImage;
import java.util.Date;

/**
 *
 * @author redcrow
 */
public class User {

    private String fname;
    private String lname;
    private Date birthDate;
    private String profileImage;
    private BufferedImage viewerImage;

    public String getFname() {
        return fname;
    }

    public void setFname(String fname) {
        this.fname = fname;
    }

    public String getLname() {
        return lname;
    }

    public void setLname(String lname) {
        this.lname = lname;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public String getProfileImage() {
        return profileImage;
    }

    public void setProfileImage(String profileImage) {
        this.profileImage = profileImage;
    }

    public BufferedImage getViewerImage() {
        return viewerImage;
    }

    public void setViewerImage(BufferedImage viewerImage) {
        this.viewerImage = viewerImage;
    }
}

แก้ code App.java ใหม่ ดังนี้
package com.blogspot.na5cent.jasper.viewer;

import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jasperreports.engine.JRException;

/**
 * redcrow
 *
 */
public class App {

    private static final Logger LOG = Logger.getLogger(App.class.getName());
    private static final String REPORT_FILE = "viewerReport.jasper";

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        InputStream inputStream = null;
        try {
            inputStream = App.class.getClassLoader().getResourceAsStream(REPORT_FILE);

            User user = new User();
            user.setFname("redcrow");
            user.setLname("na5cent");
            user.setBirthDate(new Date());
            user.setProfileImage("profile-image.jpg"); //*****

            user.setViewerImage(new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB)); //*****

            Map<String, Object> params = new HashMap<String, Object>();
            params.put("title", "inject jasper report pdf viewer into java application (step by step)");
            params.put("content", "hello world");

            ReportUtils.viewReport(new Object[]{user}, inputStream, params, "test report viewer");
        } catch (RuntimeException ex) {
            LOG.log(Level.SEVERE, null, ex);
        } catch (JRException ex) {
            LOG.log(Level.SEVERE, null, ex);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException ex) {
                    LOG.log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

13. run file App.java


14. แก้ code App.java ใหม่  ดังนี้
package com.blogspot.na5cent.jasper.viewer;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import net.sf.jasperreports.engine.JRException;

/**
 * redcrow
 *
 */
public class App {

    private static final Logger LOG = Logger.getLogger(App.class.getName());
    private static final String REPORT_FILE = "viewerReport.jasper";

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        InputStream inputStream = null;
        InputStream viewerInputStream = null;
        try {
            inputStream = App.class.getClassLoader().getResourceAsStream(REPORT_FILE);
            viewerInputStream = App.class.getClassLoader().getResourceAsStream("butterfly.jpg"); //****

            User user = new User();
            user.setFname("redcrow");
            user.setLname("na5cent");
            user.setBirthDate(new Date());
            user.setProfileImage("profile-image.jpg");

            //******************************************************************
            BufferedImage viewerImage = ImageIO.read(viewerInputStream);
            user.setViewerImage(viewerImage);
            //******************************************************************

            Map<String, Object> params = new HashMap<String, Object>();
            params.put("title", "inject jasper report pdf viewer into java application (step by step)");
            params.put("content", "hello world");

            ReportUtils.viewReport(new Object[]{user}, inputStream, params, "test report viewer");
        } catch (RuntimeException ex) {
            LOG.log(Level.SEVERE, null, ex);
        } catch (JRException ex) {
            LOG.log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            LOG.log(Level.SEVERE, null, ex);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException ex) {
                    LOG.log(Level.SEVERE, null, ex);
                }
            }

            if (viewerInputStream != null) {
                try {
                    viewerInputStream.close();
                } catch (IOException ex) {
                    LOG.log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

15. run App.java ใหม่


สรุป
        ผมทำการส่งรูปภาพเข้าไปใน report 2 แบบครับ
1. คือ path ของรูปภาพ  แล้วให้ report จัดการ inject รูปภาพนั้นเข้าไปเอง  เราแค่ส่ง path  เข้าไปให้  ซึ่งผมส่งผ่าน field profileImage ครับ

2. คือ BufferedImage  อันนี้ไว้ใช้ในกรณีที่  บางครั้งเราเก็บเข้ามูลรูปภาพนั้นไว้ใน database  คือเก็บเป็น image byte (BLOB) ไว้  แล้วต้องการเอาออกมาแสดงครับ   เราก็ต้องเอา byte image นั้นมาแปลงให้อยู่ในรูป InputStream  ด้วย Class ByteArrayInputStream(byte); ก่อน  จากนั้นก็ค่อยใช้ ImageIO.read(inputStream); เพื่อแปลงไปเป็น BufferedImage อีกที  แล้วค่อยเซตใส่ Bean หรือ model ที่เราสร้างขึ้น  เพื่อส่งไปยัง report ครับ  แต่ตัวอย่างผมเอา InputStream มาจาก  App.class.getClassLoader().getResourceAsStream("butterfly.jpg");  ซึ่งเป็น file ที่อยู่ใน class path ครับ


        ผมหวังว่าบทความทุกบทความที่ผมเขียนจะพอเป็นประโยชน์สำหรับ  "กรรมกรไอที"  ทุกๆท่านได้น่ะครับ

ยินดีครับสำหรับการแบ่งปันความรู้และประสบการณ์ที่มีอยู่อันน้อยนิดครับ  ^___^

ไม่มีความคิดเห็น:

แสดงความคิดเห็น