/*
* Copyright 2005 Joe Walker
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.dwr.simple;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import org.directwebremoting.io.FileTransfer;
import com.lowagie.text.Document;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
/**
* A demonstration of uploading files and images
* @author Joe Walker [joe at getahead dot ltd dot uk]
*/
public class UploadDownload
{
/**
* Take 2 uploaded files and return an image based on them
* @param uploadImage The uploaded image
* @param uploadFile The uploaded file
* @param color The selected color
* @return A mangled image based on the 2 uploaded files
*/
public BufferedImage uploadFiles(BufferedImage uploadImage, String uploadFile, String color)
{
uploadImage = scaleToSize(uploadImage);
uploadImage = grafitiTextOnImage(uploadImage, uploadFile, color);
return uploadImage;
}
/**
* Generates a PDF file with the given text
* http://itext.ugent.be/itext-in-action/
* @return A PDF file as a byte array
*/
public FileTransfer downloadPdfFile(String contents) throws Exception
{
if (contents == null || contents.length() == 0)
{
contents = "[BLANK]";
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter.getInstance(document, buffer);
document.addCreator("DWR.war using iText");
document.open();
document.add(new Paragraph(contents));
document.close();
return new FileTransfer("example.pdf", "application/pdf", buffer.toByteArray());
}
/**
* Voodoo to scale the image to 200x200
* @param uploadImage The image to work on
* @return The altered image
*/
private BufferedImage scaleToSize(BufferedImage uploadImage)
{
AffineTransform atx = new AffineTransform();
atx.scale(200d / uploadImage.getWidth(), 200d / uploadImage.getHeight());
// AffineTransformOp.TYPE_BILINEAR is very slow
AffineTransformOp afop = new AffineTransformOp(atx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
uploadImage = afop.filter(uploadImage, null);
return uploadImage;
}
/**
* And scrawl the text on the image in 10 rows of 21 chars
* @param uploadImage The image to work on
* @param uploadFile The text to write on the image
* @param color The selected color
* @return The altered image
*/
private BufferedImage grafitiTextOnImage(BufferedImage uploadImage, String uploadFile, String color)
{
StringBuilder buffer = new StringBuilder();
while (buffer.length() < 200)
{
buffer.append(" ");
buffer.append(uploadFile);
}
Graphics2D g2d = uploadImage.createGraphics();
for (int row = 0; row < 10; row++)
{
String output = null;
if (buffer.length() > (row + 1) * CHARS_PER_LINE)
{
output = buffer.substring(row * CHARS_PER_LINE, (row + 1) * CHARS_PER_LINE);
}
else
{
output = buffer.substring(row * CHARS_PER_LINE);
}
g2d.setFont(new Font("SansSerif", Font.BOLD, 16));
g2d.setColor(UploadDownload.decodeHtmlColorString(color));
g2d.drawString(output, 5, (row + 1) * CHARS_PER_LINE);
}
return uploadImage;
}
/**
* Decode an HTML color string like '#F567BA;' into a {@link Color}
* @param colorString The string to decode
* @return The decoded color
* @throws IllegalArgumentException if the color sequence is not valid
*/
public static Color decodeHtmlColorString(String colorString)
{
Color color;
if (colorString.startsWith("#"))
{
colorString = colorString.substring(1);
}
if (colorString.endsWith(";"))
{
colorString = colorString.substring(0, colorString.length() - 1);
}
int red;
int green;
int blue;
switch (colorString.length())
{
case 6:
red = Integer.parseInt(colorString.substring(0, 2), 16);
green = Integer.parseInt(colorString.substring(2, 4), 16);
blue = Integer.parseInt(colorString.substring(4, 6), 16);
color = new Color(red, green, blue);
break;
case 3:
red = Integer.parseInt(colorString.substring(0, 1), 16);
green = Integer.parseInt(colorString.substring(1, 2), 16);
blue = Integer.parseInt(colorString.substring(2, 3), 16);
color = new Color(red, green, blue);
break;
case 1:
red = green = blue = Integer.parseInt(colorString.substring(0, 1), 16);
color = new Color(red, green, blue);
break;
default:
throw new IllegalArgumentException("Invalid color: " + colorString);
}
return color;
}
/**
*
*/
private static final int CHARS_PER_LINE = 21;
}