• Prezados usuários,

    Por questões de segurança, a partir de 22/04/2024 os usuários só conseguirão logar no fórum se estiverem com a "Verificação em duas etapas" habilitada em seu perfil.

    Para habilitar a "Verificação em duas etapas" entre em sua conta e "Click" em seu nick name na parte superior da página, aparecerá opções de gestão de sua conta, entre em "Senha e segurança", a primeira opção será para habilitar a "Verificação em duas etapas".

    Clicando alí vai pedir a sua senha de acesso ao fórum, e depois vai para as opções de verificação, que serão as seguintes:

    ***Código de verificação via aplicativo*** >>>Isso permite que você gere um código de verificação usando um aplicativo em seu telefone.

    ***Email de confirmação*** >>>Isso enviará um código por e-mail para verificar seu login.

    ***Códigos alternativos*** >>>Esses códigos podem ser usados para fazer login se você não tiver acesso a outros métodos de verificação.

    Existe as 3 opções acima, e para continuar acessando o fórum a partir de 22/04/2024 você deverá habilitar uma das 03 opções.

    Tópico para tirar dúvidas>>>>https://forum.adrenaline.com.br/threads/obrigatoriedade-da-verificacao-em-duas-etapas-a-partir-de-24-04-2024-duvidas.712290/

    Atencionamente,

    Administração do Fórum Adrenaline

[AJUDA] Geração de arquivo PDF em Java - alinhamento dos elementos!

timrgt

know-it-all Member
Registrado
Boa noite galera!

Seguinte, to desenvolvendo um projeto pra facul o qual basicamente gera um certificado (os alunos tem que frequentar os eventos promovidos pela faculdade, ganhando pontos para cada evento participado. O aluno precisa ter no mínimo 270 pontos para poder fazer o trabalho de graduação, e o certificado é justamente pros que obtem no minimo os 270 pontos). Foi passado um modelo de design, o qual estou tentando seguir o mais fielmente possível. Inicialmente a professora disse que poderíamos gerar arquivos HTML, mas preferi gerar em PDF (até por já ter mexido um pouco com isso no curso técnico). Pois bem, consegui adicionar todas as informações que desejava, porém não estou conseguindo alinhar tudo certinho. A ideia é deixar o texto todo centralizado. Alguns elementos consegui por usar objetos do tipo Paragraph, porém como algumas sentenças tinham 2 formatações diferentes na mesma sentença, fui obrigado a usar objetos do tipo Phrase. Porém, não há métodos para alinhar esses objetos, e se concateno dois objetos do tipo Phrase em um objeto do tipo Paragraph, ficam colchetes delimitando cada frase.

Alguém aí tem alguma luz pra resolver isso??

Obrigado desde já! :joia:
 
Fica dificil te ajudar sem falar o que tas usando!!!

Eu gerava relatórios usando jasper + ireport.

Hj em dia faço meu relatórios no word, salvo em rtf e depois gero o oracle BI.

Tem muita forma de gerar relatórios, portanto fica dificil te ajudar se tu não falar quais tecnologias tas usando.
 
Pra fazer isso q tu falou o jeito mais fácil vai ser usando o iReport.
 
Ah sim, erro meu

To usando o iText pra gerar, já tinha alguns exemplos salvos aqui e pra mim foi mais fácil pra começar a gerar assim, mas essas limitações chatas tão irritando

iReport seria melhor então?

A propósito, o sistema é web e estou usando servlets (obrigatório). Eu criei uma servlet que faz o tratamento dos dados e chama a classe que gera o PDF, que é uma classe Java normal

Aí vai o trecho de código que gera o PDF:
Código:
try{
                  if(alunoDAO.aluno.getTurno().equals("m")){   
                      periodo="Manhã";
                  } else  if(alunoDAO.aluno.getTurno().equals("v")){
                      periodo="Vespertino";
                  }  else  if(alunoDAO.aluno.getTurno().equals("n")){
                      periodo="Noturno";
                  }
                  caminho="C:/Users/Ronnye/Desktop/"+ r+".pdf";
                  PdfWriter.getInstance(document,new FileOutputStream(caminho));
                  Image png=Image.getInstance("C:/Users/Ronnye/Documents/NetBeansProjects/projetoInterdisciplinar/logo fatec.png");
                  png.setAlignment(Element.ALIGN_CENTER);
                  document.open();
                  document.add(png);
                  document.add(new Paragraph(" "));
                  
                  Font f1=new Font(Font.HELVETICA,40,Font.BOLD);
                  Paragraph p1=new Paragraph("Certificado",f1);
                  p1.setAlignment(Element.ALIGN_CENTER);
                  document.add(p1);
                  
                  document.add(new Paragraph(" "));
                  Font f2=new Font(Font.HELVETICA,14);
                  Paragraph p2=new Paragraph("Certificamos que o aluno(a) \n",f2);
                  p2.setAlignment(Element.ALIGN_CENTER);
                  document.add(p2);
                  
                  Font f3=new Font(Font.HELVETICA,14,Font.BOLD);
                  Paragraph p3=new Paragraph(alunoDAO.aluno.getNome()+", "+alunoDAO.aluno.getRA()+",",f3);
                  p3.setAlignment(Element.ALIGN_CENTER);
                  document.add(p3);
                  
                   //adiciona as frases
                    Phrase p4=new Phrase(" matriculado(a) no curso de ",f2);
                    
                    Phrase p5=new Phrase(alunoDAO.aluno.getNomeCurso()+", ",f3);
                    
                    
                    document.add(p4);
                    document.add(p5);
                    
                    
                   
                    
                    Phrase p7=new Phrase("período ",f2);
                    
                    document.add(p7);  
                    
                    Phrase p8=new Phrase(periodo+", ",f3);
                     
                    document.add(p8);
                    
                    
                   Paragraph p9=new Paragraph( "participou de eventos realizados pela Faculdade de Tecnologia de Indaiatuba, ",f2);
                    p9.setAlignment(Element.ALIGN_CENTER);
                    document.add(p9);
                    
                  
                     Phrase p10=new Phrase("com total de ",f2);
                     document.add(p10);
                    Phrase p11=new Phrase(""+alunoDAO.aluno.getNumPontos(),f3);
                    
                    document.add(p11);
                    
                     Phrase p12=new Phrase(" pontos.",f2);
                   
                    document.add(p12);
           
                     
                  document.add(new Paragraph(" "));
                  document.add(new Paragraph("Indaiatuba, "+dateFormat.format(date)));
                  document.add(new Paragraph(" "));
                  document.add(new Paragraph("__________________________________________________\n"));
                  
                  Font f4=new Font(Font.HELVETICA,14, Font.BOLD);
                  Paragraph p13=new Paragraph("Prof. Ms. Jaime Cazuhiro Ossada\n"+
                  "Coordenador do curso de Tecnologia em Redes de Computadores",f4);
                  p13.setAlignment(Element.ALIGN_CENTER);
                  document.add(p13);
                  document.setPageSize(png);
                  
              
                  
                }
               catch(DocumentException de){
                 de.printStackTrace();
                }
               catch(IOException e){
                 e.printStackTrace();
              }

Observem que criei várias formatações de fontes diferentes. Os objetos alunoDAO contém os dados buscados do banco de dados para serem inseridos no PDF
 
Última edição:
Dá uma olhada no iReport. Se interessar eu te passo um exemplo de servlet que chama o relatório iReport.
 
Dá uma olhada no iReport. Se interessar eu te passo um exemplo de servlet que chama o relatório iReport.

Por favor, se puder mandar o exemplo agradeço!Instalei ele aqui no netbeans e dei uma mexida, a parte de montar o template não parece difícil, mas complica na hora de o servlet chamar e gerar o arquivo

Vou te mandar uma MP com meu email
------------
Incrível como tem hora que o negócio é tão simples que a gente não enxerga :facepalm:
Eu tava pesquisando como mexer com o iReport, até tava montando um projeto usando ele pra testar, quando me veio "a luz da razão", dei uma olhada melhor num exemplo usando iText que tava aberto aqui e veio a solução...simplesmente fiz isso:
Código:
Phrase p4=new Phrase(" matriculado(a) no curso de ",f2);
                    
                    Phrase p5=new Phrase(alunoDAO.aluno.getNomeCurso()+", ",f3);
                    
                    Paragraph lol=new Paragraph(p4);
                
                    
                    Phrase p7=new Phrase("período ",f2);
                    
                     
                    
                    Phrase p8=new Phrase(periodo+", ",f3);
                     
                    
                    lol.add(p5);
                    lol.add(p7);
                    lol.add(p8);
                    lol.setAlignment(Element.ALIGN_CENTER);

Estou decepcionado comigo mesmo, pulta negócio simples e tava quebrando a cabeça à toa aqui :poker:
------------
Agora tô com outro problema: acentuação. No banco já alterei o charset pra latin1, mas no PDF a acentuação sai toda zuada. Como faço pra alterar o charset na classe Java? Pesquisei mas não achei nada que desse pra usar no meu caso, o que achei foi mais pra páginas JSP :nooo:
 
Última edição:
ô colega... tu mandou a MP e eu esqueci de mandar... segue o trecho de código que interessa:

Código:
                Connection connection = null;
		try {
			connection = dataSource.getConnection();
			
			String reportName = request.getParameter("report");
			String caminhoRelatorio = getCaminhoReports(request)+File.separatorChar+reportName+".jasper";
			
			Map<String, String> param = new HashMap<String, String>();
			
			for (Object key : request.getParameterMap().keySet()) {
				String chave = (String) key;
				if (!chave.equalsIgnoreCase("report") && !chave.equalsIgnoreCase("m")) {
					param.put(chave, request.getParameter(chave));
				}
			}
			
			JasperPrint sJrPrint = JasperFillManager.fillReport(caminhoRelatorio, param, connection);
			byte[] retorno = JasperExportManager.exportReportToPdf(sJrPrint);
			connection.close();
			
			response.setStatus(HttpServletResponse.SC_OK);
			response.setContentType("application/pdf");
			response.setContentLength(retorno.length);
			response.getOutputStream().write(retorno);
		}catch (Exception e) {
			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
			e.printStackTrace(new PrintStream(response.getOutputStream()));
		}

Ou, o código completo (usando framework Spring):

Classe ReportServlet:
Código:
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;

import AbstractServlet;


public class ReportServlet extends AbstractServlet {
	private static final long serialVersionUID = 1839873726028221194L;
	
	private DataSource dataSource;
	@Autowired
	public final void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
	}
	
	private String getCaminhoReports(HttpServletRequest request) {
		return request.getRealPath("reports");
	}
	
	public void relatorioJdbcGenerico(HttpServletRequest request, HttpServletResponse response) throws IOException {
		Connection connection = null;
		try {
			connection = dataSource.getConnection();
			
			String reportName = request.getParameter("report");
			String caminhoRelatorio = getCaminhoReports(request)+File.separatorChar+reportName+".jasper";
			
			Map<String, String> param = new HashMap<String, String>();
			
			for (Object key : request.getParameterMap().keySet()) {
				String chave = (String) key;
				if (!chave.equalsIgnoreCase("report") && !chave.equalsIgnoreCase("m")) {
					param.put(chave, request.getParameter(chave));
				}
			}
			
			JasperPrint sJrPrint = JasperFillManager.fillReport(caminhoRelatorio, param, connection);
			byte[] retorno = JasperExportManager.exportReportToPdf(sJrPrint);
			connection.close();
			
			response.setStatus(HttpServletResponse.SC_OK);
			response.setContentType("application/pdf");
			response.setContentLength(retorno.length);
			response.getOutputStream().write(retorno);
		}catch (Exception e) {
			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
			e.printStackTrace(new PrintStream(response.getOutputStream()));
		}
	}
}

Classe AbstractServlet:

Código:
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public abstract class AbstractServlet extends HttpServlet {
	private static final long serialVersionUID = -5841272224190616241L;
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			String metodo = request.getParameter("m");
			Method m = this.getClass().getMethod(metodo, HttpServletRequest.class, HttpServletResponse.class);
			m.invoke(this, request, response);
		}catch (Throwable e) {
			if (e instanceof InvocationTargetException || e instanceof NoSuchMethodException || e instanceof NoSuchMethodError) {
				response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
				response.getOutputStream().write("Um método válido não foi informado!".getBytes());
			}else {
				response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
			}
			e.printStackTrace();
		}
	}
}
------------
Agora tô com outro problema: acentuação. No banco já alterei o charset pra latin1, mas no PDF a acentuação sai toda zuada. Como faço pra alterar o charset na classe Java? Pesquisei mas não achei nada que desse pra usar no meu caso, o que achei foi mais pra páginas JSP :nooo:

O charset da classe Java, no Eclipse, vc define clicando com o botão direito e indo em properties. (Falando do Eclipse... Use-o. É a melhor IDE já feita pela humanidade. :haha: Tá certo... sou suspeito pra falar, mas o Eclipse é foda). No Netbeans não sei.

Um outro meio de resolver isso seria usando o UTF-8 como charset.
 
Última edição:
ô colega... tu mandou a MP e eu esqueci de mandar... segue o trecho de código que interessa:

Código:
                Connection connection = null;
        try {
            connection = dataSource.getConnection();
            
            String reportName = request.getParameter("report");
            String caminhoRelatorio = getCaminhoReports(request)+File.separatorChar+reportName+".jasper";
            
            Map<String, String> param = new HashMap<String, String>();
            
            for (Object key : request.getParameterMap().keySet()) {
                String chave = (String) key;
                if (!chave.equalsIgnoreCase("report") && !chave.equalsIgnoreCase("m")) {
                    param.put(chave, request.getParameter(chave));
                }
            }
            
            JasperPrint sJrPrint = JasperFillManager.fillReport(caminhoRelatorio, param, connection);
            byte[] retorno = JasperExportManager.exportReportToPdf(sJrPrint);
            connection.close();
            
            response.setStatus(HttpServletResponse.SC_OK);
            response.setContentType("application/pdf");
            response.setContentLength(retorno.length);
            response.getOutputStream().write(retorno);
        }catch (Exception e) {
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            e.printStackTrace(new PrintStream(response.getOutputStream()));
        }

Ou, o código completo (usando framework Spring):

Classe ReportServlet:
Código:
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;

import AbstractServlet;


public class ReportServlet extends AbstractServlet {
    private static final long serialVersionUID = 1839873726028221194L;
    
    private DataSource dataSource;
    @Autowired
    public final void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
    }
    
    private String getCaminhoReports(HttpServletRequest request) {
        return request.getRealPath("reports");
    }
    
    public void relatorioJdbcGenerico(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
            
            String reportName = request.getParameter("report");
            String caminhoRelatorio = getCaminhoReports(request)+File.separatorChar+reportName+".jasper";
            
            Map<String, String> param = new HashMap<String, String>();
            
            for (Object key : request.getParameterMap().keySet()) {
                String chave = (String) key;
                if (!chave.equalsIgnoreCase("report") && !chave.equalsIgnoreCase("m")) {
                    param.put(chave, request.getParameter(chave));
                }
            }
            
            JasperPrint sJrPrint = JasperFillManager.fillReport(caminhoRelatorio, param, connection);
            byte[] retorno = JasperExportManager.exportReportToPdf(sJrPrint);
            connection.close();
            
            response.setStatus(HttpServletResponse.SC_OK);
            response.setContentType("application/pdf");
            response.setContentLength(retorno.length);
            response.getOutputStream().write(retorno);
        }catch (Exception e) {
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            e.printStackTrace(new PrintStream(response.getOutputStream()));
        }
    }
}

Classe AbstractServlet:

Código:
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public abstract class AbstractServlet extends HttpServlet {
    private static final long serialVersionUID = -5841272224190616241L;
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            String metodo = request.getParameter("m");
            Method m = this.getClass().getMethod(metodo, HttpServletRequest.class, HttpServletResponse.class);
            m.invoke(this, request, response);
        }catch (Throwable e) {
            if (e instanceof InvocationTargetException || e instanceof NoSuchMethodException || e instanceof NoSuchMethodError) {
                response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                response.getOutputStream().write("Um método válido não foi informado!".getBytes());
            }else {
                response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            }
            e.printStackTrace();
        }
    }
}
------------


O charset da classe Java, no Eclipse, vc define clicando com o botão direito e indo em properties. (Falando do Eclipse... Use-o. É a melhor IDE já feita pela humanidade. :haha: Tá certo... sou suspeito pra falar, mas o Eclipse é foda). No Netbeans não sei.

Um outro meio de resolver isso seria usando o UTF-8 como charset.

Valeu cara!
Consegui resolver, eu criei várias frases com as formatações que eu queria e adicionei num parágrafo, aí deu certo!
Até tentei usar o JasperReport, tava olhando um tuto mas ia ter que mudar bastante coisa e não ia dar tempo

Sobre o charset, tava dando bug no banco...se eu fizesse a select no console do MySQL, aparecia os caracteres errados, mas no PDF saía certo...daí inseri os dados pelo console e ficou certo, mas aí no PDF saía errado, ou seja, ficou o inverso...eu deletei o banco, criei de novo com o charset UTF-8 e inseri os dados, aí deu certo, ficou aparecendo corretamente tanto no MySQL quanto no PDF. Em todas as classes/páginas/servlets tava definido como UTF-8 já.

Eu usava o eclipse também, mas aí pra mexer com servlets o NetBeans é mais fácil, muita coisa ele já gera e tal, facilita muito...no eclipse teria que configurar umas coisas e ia dar mais trabalho :haha:

eclipse vs. NetBeans é uma disputa tipo Apple vs. Microsoft, sempre vai ter alguém defendendo com unhas e dentes um ou outro. O NetBeans tem várias facilidades, mas tem que configurar certinho pra não pesar na memória, coisa que não fiz ainda...eclipse é mais leve, e parece rodar mais rápido também. Sem falar no Glassfish(servidor web que vem com o NetBeans) que só ele come 400mb de RAM quando startado :vish:

Mas mesmo assim muito obrigado pela atenção e pela ajuda cara, talvez role de dar uns ups nesse sistema que eu fiz :awesome:

E bora apresentar o sistema amanhã (hoje na verdade) :vish:
 
Esse é o problema do Netbeans... gerar coisas. Isso deixa o programador preguiçoso. Programação é como matemática: você só fica bom se exercitar bastante.
 
Esse é o problema do Netbeans... gerar coisas. Isso deixa o programador preguiçoso. Programação é como matemática: você só fica bom se exercitar bastante.

Se formos seguir tua logica não podemos usar framework pq o programador vai ficar preguiçoso.

Na verdade acho até improdutivo perder tempo criando algo que a ferramenta faz em poucos segundos.

É melhor perder tempo exercitando a parte lógica do que ficar escrevendo código que não exercita nada.
 
Sei lá ,acho que para aprendizado vale a pena criar as coisas na mão, que aí dá pra pegar bem o conceito. Facul mesmo, disciplina de estrutura de dados, fizemos na mão listas encadeadas, vetores, etc. Mas em Java isso tem implementação pronta. Agora, em se tratando de atividade profissional, é muito melhor usar essas implementações prontas, já que poupa bastante tempo, principalmente na correção de possíveis erros. Claro que tem que saber usar também, não é só gerar lá e pronto.

Com relação ao que falei que NetBeans gera, no caso dos servlets é preciso mexer com arquivos xml. O NetBeans já faz isso pra gente, e aí temos o trabalho de programar no servlet somente.
 

Users who are viewing this thread

Voltar
Topo