CardPrintBean.java 6.62 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.facade.UserFacade;
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;
	@EJB
	private UserFacade userfacade;

	/**
	 * 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()));

			if(faceBufferedImage.getWidth() > 1024 || faceBufferedImage.getHeight() > 1024) {
				throw new Exception("Image dimensions too large, please take/upload smaller!");
			}
			
			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());
	}
}