UserCardServlet.java 7.61 KB
package fi.insomnia.bortal.servlet;

import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.regex.Pattern;

import javax.ejb.EJB;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.pdfjet.Box;
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.beans.CardTemplateBeanLocal;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.utilities.BarcodeUtils;

/**
 * Servlet implementation class UploadServlet
 */
public class UserCardServlet extends GenericImageServlet {

	/**
     * 
     */
	private static final long serialVersionUID = -3359999630873773508L;

	@EJB
	private transient UserBeanLocal userbean;

	@EJB
	private transient PermissionBeanLocal permbean;

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */

	private final Pattern lhMatcher = Pattern.compile("^127.[0-9.]*|(0:)*1%0");

	@EJB
	private transient CardTemplateBeanLocal cardbean;

	private static final Logger logger = LoggerFactory
			.getLogger(UserCardServlet.class);

	@Override
	protected ImageMover getImagedata() {
		ImageMover ret = new ImageMover();
		Integer id = getIdParam("cardid");
		PrintedCard card = cardbean.getCard(id);
		logger.info("image data id {}, card {}", id, card);

		if (card != null) {
			if (!permbean.isCurrentUser(card.getUser())
					&& !permbean.hasPermission(UserPermission.MODIFY)
					&& !lhMatcher.matcher(request.getLocalAddr()).matches()) {
				ret.setResponse(HttpServletResponse.SC_FORBIDDEN);
			} else {
				try {
					ret.setData(mkCard(card));
					// ret.setImagetype("image/jpeg");
					ret.setImagetype("application/pdf");
				} catch (IOException e) {
					ret.setResponse(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
				} catch (Exception e) {
					ret.setResponse(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
					e.printStackTrace();
				}
			}

		} else {
			ret.setResponse(HttpServletResponse.SC_NOT_FOUND);
		}
		return ret;

	}

	private byte[] mkCardJpeg(PrintedCard card) throws IOException {

		EventUser user = card.getUser();

		BufferedImage face = ImageIO.read(new ByteArrayInputStream(user
				.getUser().getCurrentImage().getImageData()));

		BufferedImage base = ImageIO.read(new ByteArrayInputStream(card
				.getTemplate().getImage()));

		BufferedImage outimage = new BufferedImage(base.getWidth(),
				base.getHeight(), BufferedImage.TYPE_INT_RGB);

		Graphics2D g = outimage.createGraphics();
		// g.drawImage(org, AffineTransform.getScaleInstance(0.31, 0.31), null);
		g.drawImage(base, 0, 0, base.getWidth(), base.getHeight(), null);
		// g.drawImage(face, AffineTransform.getScaleInstance(0.31, 0.31),
		// null);

		g.drawImage(face, 60, 300, 320, 400, null);
		g.setFont(new Font("Century gothic", Font.PLAIN, 70));

		// g.drawString(nick, 595 -
		// g.getFontMetrics().charsWidth(nick.toCharArray(), 0, nick.length()),
		// 840);

		g.drawString(user.getUser().getNick(), 50, 810);

		g.setFont(new Font("Century gothic", Font.BOLD, 45));

		StringBuilder wholeName = new StringBuilder();
		wholeName.append(user.getUser().getFirstnames()).append(" ")
				.append(user.getUser().getLastname());

		// g.setFont(new Font("Arial", Font.BOLD, 35));
		// g.drawString(name, 595 -
		// g.getFontMetrics().charsWidth(name.toCharArray(), 0, name.length()),
		// 890);
		//
		// g.drawString(owner.getId().toString(), 60, 948);

		g.drawString(wholeName.toString(), 60, 865);
		g.drawString(card.getTemplate().getName(), 60, 915);

		String barcodeString = String.valueOf(user.getUser().getCreated()
				.getTime().getTime());
		barcodeString = barcodeString.substring(barcodeString.length() - 12);
		BufferedImage image = ImageIO.read(BarcodeUtils
				.getBarcodeEAN(barcodeString));
		g.drawImage(image, 0, base.getHeight() - 120, base.getWidth(), 120,
				null);

		g.dispose();

		ByteArrayOutputStream ostr = new ByteArrayOutputStream();

		ImageIO.write(outimage, "jpeg", ostr);
		return ostr.toByteArray();
	}

	// 300 dpi, 1016 px pituus, 648 px leveys,
	// 85,5 mm x 54,0 mm
	private byte[] mkCard(PrintedCard card) throws Exception {

		EventUser user = card.getUser();

		BufferedImage cardBackground = ImageIO.read(new ByteArrayInputStream(
				card.getTemplate().getImage()));

		BufferedImage faceBufferedImage = ImageIO
				.read(new ByteArrayInputStream(user.getUser().getCurrentImage()
						.getImageData()));

		// 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
		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, 70.0);
		faceImage.scaleBy((410.0/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(card.getTemplate().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);

		// Write out the pdf
		pdf.flush();
		outputStream.close();
		return outputStream.toByteArray();
	}

	private ByteArrayInputStream convertBufferedImageToPng(BufferedImage img)
			throws IOException {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		ImageIO.write(img, "png", outStream);
		outStream.close();

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