CardPrintBean.java 6.5 KB
package fi.insomnia.bortal.beans;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.imageio.ImageIO;

import com.pdfjet.CoreFont;
import com.pdfjet.Image;
import com.pdfjet.ImageType;
import com.pdfjet.PDF;
import com.pdfjet.Page;
import com.pdfjet.TextLine;

import fi.insomnia.bortal.facade.CardTemplateFacade;
import fi.insomnia.bortal.facade.EventUserFacade;
import fi.insomnia.bortal.model.CardTemplate;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.util.MassPrintResult;
import fi.insomnia.bortal.utilities.BarcodeUtils;

/**
 * Session Bean implementation class CardPrintBean
 */
@Stateless
@LocalBean
public class CardPrintBean implements CardPrintBeanLocal {

	@EJB private UserBean userBean;
	@EJB private EventUserFacade eventUserFacade;
	@EJB private CardTemplateBean cardTemplateBean;
	@EJB private CardTemplateFacade cardTemplateFacade;
	
    /**
     * Default constructor.
     */
    public CardPrintBean() {
        // TODO Auto-generated constructor stub
    }

    
    //TODO: Roles?
    public MassPrintResult getUserCardsAsPrintablePdf(List<Integer> userIdList) throws Exception {
    	ArrayList<EventUser> listOfEventUsers = new ArrayList<EventUser>();
    	
    	for(Integer userId : userIdList) {
    		listOfEventUsers.add(eventUserFacade.find(userId));
    	}
    	
		return constructPdf(listOfEventUsers);
    }
    
    public MassPrintResult getUserCardAsPrintablePdf(Integer userId) throws Exception {
    	ArrayList<EventUser> listOfEventUsers = new ArrayList<EventUser>();
    	
    	listOfEventUsers.add(eventUserFacade.find(userId));
    	
    	return constructPdf(listOfEventUsers);
    }
    
    public void acceptMassPrintResult(MassPrintResult mpr) {
    	for(EventUser eu : mpr.getAffectedUsers()) {
    		PrintedCard printedCard = cardTemplateBean.checkPrintedCard(eu);
    		printedCard.setPrintCount(printedCard.getPrintCount()+1);
    		System.out.println("Print count "+printedCard.getPrintCount());
    	}

    	cardTemplateFacade.flush();
    }
    
    private MassPrintResult constructPdf(List<EventUser> users) throws Exception {   	

		// double[] pageSize = new double[] { cardBackground.getWidth(),
		// cardBackground.getHeight() };

		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

		PDF pdf = new PDF(outputStream);
		pdf.setTitle("CARD");

		double pagex = 155.52; // 54,0 mm
		double pagey = 243.84; // 85,5 mm
		
		MassPrintResult mpr = new MassPrintResult();
		
		for(EventUser user : users) {
			
			PrintedCard printedCard = cardTemplateBean.checkPrintedCard(user);
			
			if(printedCard == null)
				continue;
			
			CardTemplate cardTemplate = printedCard.getTemplate();
			
			BufferedImage cardBackground = ImageIO.read(new ByteArrayInputStream(
					cardTemplate.getImage()));

			BufferedImage faceBufferedImage = ImageIO
					.read(new ByteArrayInputStream(user.getCurrentImage()
							.getImageData()));
			
			
			int originalWidth = faceBufferedImage.getWidth();
			int originalHeight = faceBufferedImage.getHeight();
			
			int width = originalWidth;
			int height = (int)Math.round(originalWidth*(1/0.7317073170731707));
			
			if(height > originalHeight) {
				height = originalHeight;
				width = (int)Math.round(originalHeight*0.7317073170731707);
			}
			
			int offsetx = (originalWidth - width)/2;
			int offsety = (originalHeight - height)/2;
			
			faceBufferedImage = faceBufferedImage.getSubimage(offsetx, offsety, width, height);
			
			Page page = new Page(pdf, new double[] { pagex, pagey });
	
			// Render background image
			Image templateImage = new Image(pdf,
					convertBufferedImageToPng(cardBackground), ImageType.PNG);
			templateImage.setPosition(0, 0);
			templateImage.scaleBy(0.245);
			templateImage.drawOn(page);
	
			// Render face image
			Image faceImage = new Image(pdf,
					convertBufferedImageToPng(faceBufferedImage), ImageType.PNG);
			faceImage.setPosition(15.5, 67);
			//faceImage.scaleBy(0.32);
			faceImage.scaleBy(((410.0*0.245)/faceImage.getHeight()));
			faceImage.drawOn(page);
	
			// Render texts
			// Big font for nick
			com.pdfjet.Font nickFont = new com.pdfjet.Font(pdf, CoreFont.HELVETICA);
			nickFont.setSize(16.0);
	
			// User nick text
			TextLine nickTextLine = new TextLine(nickFont);
			nickTextLine.setText(user.getUser().getNick());
			nickTextLine.setPosition(19.0, 193.0);
			nickTextLine.setColor(new double[] {1.0, 1.0, 1.0});
			nickTextLine.drawOn(page);
	
			// Smaller font
			com.pdfjet.Font font = new com.pdfjet.Font(pdf, CoreFont.HELVETICA);
			font.setSize(10.0);
			
			// Full name text
			String wholeName = user.getUser().getFirstnames() + " "
					+ user.getUser().getLastname();
			TextLine wholeNameText = new TextLine(font);
			wholeNameText.setText(wholeName);
			wholeNameText.setPosition(17.0, 212.0);
			wholeNameText.setColor(new double[] {1.0, 1.0, 1.0});
			wholeNameText.drawOn(page);
	
			// Role text
			TextLine roleTextLine = new TextLine(font);
			roleTextLine.setText(cardTemplate.getName());
			roleTextLine.setPosition(17.0, 223.0);
			roleTextLine.setColor(new double[] {1.0, 1.0, 1.0});
			roleTextLine.drawOn(page);
	
			// Barcode
			String barcodeString = String.valueOf(user.getUser().getCreated()
					.getTime().getTime());
			barcodeString = barcodeString.substring(barcodeString.length() - 12);
			BufferedImage barCodeBufferedImage = ImageIO.read(BarcodeUtils
					.getBarcodeEAN(barcodeString));
			Image barCodeImage = new Image(pdf,
					convertBufferedImageToPng(barCodeBufferedImage), ImageType.PNG);
			barCodeImage.setPosition(0.0, 243.5);
			barCodeImage.scaleBy(0.7);
			barCodeImage.drawOn(page);
			
			mpr.getAffectedUsers().add(user);
		}
		pdf.flush();
		outputStream.close();
		
		if(mpr.getAffectedUsers().size() == 0) throw new Exception("No cards generated");
		mpr.setPdf(outputStream.toByteArray());
		return mpr;
    }
    
    private ByteArrayInputStream convertBufferedImageToPng(BufferedImage img)
			throws IOException {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		ImageIO.write(img, "png", outStream);
		outStream.close();

		return new ByteArrayInputStream(outStream.toByteArray());
	}
}