/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program 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. * * Copyright (c) 2006 - 2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.engine.classic.core.modules.output.table.rtf.itext; import com.lowagie.text.Anchor; import com.lowagie.text.Annotation; import com.lowagie.text.Chapter; import com.lowagie.text.Chunk; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.Image; import com.lowagie.text.List; import com.lowagie.text.ListItem; import com.lowagie.text.Meta; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.Section; import com.lowagie.text.SimpleTable; import com.lowagie.text.Table; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.rtf.RtfBasicElement; import com.lowagie.text.rtf.RtfMapper; import com.lowagie.text.rtf.document.RtfDocument; import com.lowagie.text.rtf.document.RtfInfoElement; import com.lowagie.text.rtf.field.RtfAnchor; import com.lowagie.text.rtf.graphic.RtfImage; import com.lowagie.text.rtf.list.RtfList; import com.lowagie.text.rtf.list.RtfListItem; import com.lowagie.text.rtf.text.RtfAnnotation; import com.lowagie.text.rtf.text.RtfChapter; import com.lowagie.text.rtf.text.RtfChunk; import com.lowagie.text.rtf.text.RtfNewPage; import com.lowagie.text.rtf.text.RtfParagraph; import com.lowagie.text.rtf.text.RtfPhrase; import com.lowagie.text.rtf.text.RtfSection; import com.lowagie.text.rtf.text.RtfTab; import java.util.ArrayList; public class PatchRtfDocument extends RtfDocument { private static class PatchRtfMapper extends RtfMapper { private RtfDocument rtfDoc; private PatchRtfMapper( final RtfDocument doc ) { super( doc ); this.rtfDoc = doc; } public RtfBasicElement[] mapElement( Element element ) throws DocumentException { ArrayList<RtfBasicElement> rtfElements = new ArrayList<RtfBasicElement>(); if ( element instanceof RtfBasicElement ) { RtfBasicElement rtfElement = (RtfBasicElement) element; rtfElement.setRtfDocument( rtfDoc ); return new RtfBasicElement[] { rtfElement }; } switch ( element.type() ) { case Element.CHUNK: Chunk chunk = (Chunk) element; if ( chunk.hasAttributes() ) { if ( chunk.getAttributes().containsKey( Chunk.IMAGE ) ) { rtfElements.add( new RtfImage( rtfDoc, chunk.getImage() ) ); } else if ( chunk.getAttributes().containsKey( Chunk.NEWPAGE ) ) { rtfElements.add( new RtfNewPage( rtfDoc ) ); } else if ( chunk.getAttributes().containsKey( Chunk.TAB ) ) { Float tabPos = (Float) ( (Object[]) chunk.getAttributes().get( Chunk.TAB ) )[1]; RtfTab tab = new RtfTab( tabPos.floatValue(), RtfTab.TAB_LEFT_ALIGN ); tab.setRtfDocument( rtfDoc ); rtfElements.add( tab ); rtfElements.add( new RtfChunk( rtfDoc, new Chunk( "\t" ) ) ); } else { rtfElements.add( new RtfChunk( rtfDoc, (Chunk) element ) ); } } else { rtfElements.add( new RtfChunk( rtfDoc, (Chunk) element ) ); } break; case Element.PHRASE: rtfElements.add( new RtfPhrase( rtfDoc, (Phrase) element ) ); break; case Element.PARAGRAPH: rtfElements.add( new RtfParagraph( rtfDoc, (Paragraph) element ) ); break; case Element.ANCHOR: rtfElements.add( new RtfAnchor( rtfDoc, (Anchor) element ) ); break; case Element.ANNOTATION: rtfElements.add( new RtfAnnotation( rtfDoc, (Annotation) element ) ); break; case Element.IMGRAW: case Element.IMGTEMPLATE: case Element.JPEG: rtfElements.add( new RtfImage( rtfDoc, (Image) element ) ); break; case Element.AUTHOR: case Element.SUBJECT: case Element.KEYWORDS: case Element.TITLE: case Element.PRODUCER: case Element.CREATIONDATE: rtfElements.add( new RtfInfoElement( rtfDoc, (Meta) element ) ); break; case Element.LIST: rtfElements.add( new RtfList( rtfDoc, (List) element ) ); // TODO: Testing break; case Element.LISTITEM: rtfElements.add( new RtfListItem( rtfDoc, (ListItem) element ) ); // TODO: Testing break; case Element.SECTION: rtfElements.add( new RtfSection( rtfDoc, (Section) element ) ); break; case Element.CHAPTER: rtfElements.add( new RtfChapter( rtfDoc, (Chapter) element ) ); break; case Element.TABLE: if ( element instanceof Table ) { rtfElements.add( new PatchRtfTable( rtfDoc, (Table) element ) ); } else { rtfElements.add( new PatchRtfTable( rtfDoc, ( (SimpleTable) element ).createTable() ) ); } break; case Element.PTABLE: if ( element instanceof PdfPTable ) { rtfElements.add( new PatchRtfTable( rtfDoc, (PdfPTable) element ) ); } else { rtfElements.add( new PatchRtfTable( rtfDoc, ( (SimpleTable) element ).createTable() ) ); } break; } return rtfElements.toArray( new RtfBasicElement[rtfElements.size()] ); } } private RtfMapper mapper; public PatchRtfDocument() { this.mapper = new PatchRtfMapper( this ); } public RtfMapper getMapper() { return mapper; } }