package chiralsoftware.pdf.ui; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import java.awt.Component; import java.awt.Graphics2D; import java.awt.Color; import java.awt.geom.Rectangle2D; import org.jboss.seam.pdf.ui.ITextComponent; import org.jboss.seam.pdf.ui.UIDocument; import com.lowagie.text.pdf.PdfWriter; import com.lowagie.text.pdf.DefaultFontMapper; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfTemplate; import com.lowagie.text.Image; import com.lowagie.text.ImgTemplate; public class GraphicsTag extends ITextComponent { private int height = 300; private int width = 400; public void setHeight(int height) { this.height = height; } public int getHeight() { return (Integer) valueBinding(FacesContext.getCurrentInstance(), "height", height); } public void setWidth(int width) { this.width = width; } public int getWidth() { return (Integer) valueBinding(FacesContext.getCurrentInstance(), "width", width); } private Component component; public void setComponent(Component component) { this.component = component; } public Component getComponent() { return (Component) valueBinding(FacesContext.getCurrentInstance(), "component",component); } @Override public void createITextObject(FacesContext context) { // don't use the component variable directly! // we need to check for the valueBinding Component component = getComponent(); if(component == null) { System.out.println("Warning: component was null."); return; } final UIDocument doc = (UIDocument) findITextParent(getParent(), UIDocument.class); if (doc != null) { final PdfWriter writer = (PdfWriter) doc.getWriter(); final PdfContentByte cb = writer.getDirectContent(); final PdfTemplate tp = cb.createTemplate(getWidth(), getHeight()); final Graphics2D g2 = tp.createGraphics(getWidth(),getHeight()); // setSize() is very important. The default size // for this component is zero, which means it will not display // unless the size is set component.setSize(getWidth(), getHeight()); component.paint(g2); g2.dispose(); try { image = new ImgTemplate(tp); } catch(Exception e) { System.out.println(e.getMessage()); } } } private Image image = null; @Override public void handleAdd(Object arg0) { throw new RuntimeException("No children allowed"); } @Override public void removeITextObject() { image = null; } /** This must return a com.lowagie.text.Element object, * or else it will throw a IllegalArgumentException("cannot add " + o) */ @Override public Object getITextObject() { return image; } }