/* ****************************************************************************** * * Copyright 2008-2010 Hans Dijkema * * JRichTextEditor is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * JRichTextEditor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with JRichTextEditor. If not, see <http://www.gnu.org/licenses/>. * * ******************************************************************************/ package nl.dykema.jxmlnote.report.pdf; import java.awt.Color; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import nl.dykema.jxmlnote.exceptions.DefaultXMLNoteErrorHandler; import nl.dykema.jxmlnote.report.ReportException; import nl.dykema.jxmlnote.report.elements.Chunk; import nl.dykema.jxmlnote.utils.BufferedImageBuilder; import com.lowagie.text.Font; import com.lowagie.text.pdf.PdfContentByte; public class PdfChunk extends com.lowagie.text.Chunk implements Chunk { private boolean _bold=false; private boolean _italic=false; private boolean _underline=false; private boolean _hasImage=false; public String toString() { return String.format("PdfChunk: bold=%b, italic=%b, underline=%b, hasImage=%b", _bold,_italic,_underline,_hasImage); } public static com.lowagie.text.Image getImage(PdfReport rep,Image img,float scalePerc,float scaleWidth) { try { String instance=img.hashCode()+"-"+scalePerc+"-"+scaleWidth; if (rep.hasImageInstance(instance)) { return rep.getImageInstance(instance); } else { //com.lowagie.text.Image pi; Image pi=null; com.lowagie.text.Image pdi=null; if (img instanceof BufferedImage) { pdi=com.lowagie.text.Image.getInstance(img,null); //if (((BufferedImage) img).getTransparency()== Transparency.OPAQUE) { //pi=scaleImg(img,scalePerc,scaleWidth,rep); //pdi=com.lowagie.text.Image.getInstance(rep.pdfWriter(),img,rep.jpegQuality()); //} else { /*Image q=BufferedImageBuilder.bufferImage(Color.white,img.getWidth(null)+1,img.getHeight(null)+1); Graphics2D dc=(Graphics2D) q.getGraphics(); dc.drawImage(img,0,0,null); dc.dispose(); pi=scaleImg(q,scalePerc,scaleWidth); */ //pi=scaleImg(img,scalePerc,scaleWidth,rep); //BufferedImageBuilder.getScaledInstance(q, nw,nh); //pi=com.lowagie.text.Image.getInstance(rep.pdfWriter(),q,rep.jpegQuality()); //} } else { //pi=scaleImg(img,scalePerc,scaleWidth,rep);//BufferedImageBuilder.getScaledInstance(img, nw,nh); //pi=com.lowagie.text.Image.getInstance(rep.pdfWriter(),img,rep.jpegQuality()); pdi=com.lowagie.text.Image.getInstance(img,null); } //com.lowagie.text.Image pdfimg=scaleImage(pi,scalePerc,scaleWidth); com.lowagie.text.Image pdfimg; if (pdi==null) { //pdfimg=com.lowagie.text.Image.getInstance(rep.pdfWriter(),pi,rep.jpegQuality()); pdfimg=com.lowagie.text.Image.getInstance(pi,null); } else { pdfimg=scaleImage(pdi,scalePerc,scaleWidth,rep); } //com.lowagie.text.Image pdfimg=com.lowagie.text.Image.getInstance(pi, Color.white); //com.lowagie.text.Image pdfimg=com.lowagie.text.Image.getInstance(pi,Color.white); rep.putImageInstance(instance,pdfimg); return pdfimg; } } catch (Exception e) { DefaultXMLNoteErrorHandler.exception(e); return null; } } public static com.lowagie.text.Image getImage(PdfReport rep,File img,float scalePerc,float scaleWidth) { try { String instance=img.getAbsolutePath()+"-"+scalePerc+"-"+scaleWidth; if (rep.hasImageInstance(instance)) { return rep.getImageInstance(instance); } else { com.lowagie.text.Image pdfimg=scaleImage(com.lowagie.text.Image.getInstance(img.getAbsolutePath()),scalePerc,scaleWidth,rep); rep.putImageInstance(instance,pdfimg); return pdfimg; } } catch (Exception e) { DefaultXMLNoteErrorHandler.exception(e); return null; } } private static Image scaleImg(Image img,float scalePerc,float scaleWidth,PdfReport rep) { if (scalePerc==100.0f) { return img; } else if (scalePerc<=0.0f) { if (scaleWidth<=0.0f) { return img; } else { try { if (scaleWidth>rep.getTextWidth()) { scaleWidth=rep.getTextWidth(); } } catch (ReportException e) { DefaultXMLNoteErrorHandler.exception(e); } float imgwidth=img.getWidth(null); float perc=(scaleWidth/imgwidth); int nh=Math.round(img.getHeight(null)*perc); int nw=Math.round(imgwidth*perc); return BufferedImageBuilder.getScaledInstance(img, nw, nh); } } else { int nh=Math.round(img.getHeight(null)*scalePerc); int nw=Math.round(img.getWidth(null)*scalePerc); return BufferedImageBuilder.getScaledInstance(img, nw, nh); } } private static com.lowagie.text.Image scaleImage(com.lowagie.text.Image img,float scalePerc,float scaleWidth,PdfReport rep) { if (scalePerc==100.0f) { return img; } else if (scalePerc<=0.0f) { if (scaleWidth<=0.0f) { return img; } else { try { if (scaleWidth>rep.getTextWidth()) { scaleWidth=rep.getTextWidth()-10; } } catch (ReportException e) { DefaultXMLNoteErrorHandler.exception(e); } float imgwidth=img.getWidth(); float perc=(scaleWidth/imgwidth)*100.0f; img.scalePercent(perc); return img; } } else { img.scalePercent(scalePerc); return img; } } public PdfChunk setBackground(Color c,float padleft,float padtop,float padright,float padbottom) { super.setBackground(new BaseColor(c),padleft,padbottom,padright,padtop); return this; } public Chunk setTextColor(Color textColor) { Font f=super.getFont(); f.setColor(new BaseColor(textColor)); return this; } public Chunk setUnderline(Color c,float thinkness,float yposition) { super.setUnderline(new BaseColor(c),thinkness,0.0f,yposition,0.0f,PdfContentByte.LINE_CAP_ROUND); return this; } public Chunk setBold(boolean b) { _bold=b; return this; } public Chunk setItalic(boolean b) { _italic=b; return this; } public Chunk setUnderline(boolean b) { _underline=b; return this; } ///////////////////////////////////////////////////////////////////////////////////////////////// // own methods ///////////////////////////////////////////////////////////////////////////////////////////////// public void setFont(Font g) { Font f=new Font(g); int chst=0; if (_bold) { chst+=Font.BOLD; } if (_italic) { chst+=Font.ITALIC; } if (_underline) { chst+=Font.UNDERLINE; } f.setStyle(chst); super.setFont(f); } public boolean hasImage() { return _hasImage; } public PdfChunk(PdfReport rep,String txt) { super(txt); } public PdfChunk(PdfReport rep,Image img,float scalePerc,float scaleWidth) { super(getImage(rep,img,scalePerc,scaleWidth),0.0f,0.0f,true); _hasImage=true; } public PdfChunk(PdfReport rep,File imageFile,float scalePerc,float scaleWidth) { super(getImage(rep,imageFile,scalePerc,scaleWidth),0.0f,0.0f,true); _hasImage=true; } }