br.com.nordestefomento.jrimum.bopepo.view.ViewerPDF.java Source code

Java tutorial

Introduction

Here is the source code for br.com.nordestefomento.jrimum.bopepo.view.ViewerPDF.java

Source

/*
 * Copyright 2008 JRimum Project
 * 
 * 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.
 * 
 * Created at: 30/03/2008 - 18:05:16
 * 
 * ================================================================================
 * 
 * Direitos autorais 2008 JRimum Project
 * 
 * Licenciado sob a Licena Apache, Verso 2.0 ("LICENA"); voc no pode usar
 * esse arquivo exceto em conformidade com a esta LICENA. Voc pode obter uma
 * cpia desta LICENA em http://www.apache.org/licenses/LICENSE-2.0 A menos que
 * haja exigncia legal ou acordo por escrito, a distribuio de software sob
 * esta LICENA se dar COMO EST, SEM GARANTIAS OU CONDIES DE QUALQUER
 * TIPO, sejam expressas ou tcitas. Veja a LICENA para a redao especfica a
 * reger permisses e limitaes sob esta LICENA.
 * 
 * Criado em: 30/03/2008 - 18:05:16
 * 
 */

package br.com.nordestefomento.jrimum.bopepo.view;

import static br.com.nordestefomento.jrimum.utilix.ObjectUtil.isNotNull;
import static br.com.nordestefomento.jrimum.utilix.ObjectUtil.isNull;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.log4j.Logger;

import br.com.nordestefomento.jrimum.JRimumException;
import br.com.nordestefomento.jrimum.bopepo.BancoSuportado;
import br.com.nordestefomento.jrimum.bopepo.Boleto;
import br.com.nordestefomento.jrimum.domkee.comum.pessoa.endereco.Endereco;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Carteira;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.ContaBancaria;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Sacado;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.SacadorAvalista;
import br.com.nordestefomento.jrimum.utilix.DateUtil;
import br.com.nordestefomento.jrimum.utilix.FileUtil;
import br.com.nordestefomento.jrimum.utilix.MonetaryUtil;
import br.com.nordestefomento.jrimum.utilix.PDFUtil;
import br.com.nordestefomento.jrimum.utilix.RectanglePDF;

import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.BarcodeInter25;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

/**
 * 
 * <p>
 * DEFINIO DA CLASSE
 * </p>
 * 
 * <p>
 * OBJETIVO/PROPSITO
 * </p>
 * 
 * <p>
 * EXEMPLO:
 * </p>
 * 
 * @author <a href="http://gilmatryx.googlepages.com/">Gilmar P.S.L.</a>
 * 
 * @since 0.2
 * 
 * @version 0.2
 */
class ViewerPDF {

    // TODO Teste no teste unitrio.

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private static Logger log = Logger.getLogger(ViewerPDF.class);

    private static URL TEMPLATE_PADRAO_COM_SACADOR_AVALISTA = getTemplate(
            "file:///C:/tmp/pdf/BoletoTemplateComSacadorAvalista.pdf");
    private static URL TEMPLATE_PADRAO_SEM_SACADOR_AVALISTA = getTemplate(
            "file:///c:/tmp/pdf/BoletoTemplateSemSacadorAvalista.pdf");

    private static final String HIFEN_SEPERADOR = "-";

    private PdfReader reader;
    private PdfStamper stamper;
    private AcroFields form;

    private ByteArrayOutputStream outputStream;

    private Boleto boleto;

    private File template;

    public static URL getTemplate(String template) {
        URL templateUrl = null;
        try {
            templateUrl = new URL(template);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return templateUrl;
    }

    /**
     *<p> Para uso interno do componente </p> 
     */
    ViewerPDF() {
    }

    ViewerPDF(Boleto boleto) {

        this.boleto = boleto;
    }

    ViewerPDF(Boleto boleto, File template) {

        this.boleto = boleto;

        setTemplate(template);
    }

    /**
     * <p>
     * SOBRE O MTODO
     * </p>
     * 
     * @param pathName arquivo de destino
     * @param boletos a serem agrupados
     * @param boletoViewer visualizador
     * @return File contendo boletos gerados
     * 
     * @throws JRimumException Quando ocorrer um problema na gerao do PDF que est fora do controle
     * da biblioteca.
     * 
     * @since 0.2
     */
    protected static File groupInOnePDF(String pathName, List<Boleto> boletos, BoletoViewer boletoViewer) {

        File arq = null;

        List<byte[]> boletosEmBytes = new ArrayList<byte[]>(boletos.size());

        for (Boleto bop : boletos) {
            boletosEmBytes.add(boletoViewer.setBoleto(bop).getPdfAsByteArray());
        }

        try {

            arq = FileUtil.bytes2File(pathName, PDFUtil.mergeFiles(boletosEmBytes));

        } catch (FileNotFoundException e) {

            log.error("Erro durante gerao do PDF." + e.getLocalizedMessage(), e);
            throw new JRimumException("Erro durante gerao do PDF. Causado por " + e.getLocalizedMessage(),
                    e);

        } catch (IOException e) {

            log.error("Erro durante gerao do PDF." + e.getLocalizedMessage(), e);
            throw new JRimumException("Erro durante gerao do PDF. Causado por " + e.getLocalizedMessage(),
                    e);
        }

        return arq;
    }

    /**
     * <p>
     * SOBRE O MTODO
     * </p>
     * 
     * @param path
     * @param extensao TODO
     * @param boletos
     * @return List<File> com os boletos gerados.
     * 
     * @since 0.2
     */
    protected static List<File> onePerPDF(String path, String extensao, List<Boleto> boletos) {

        List<File> arquivos = new ArrayList<File>(boletos.size());
        int cont = 1;

        for (Boleto bop : boletos) {
            arquivos.add(new BoletoViewer(bop).getPdfAsFile(path + "Boleto" + cont++ + extensao));
        }

        return arquivos;
    }

    /**
     * 
     * @param pathName
     * @return
     * @throws IllegalArgumentException
     */
    protected File getFile(String pathName) {

        File file = null;

        try {

            processarPdf();

            file = FileUtil.bytes2File(pathName, outputStream.toByteArray());

        } catch (FileNotFoundException e) {

            log.error("Erro ao tentar acessar arquivo inexistente. " + e.getLocalizedMessage(), e);
            throw new JRimumException("Erro ao tentar acessar arquivo inexistente: [" + pathName + "]. "
                    + "Causado por " + e.getLocalizedMessage(), e);

        } catch (IOException e) {

            log.error("Erro durante a criao do arquivo. " + e.getLocalizedMessage(), e);
            throw new JRimumException("Erro durante a criao do arquivo: [" + pathName + "]. "
                    + "Causado por " + e.getLocalizedMessage(), e);

        } catch (DocumentException e) {

            log.error("Erro durante a criao do arquivo. " + e.getLocalizedMessage(), e);
            throw new JRimumException("Erro durante a criao do arquivo: [" + pathName + "]. "
                    + "Causado por " + e.getLocalizedMessage(), e);
        }

        return file;
    }

    /**
     * @throws JRimumException
     * 
     * @return
     */
    protected ByteArrayOutputStream getStream() {

        ByteArrayOutputStream baos = null;

        try {

            processarPdf();

            baos = FileUtil.bytes2Stream(outputStream.toByteArray());

        } catch (IOException e) {

            log.error("Erro durante a criao do stream. " + e.getLocalizedMessage(), e);
            throw new JRimumException(
                    "Erro durante a criao do stream. " + "Causado por " + e.getLocalizedMessage(), e);

        } catch (DocumentException e) {

            log.error("Erro durante a criao do stream. " + e.getLocalizedMessage(), e);
            throw new JRimumException(
                    "Erro durante a criao do stream. " + "Causado por " + e.getLocalizedMessage(), e);
        }

        return baos;
    }

    /**
     * @throws JRimumException
     * 
     * @return
     */
    protected byte[] getBytes() {

        byte[] bytes = null;

        try {

            processarPdf();

            bytes = outputStream.toByteArray();

        } catch (IOException e) {

            log.error("Erro durante a criao do stream. " + e.getLocalizedMessage(), e);
            throw new JRimumException(
                    "Erro durante a criao do stream. " + "Causado por " + e.getLocalizedMessage(), e);

        } catch (DocumentException e) {

            log.error("Erro durante a criao do stream. " + e.getLocalizedMessage(), e);
            throw new JRimumException(
                    "Erro durante a criao do stream. " + "Causado por " + e.getLocalizedMessage(), e);
        }

        return bytes;
    }

    protected File getTemplate() {
        return template;
    }

    protected void setTemplate(File template) {
        this.template = template;
    }

    protected void setTemplate(String pathname) {
        setTemplate(new File(pathname));
    }

    /**
     * @return the boleto
     * 
     * @since 0.2
     */
    protected Boleto getBoleto() {
        return this.boleto;
    }

    /**
     * <p>
     * SOBRE O MTODO
     * </p>
     * 
     * @throws IOException
     * @throws DocumentException
     * 
     * @since
     */
    private void processarPdf() throws IOException, DocumentException {

        inicializar();
        preencher();
        finalizar();
    }

    /**
     * <p>
     * SOBRE O MTODO
     * </p>
     * 
     * @return URL template
     * 
     * @since
     */
    private URL getTemplateFromResource() {

        URL templateFromResource = null;

        if (boleto.getTitulo().hasSacadorAvalista()) {
            templateFromResource = TEMPLATE_PADRAO_COM_SACADOR_AVALISTA;

        } else {
            templateFromResource = TEMPLATE_PADRAO_SEM_SACADOR_AVALISTA;
        }

        return templateFromResource;
    }

    /**
     * <p>
     * Verifica se o template que ser utilizado vir do resource ou  externo,
     * ou seja, se o usurio definiu ou no um template.
     * </p>
     * 
     * @return true caso o template que pode ser definido pelo usurio for null;
     *         false caso o usurio tenha definido um template.
     * 
     * @since
     */
    private boolean isTemplateFromResource() {
        return isNull(getTemplate());
    }

    /**
     * <p>
     * SOBRE O MTODO
     * </p>
     * 
     * @throws IOException
     * @throws DocumentException
     * 
     * @since
     */

    private void inicializar() throws IOException, DocumentException {

        if (isTemplateFromResource()) {
            reader = new PdfReader(getTemplateFromResource());

        } else {
            reader = new PdfReader(getTemplate().getAbsolutePath());
        }

        outputStream = new ByteArrayOutputStream();
        stamper = new PdfStamper(reader, outputStream);
        form = stamper.getAcroFields();
    }

    /**
     * <p>
     * SOBRE O MTODO
     * </p>
     * 
     * @throws DocumentException
     * @throws IOException
     * 
     * @since
     */
    private void finalizar() throws DocumentException, IOException {

        reader.consolidateNamedDestinations();/*
                                              * Replaces all the local named
                                              * links with the actual
                                              * destinations.
                                              */

        stamper.setFormFlattening(true);/*
                                        * Determines if the fields are
                                        * flattened on close.
                                        */
        stamper.setRotateContents(true);/*
                                        * Flags the content to be automatically
                                        * adjusted to compensate the original
                                        * page rotation.
                                        */

        reader.removeFields();/* Removes all the fields from the document. */

        stamper.setFullCompression();/*
                                     * Sets the document's compression to
                                     * the new 1.5 mode with object streams
                                     * and xref streams.
                                     */

        reader.eliminateSharedStreams();/*
                                        * Eliminates shared streams if they
                                        * exist.
                                        */

        // Send immediately
        outputStream.flush();

        // close All in this order
        outputStream.close();
        reader.close();
        stamper.close();
    }

    /**
     * <p>
     * SOBRE O MTODO
     * </p>
     * 
     * @throws MalformedURLException
     * @throws IOException
     * @throws DocumentException
     * 
     * @since
     */
    private void preencher() throws MalformedURLException, IOException, DocumentException {

        setLogoBanco();
        setCodigoBanco();
        setLinhaDigitavel();
        setCedente();
        setAgenciaCondigoCedente();
        setEspecie();
        setQuantidade();
        setNossoNumero();
        setNumeroDocumento();
        setAbstractCPRFCedente();
        setDataVencimeto();
        setValorDocumento();
        setDescontoAbatimento();
        setOutraDeducao();
        setMoraMulta();
        setOutroAcrescimo();
        setInstrucaoAoSacado();
        setInstrucaoAoCaixa();
        setSacado();
        setLocalPagamento();
        setDataDocumento();
        setEspecieDoc();
        setAceite();
        setDataProcessamento();
        setSacadorAvalista();
        setCodigoBarra();
        setCarteira();
        setCamposExtra();
        setImagensNosCampos();
    }

    private void setCamposExtra() throws IOException, DocumentException {

        if (isNotNull(boleto.getTextosExtras())) {

            for (String campo : boleto.getTextosExtras().keySet()) {
                form.setField(campo, boleto.getTextosExtras().get(campo));
            }
        }
    }

    private void setCodigoBarra() throws DocumentException {

        // Montando o cdigo de barras.
        BarcodeInter25 barCode = new BarcodeInter25();
        barCode.setCode(boleto.getCodigoDeBarras().write());

        barCode.setExtended(true);
        barCode.setBarHeight(40);
        barCode.setFont(null);
        barCode.setN(3);

        // FICHA DE COMPENSAO
        PdfContentByte cb = null;

        // Verifcando se existe o field(campo) da imagem no template do boleto.
        float posCampoImgLogo[] = form.getFieldPositions("txtFcCodigoBarra");

        if (isNotNull(posCampoImgLogo)) {

            RectanglePDF field = new RectanglePDF(posCampoImgLogo);

            cb = stamper.getOverContent(field.getPage());
            Image imgBarCode = barCode.createImageWithBarcode(cb, null, null);

            PDFUtil.changeField2Image(stamper, field, imgBarCode);
        }
    }

    private void setDataProcessamento() throws IOException, DocumentException {
        form.setField("txtFcDataProcessamento", DateUtil.FORMAT_DD_MM_YYYY.format(boleto.getDataDeProcessamento()));
    }

    private void setAceite() throws IOException, DocumentException {

        if (isNotNull(boleto.getTitulo().getAceite())) {
            form.setField("txtFcAceite", boleto.getTitulo().getAceite().name());
        }
    }

    private void setEspecieDoc() throws IOException, DocumentException {
        if (isNotNull(boleto.getTitulo().getTipoDeDocumento())
                && isNotNull(boleto.getTitulo().getTipoDeDocumento().getSigla())) {
            form.setField("txtFcEspecieDocumento", boleto.getTitulo().getTipoDeDocumento().getSigla());
        }
    }

    private void setDataDocumento() throws IOException, DocumentException {
        form.setField("txtFcDataDocumento",
                DateUtil.FORMAT_DD_MM_YYYY.format(boleto.getTitulo().getDataDoDocumento()));
    }

    private void setLocalPagamento() throws IOException, DocumentException {
        form.setField("txtFcLocalPagamento", (boleto.getLocalPagamento()));
    }

    private void setSacado() throws IOException, DocumentException {

        StringBuilder sb = new StringBuilder();
        Sacado sacado = boleto.getTitulo().getSacado();

        if (isNotNull(sacado.getNome())) {
            sb.append(sacado.getNome());
        }

        if (isNotNull(sacado.getCPRF())) {
            sb.append(", ");

            if (sacado.getCPRF().isFisica()) {
                sb.append("CPF: ");

            } else if (sacado.getCPRF().isJuridica()) {
                sb.append("CNPJ: ");
            }

            sb.append(sacado.getCPRF().getCodigoFormatado());
        }

        form.setField("txtRsSacado", sb.toString());
        form.setField("txtFcSacadoL1", sb.toString());

        // TODO Cdigo em teste
        sb.delete(0, sb.length());
        Endereco endereco = sacado.getEnderecos().iterator().next();

        setEndereco(endereco, "txtFcSacadoL2", "txtFcSacadoL3", sb);
    }

    private void setSacadorAvalista() throws IOException, DocumentException {

        if (boleto.getTitulo().hasSacadorAvalista()) {

            SacadorAvalista sacadorAvalista = boleto.getTitulo().getSacadorAvalista();

            StringBuilder sb = new StringBuilder();

            if (isNotNull(sacadorAvalista.getNome())) {
                sb.append(sacadorAvalista.getNome());
            }

            if (isNotNull(sacadorAvalista.getCPRF())) {

                sb.append(", ");

                if (sacadorAvalista.getCPRF().isFisica()) {
                    sb.append("CPF: ");

                } else if (sacadorAvalista.getCPRF().isJuridica()) {
                    sb.append("CNPJ: ");
                }

                sb.append(sacadorAvalista.getCPRF().getCodigoFormatado());
            }

            form.setField("txtFcSacadorAvalistaL1", sb.toString());

            // TODO Cdigo em teste
            sb.delete(0, sb.length());
            Endereco endereco = sacadorAvalista.getEnderecos().iterator().next();

            setEndereco(endereco, "txtFcSacadorAvalistaL2", "txtFcSacadorAvalistaL3", sb);
        }
    }

    private void setEndereco(Endereco endereco, String campoEndereco1, String campoEndereco2, StringBuilder sb)
            throws IOException, DocumentException {

        if (isNotNull(endereco)) {

            if (isNotNull(endereco.getBairro())) {
                sb.append(endereco.getBairro());
            }

            if (isNotNull(endereco.getLocalidade())) {
                sb.append(HIFEN_SEPERADOR);
                sb.append(endereco.getLocalidade());
            }

            if (isNotNull(endereco.getUF())) {
                sb.append(" / ");
                sb.append(endereco.getUF().getNome());
            }

            form.setField(campoEndereco1, sb.toString());

            sb.delete(0, sb.length());

            if (isNotNull(endereco.getLogradouro())) {
                sb.append(endereco.getLogradouro());
            }

            if (isNotNull(endereco.getNumero())) {
                sb.append(", n: ");
                sb.append(endereco.getNumero());
            }

            if (isNotNull(endereco.getCEP())) {
                sb.append(" ");
                sb.append(HIFEN_SEPERADOR);
                sb.append(" CEP: ");
                sb.append(endereco.getCEP().getCep());
            }

            form.setField(campoEndereco2, sb.toString());
        }
    }

    private void setInstrucaoAoCaixa() throws IOException, DocumentException {

        form.setField("txtFcInstrucaoAoCaixa1", boleto.getInstrucao1());
        form.setField("txtFcInstrucaoAoCaixa2", boleto.getInstrucao2());
        form.setField("txtFcInstrucaoAoCaixa3", boleto.getInstrucao3());
        form.setField("txtFcInstrucaoAoCaixa4", boleto.getInstrucao4());
        form.setField("txtFcInstrucaoAoCaixa5", boleto.getInstrucao5());
        form.setField("txtFcInstrucaoAoCaixa6", boleto.getInstrucao6());
        form.setField("txtFcInstrucaoAoCaixa7", boleto.getInstrucao7());
        form.setField("txtFcInstrucaoAoCaixa8", boleto.getInstrucao8());
    }

    private void setMoraMulta() throws IOException, DocumentException {

        form.setField("txtRsMoraMulta", StringUtils.EMPTY);
        form.setField("txtFcMoraMulta", StringUtils.EMPTY);
    }

    private void setInstrucaoAoSacado() throws IOException, DocumentException {

        form.setField("txtRsInstrucaoAoSacado", boleto.getInstrucaoAoSacado());
    }

    private void setOutroAcrescimo() throws IOException, DocumentException {

        form.setField("txtRsOutroAcrescimo", StringUtils.EMPTY);
        form.setField("txtFcOutroAcrescimo", StringUtils.EMPTY);
    }

    private void setOutraDeducao() throws IOException, DocumentException {

        form.setField("txtRsOutraDeducao", StringUtils.EMPTY);
        form.setField("txtFcOutraDeducao", StringUtils.EMPTY);

    }

    private void setDescontoAbatimento() throws IOException, DocumentException {

        if (isNotNull(boleto.getTitulo().getDesconto())) {

            form.setField("txtRsDescontoAbatimento",
                    MonetaryUtil.FORMAT_REAL.format(boleto.getTitulo().getDesconto()));
            form.setField("txtFcDescontoAbatimento",
                    MonetaryUtil.FORMAT_REAL.format(boleto.getTitulo().getDesconto()));
        }

    }

    private void setValorDocumento() throws IOException, DocumentException {

        form.setField("txtRsValorDocumento", MonetaryUtil.FORMAT_REAL.format(boleto.getTitulo().getValor()));
        form.setField("txtFcValorDocumento", MonetaryUtil.FORMAT_REAL.format(boleto.getTitulo().getValor()));
    }

    private void setDataVencimeto() throws IOException, DocumentException {

        // Obtendo uma string com a data de vencimento formatada 
        // no padro "dd/mm/yyyy".
        // Ex: 03/07/2008.
        String dataFormatada = DateUtil.FORMAT_DD_MM_YYYY.format(boleto.getTitulo().getDataDoVencimento());

        // Realizando a impresso da data de vencimeto no boleto.
        form.setField("txtRsDataVencimento", dataFormatada);
        form.setField("txtFcDataVencimento", dataFormatada);

    }

    private void setAbstractCPRFCedente() throws IOException, DocumentException {

        form.setField("txtRsCpfCnpj", boleto.getTitulo().getCedente().getCPRF().getCodigoFormatado());
    }

    private void setNumeroDocumento() throws IOException, DocumentException {

        form.setField("txtRsNumeroDocumento", boleto.getTitulo().getNumeroDoDocumento());
        form.setField("txtFcNumeroDocumento", boleto.getTitulo().getNumeroDoDocumento());
    }

    private void setCedente() throws IOException, DocumentException {

        form.setField("txtRsCedente", boleto.getTitulo().getCedente().getNome());
        form.setField("txtFcCedente", boleto.getTitulo().getCedente().getNome());
    }

    private void setCarteira() throws IOException, DocumentException {

        Carteira carteira = boleto.getTitulo().getContaBancaria().getCarteira();

        if (isNotNull(carteira) & isNotNull(carteira.getCodigo())) {
            form.setField("txtFcCarteira", carteira.getCodigo().toString());
        }
    }

    private void setQuantidade() throws IOException, DocumentException {

        form.setField("txtRsQuantidade", StringUtils.EMPTY);
        form.setField("txtFcQuantidade", StringUtils.EMPTY);
    }

    private void setEspecie() throws IOException, DocumentException {

        form.setField("txtRsEspecie", boleto.getTitulo().getEnumMoeda().name());
        form.setField("txtFcEspecie", boleto.getTitulo().getEnumMoeda().name());
    }

    private void setLinhaDigitavel() throws DocumentException, IOException {

        form.setField("txtRsLinhaDigitavel", boleto.getLinhaDigitavel().write());
        form.setField("txtFcLinhaDigitavel", boleto.getLinhaDigitavel().write());
    }

    private void setLogoBanco() throws MalformedURLException, IOException, DocumentException {

        // Atravs da conta bancria ser descoberto a imagem que representa o
        // banco, com base
        // no cdigo do banco.
        ContaBancaria conta = boleto.getTitulo().getContaBancaria();
        Image imgLogoBanco = null;

        if (isNotNull(conta.getBanco().getImgLogo())) {

            imgLogoBanco = Image.getInstance(conta.getBanco().getImgLogo(), null);

            setImageLogo(imgLogoBanco);

        } else {

            if (BancoSuportado.isSuportado(conta.getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado())) {

                URL url = new URL("file:///C:/tmp/img/"
                        + conta.getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado() + ".png");

                if (isNotNull(url)) {
                    imgLogoBanco = Image.getInstance(url);
                }

                if (isNotNull(imgLogoBanco)) {

                    // Esta imagem gerada aqui  do tipo java.awt.Image
                    conta.getBanco().setImgLogo(ImageIO.read(url));
                }

                // Se o banco em questo  suportado nativamente pelo
                // componente,
                // ento um alerta ser exibido.
                if (log.isDebugEnabled()) {
                    log.debug("Banco sem imagem da logo informada. "
                            + "Com base no cdigo do banco, uma imagem foi "
                            + "encontrada no resource e est sendo utilizada.");
                }

                setImageLogo(imgLogoBanco);

            } else {

                // Sem imagem, um alerta  exibido.
                log.warn("Banco sem imagem definida. O nome da instituio ser usado como logo.");

                form.setField("txtRsLogoBanco", conta.getBanco().getNome());
                form.setField("txtFcLogoBanco", conta.getBanco().getNome());

            }
        }
    }

    /**
     * <p>
     * Coloca as imagens dos campos no pdf de acordo com o nome dos campos do boleto atribudos no map e templante.
     * </p>
     * 
     * @throws DocumentException
     * @throws IOException 
     * 
     * @since 0.2
     */
    private void setImagensNosCampos() throws DocumentException, IOException {

        if (isNotNull(boleto.getImagensExtras())) {

            for (String campo : boleto.getImagensExtras().keySet()) {
                setImagemNoCampo(campo, Image.getInstance(boleto.getImagensExtras().get(campo), null));
            }
        }
    }

    /**
     * <p>
     * Coloca uma imagem no pdf de acordo com o nome do field no templante.
     * </p>
     * 
     * @param nomeDoCampo
     * @param imagem
     * @throws DocumentException
     * 
     * @since 0.2
     */
    private void setImagemNoCampo(String nomeDoCampo, Image imagem) throws DocumentException {

        float posCampoImgLogo[];

        if (StringUtils.isNotBlank(nomeDoCampo)) {

            posCampoImgLogo = form.getFieldPositions(nomeDoCampo);

            if (isNotNull(posCampoImgLogo)) {
                PDFUtil.changeField2Image(stamper, posCampoImgLogo, imagem);
            }
        }
    }

    /**
     * <p>
     * Coloca a logo do passada na ficha de compensao do boleto e no recibo do
     * sacado.
     * </p>
     * 
     * @param imgLogoBanco
     * @throws DocumentException
     * 
     * @since 0.2
     */
    private void setImageLogo(Image imgLogoBanco) throws DocumentException {

        // RECIBO DO SACADO
        setImagemNoCampo("txtRsLogoBanco", imgLogoBanco);

        // FICHA DE COMPENSAO
        setImagemNoCampo("txtFcLogoBanco", imgLogoBanco);
    }

    private void setCodigoBanco() throws IOException, DocumentException {

        ContaBancaria conta = boleto.getTitulo().getContaBancaria();

        String codigoCompensacao = conta.getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado();
        String digitoCompensacao = conta.getBanco().getCodigoDeCompensacaoBACEN().getDigito().toString();

        form.setField("txtRsCodBanco", codigoCompensacao + HIFEN_SEPERADOR + digitoCompensacao);
        form.setField("txtFcCodBanco", codigoCompensacao + HIFEN_SEPERADOR + digitoCompensacao);
    }

    private void setAgenciaCondigoCedente() throws IOException, DocumentException {

        StringBuilder sb = new StringBuilder(StringUtils.EMPTY);
        ContaBancaria conta = boleto.getTitulo().getContaBancaria();

        if (isNotNull(conta.getAgencia())) {
            if (isNotNull(conta.getAgencia().getCodigo()))
                sb.append(conta.getAgencia().getCodigo());

            if (isNotNull(conta.getAgencia().getDigitoVerificador())
                    && StringUtils.isNotBlank(conta.getAgencia().getDigitoVerificador().toString())) {

                sb.append(HIFEN_SEPERADOR);
                sb.append(conta.getAgencia().getDigitoVerificador());
            }
        }

        if (isNotNull(conta.getNumeroDaConta().getCodigoDaConta())) {

            sb.append(" / ");

            sb.append(conta.getNumeroDaConta().getCodigoDaConta());

            if (isNotNull(conta.getNumeroDaConta().getDigitoDaConta())) {

                sb.append(HIFEN_SEPERADOR);
                sb.append(conta.getNumeroDaConta().getDigitoDaConta());
            }
        }

        form.setField("txtRsAgenciaCodigoCedente", sb.toString());
        form.setField("txtFcAgenciaCodigoCedente", sb.toString());
    }

    private void setNossoNumero() throws IOException, DocumentException {

        StringBuilder sb = new StringBuilder(StringUtils.EMPTY);

        if (isNotNull(boleto.getTitulo().getNossoNumero())) {
            sb.append(boleto.getTitulo().getNossoNumero());
        }

        if (isNotNull(boleto.getTitulo().getDigitoDoNossoNumero())) {
            sb.append(HIFEN_SEPERADOR + boleto.getTitulo().getDigitoDoNossoNumero());
        }

        form.setField("txtRsNossoNumero", sb.toString());
        form.setField("txtFcNossoNumero", sb.toString());
    }

    /**
     * Exibe os valores de instncia.
     * 
     * @see br.com.nordestefomento.jrimum.utilix.ObjectUtil#toString()
     */
    @Override
    public String toString() {

        ToStringBuilder tsb = new ToStringBuilder(this);

        tsb.append(boleto);

        return tsb.toString();
    }
}