/* * EtiquetaPrinter.java * * Created on 27 de Fevereiro de 2006, 14:41 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package siprp.clientes; import java.io.*; import java.text.*; import java.util.*; import com.evolute.utils.fop.*; import com.evolute.utils.ui.*; import com.evolute.utils.xml.*; import siprp.data.*; /** * * @author Frederico */ public class EtiquetaPrinter { protected static final DecimalFormat N_F = new DecimalFormat(); static { DecimalFormatSymbols dfs = new DecimalFormatSymbols( new Locale( "pt", "PT" ) ); dfs.setDecimalSeparator( '.' ); N_F.setDecimalFormatSymbols( dfs ); N_F.setMaximumFractionDigits( 4 ); N_F.setMinimumFractionDigits( 0 ); } protected Double altura; protected Double largura; protected Double margemEsquerda; protected Double margemCima; protected Integer colunas; protected Integer linhas; protected boolean continua; protected Double alturaFolha; protected Double larguraFolha; protected Double margemVerticalFolha; protected Double margemHorizontalFolha; /** Creates a new instance of EtiquetaPrinter */ public EtiquetaPrinter( EtiquetaData etiqueta ) { altura = ( Double ) etiqueta.get( EtiquetaData.ALTURA ); largura = ( Double ) etiqueta.get( EtiquetaData.LARGURA ); margemEsquerda = ( Double ) etiqueta.get( EtiquetaData.MARGEM_ESQUERDA ); margemCima = ( Double ) etiqueta.get( EtiquetaData.MARGEM_CIMA ); colunas = ( Integer ) etiqueta.get( EtiquetaData.COLUNAS ); linhas = ( Integer ) etiqueta.get( EtiquetaData.LINHAS ); continua = "y".equals( etiqueta.get( EtiquetaData.CONTINUA ) ); alturaFolha = ( Double ) etiqueta.get( EtiquetaData.ALTURA_FOLHA ); larguraFolha = ( Double ) etiqueta.get( EtiquetaData.LARGURA_FOLHA ); margemVerticalFolha = ( Double ) etiqueta.get( EtiquetaData.MARGEM_VERTICAL_FOLHA ); margemHorizontalFolha = ( Double ) etiqueta.get( EtiquetaData.MARGEM_HORIZONTAL_FOLHA ); } public void print( Vector data ) { int pos[] = new EtiquetaChooserDialog( null, linhas.intValue(), colunas.intValue() ).choose(); if( pos == null ) { return; } int row = pos[ 0 ]; int col = pos[ 1 ]; String header = ""; SimpleXMLElement styleSheet = new SimpleXMLElement( "xsl:stylesheet" ); styleSheet.addAttribute( "version", "1.1" ); styleSheet.addAttribute( "xmlns:xsl", "http://www.w3.org/1999/XSL/Transform" ); styleSheet.addAttribute( "xmlns:fo", "http://www.w3.org/1999/XSL/Format" ); styleSheet.addAttribute( "exclude-result-prefixes", "fo" ); styleSheet.setCompact( false ); SimpleXMLElement output = new SimpleXMLElement( "xsl:output" ); styleSheet.addElement( output ); output.addAttribute( "method", "xml" ); output.addAttribute( "version", "1.0" ); output.addAttribute( "omit-xml-declaration", "no" ); output.addAttribute( "indent", "yes" ); SimpleXMLElement template = new SimpleXMLElement( "xsl:template" ); styleSheet.addElement( template ); template.addAttribute( "match", "ETIQUETA" ); SimpleXMLElement root = new SimpleXMLElement( "fo:root" ); template.addElement( root ); SimpleXMLElement layoutMasterSet = new SimpleXMLElement( "fo:layout-master-set" ); root.addElement( layoutMasterSet ); SimpleXMLElement simplePageMaster = new SimpleXMLElement( "fo:simple-page-master" ); layoutMasterSet.addElement( simplePageMaster ); simplePageMaster.addAttribute( "master-name", "simpleA4" ); simplePageMaster.addAttribute( "page-height", N_F.format( alturaFolha ) + "cm" ); simplePageMaster.addAttribute( "page-width", N_F.format( larguraFolha ) + "cm" ); simplePageMaster.addAttribute( "margin-top", N_F.format( ( row == 0 ? margemVerticalFolha : 0.0 ) + row * ( altura + margemCima ) ) + "cm" ); simplePageMaster.addAttribute( "margin-bottom", "0.5cm" ); simplePageMaster.addAttribute( "margin-left", N_F.format( ( col == 0 ? margemHorizontalFolha : 0.0 ) + col * ( largura + margemEsquerda ) ) + "cm" ); simplePageMaster.addAttribute( "margin-right", N_F.format( col == colunas - 1 ? margemHorizontalFolha : 0.0 ) ); SimpleXMLElement regionBody = new SimpleXMLElement( "fo:region-body" ); simplePageMaster.addElement( regionBody ); SimpleXMLElement pageSequence = new SimpleXMLElement( "fo:page-sequence" ); root.addElement( pageSequence ); pageSequence.addAttribute( "master-reference", "simpleA4" ); SimpleXMLElement flow = new SimpleXMLElement( "fo:flow" ); pageSequence.addElement( flow ); flow.addAttribute( "flow-name", "xsl-region-body" ); for( Object line[] : data ) { SimpleXMLElement lineXML = createLine( line, largura - ( col == 0 || col == colunas - 1 ? margemHorizontalFolha : 0.0 ) ); flow.addElement( lineXML ); } //System.out.println( "XSL: " + styleSheet.toString() ); String xml = ""; ByteArrayOutputStream out = new ByteArrayOutputStream(); FOPCreator creator = new FOPCreator(); InputStream xmlIn = new ByteArrayInputStream( xml.getBytes() ); try { creator.createFOfromXML( xmlIn, new ByteArrayInputStream( (header+styleSheet).getBytes() ), out ); ByteArrayInputStream in = new ByteArrayInputStream( out.toString().getBytes() ); Hashtable printOptions = new Hashtable(); //System.out.println( "OUT: " + out.toString() ); com.evolute.utils.fop.FOPPrinter printer = new com.evolute.utils.fop.FOPPrinter(); printer.printFO( in, false, true, printOptions ); } catch( Exception ex ) { DialogException.showExceptionMessage( ex, "Erro a imprimir", true ); } } protected SimpleXMLElement createLine( Object[] line, Double larguraDisponival ) { SimpleXMLElement table = new SimpleXMLElement( "fo:table" ); table.addAttribute( "table-layout", "fixed" ); table.addAttribute( "width", N_F.format( larguraDisponival ) + "cm" ); table.addAttribute( "space-before.optimum", "0pt" ); table.addAttribute( "space-after.optimum", "0pt" ); for( int n = 1; n < line.length; n += 2 ) { SimpleXMLElement tableColumn = new SimpleXMLElement( "fo:table-column" ); table.addElement( tableColumn ); tableColumn.addAttribute( "column-width", N_F.format( ( ( Double ) line[ n ] ) * larguraDisponival ) + "cm" ); } SimpleXMLElement tableBody = new SimpleXMLElement( "fo:table-body" ); table.addElement( tableBody ); SimpleXMLElement tableRow = new SimpleXMLElement( "fo:table-row" ); tableBody.addElement( tableRow ); for( int n = 0; n < line.length; n += 2 ) { SimpleXMLElement tableCell = new SimpleXMLElement( "fo:table-cell" ); tableRow.addElement( tableCell ); SimpleXMLElement block = new SimpleXMLElement( "fo:block" ); tableCell.addElement( block ); block.addAttribute( "font-size", "10pt" ); block.addAttribute( "text-align", "left" ); // block.addAttribute( "wrap-option", "no-wrap" ); // block.addAttribute( "overflow", "scroll" ); block.addTextElement( ( String ) line[ n ] ); } return table; } }