Java tutorial
/* * 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.guia; 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.guia.BancoSuportado; import br.com.nordestefomento.jrimum.bopepo.guia.Guia; import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.guia.Convenio; import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.guia.OrgaoRecebedor; import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.guia.TipoValorReferencia; 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 misael * * @since 0.3 * * @version 0.3 */ 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 = ViewerPDF.class.getResource("/pdf/GuiaTemplate.pdf"); private static URL TEMPLATE_PADRAO_SEM_BANCO = ViewerPDF.class.getResource("/pdf/GuiaTemplateSemBanco.pdf"); private PdfReader reader; private PdfStamper stamper; private AcroFields form; private ByteArrayOutputStream outputStream; private Guia guia; private File template; /** *<p> * Para uso interno do componente * </p> */ ViewerPDF() { } ViewerPDF(Guia guia) { this.guia = guia; } ViewerPDF(Guia guia, File template) { this.guia = guia; setTemplate(template); } /** * <p> * SOBRE O MTODO * </p> * * @param pathName * arquivo de destino * @param guias * a serem agrupados * @param guiaViewer * visualizador * * @return File contendo guias geradas. * * @throws JRimumException * Quando ocorrer um problema na gerao do PDF que est fora do * controle da biblioteca. * * @since 0.3 */ protected static File groupInOnePDF(String pathName, List<Guia> guias, GuiaViewer guiaViewer) { File arq = null; List<byte[]> guiasEmBytes = new ArrayList<byte[]>(guias.size()); for (Guia guia : guias) { guiasEmBytes.add(guiaViewer.setGuia(guia).getPdfAsByteArray()); } try { arq = FileUtil.bytes2File(pathName, PDFUtil.mergeFiles(guiasEmBytes)); } 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 guias * @return List<File> com os boletos gerados. * * @since 0.2 */ protected static List<File> onePerPDF(String path, String extensao, List<Guia> guias) { List<File> arquivos = new ArrayList<File>(guias.size()); int cont = 1; for (Guia guia : guias) { arquivos.add(new GuiaViewer(guia).getPdfAsFile(path + "Guia" + 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 Guia getGuia() { return this.guia; } /** * <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 (isNotNull(guia.getArrecadacao().getConvenio()) && isNotNull(guia.getArrecadacao().getConvenio().getBanco())) { templateFromResource = TEMPLATE_PADRAO; } else { templateFromResource = TEMPLATE_PADRAO_SEM_BANCO; } 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(); setLogoOrgaoRecebedor(); setContribuinteNome(); setContribuinteCPF(); setDescricao(); setTitulo(); setNossoNumero(); setValorDocumento(); setDataDocumento(); setDataVencimeto(); setInstrucaoAoCaixa(); setLinhaDigitavel(); setCodigoBarra(); setCamposExtra(); setImagensNosCampos(); } private void setCamposExtra() throws IOException, DocumentException { if (isNotNull(guia.getTextosExtras())) { for (String campo : guia.getTextosExtras().keySet()) { form.setField(campo, guia.getTextosExtras().get(campo)); } } } private void setCodigoBarra() throws DocumentException { // Montando o cdigo de barras. BarcodeInter25 barCode = new BarcodeInter25(); barCode.setCode(guia.getCodigoDeBarras().write()); barCode.setExtended(true); barCode.setBarHeight(40); barCode.setFont(null); barCode.setN(3); PdfContentByte cb = null; // Verifcando se existe o field(campo) da imagem no template do boleto. float posCampoImgLogo[] = form.getFieldPositions("txtCodigoBarra"); 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 setDataDocumento() throws IOException, DocumentException { form.setField("txtDataDocumento", DateUtil.FORMAT_DD_MM_YYYY.format(guia.getArrecadacao().getDataDoDocumento())); } private void setInstrucaoAoCaixa() throws IOException, DocumentException { form.setField("txtInstrucaoAoCaixa1", guia.getInstrucaoAoCaixa1()); form.setField("txtInstrucaoAoCaixa2", guia.getInstrucaoAoCaixa2()); form.setField("txtInstrucaoAoCaixa3", guia.getInstrucaoAoCaixa3()); } private void setValorDocumento() throws IOException, DocumentException { String valorStr = null; if ((guia.getArrecadacao() .getTipoValorReferencia() == TipoValorReferencia.VALOR_COBRADO_EM_REAL_COM_DV_MODULO_10) || (guia.getArrecadacao() .getTipoValorReferencia() == TipoValorReferencia.VALOR_COBRADO_EM_REAL_COM_DV_MODULO_11)) { valorStr = MonetaryUtil.FORMAT_REAL_COM_PREFIXO.format(guia.getArrecadacao().getValorDocumento()); } else { valorStr = MonetaryUtil.FORMAT_REAL.format(guia.getArrecadacao().getValorDocumento()); } form.setField("txtValorDocumento1", valorStr); form.setField("txtValorDocumento2", valorStr); form.setField("txtValorDocumento3", valorStr); } 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(guia.getArrecadacao().getDataDoVencimento()); form.setField("txtDataVencimento", dataFormatada); form.setField("txtDataVencimento1", dataFormatada); form.setField("txtDataVencimento2", dataFormatada); form.setField("txtDataVencimento3", dataFormatada); } private void setContribuinteNome() throws IOException, DocumentException { form.setField("txtContribuinteNome", guia.getArrecadacao().getContribuinte().getNome()); } private void setContribuinteCPF() throws IOException, DocumentException { form.setField("txtContribuinteCPF", guia.getArrecadacao().getContribuinte().getCPF().getCodigoFormatado()); } private void setDescricao() throws IOException, DocumentException { form.setField("txtDescricao", guia.getArrecadacao().getDescricao()); } private void setTitulo() throws IOException, DocumentException { form.setField("txtTitulo", guia.getArrecadacao().getTitulo()); } private void setLinhaDigitavel() throws DocumentException, IOException { form.setField("txtLinhaDigitavel", guia.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. Convenio convenio = guia.getArrecadacao().getConvenio(); Image imgLogoBanco = null; // Se h um banco especificado... if (isNotNull(convenio) && isNotNull(convenio.getBanco())) { if (isNotNull(convenio.getBanco().getImgLogo())) { imgLogoBanco = Image.getInstance(convenio.getBanco().getImgLogo(), null); setImageLogo(imgLogoBanco); } else { if (BancoSuportado .isSuportado(convenio.getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado())) { URL url = new URL("file:///C:/tmp/img/" + convenio.getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado() + ".png"); if (isNotNull(url)) { imgLogoBanco = Image.getInstance(url); } if (isNotNull(imgLogoBanco)) { // Esta imagem gerada aqui do tipo java.awt.Image convenio.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("txtLogoBanco", convenio.getBanco().getNome()); } } } } private void setLogoOrgaoRecebedor() throws MalformedURLException, IOException, DocumentException { Image imgLogoBanco = null; OrgaoRecebedor orgaoRecebedor = guia.getArrecadacao().getOrgaoRecebedor(); if (isNotNull(orgaoRecebedor.getImgLogo())) { imgLogoBanco = Image.getInstance(orgaoRecebedor.getImgLogo(), null); setImagemNoCampo("txtLogoOrgaoRecebedor1", imgLogoBanco); setImagemNoCampo("txtLogoOrgaoRecebedor2", imgLogoBanco); } } /** * <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(guia.getImagensExtras())) { for (String campo : guia.getImagensExtras().keySet()) { setImagemNoCampo(campo, Image.getInstance(guia.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 { setImagemNoCampo("txtLogoBanco", imgLogoBanco); } private void setNossoNumero() throws IOException, DocumentException { form.setField("txtNossoNumero", guia.getArrecadacao().getNossoNumero()); } /** * Exibe os valores de instncia. * * @see br.com.nordestefomento.jrimum.utilix.ObjectUtil#toString() */ @Override public String toString() { ToStringBuilder tsb = new ToStringBuilder(this); tsb.append(guia); return tsb.toString(); } }