Pessoal,
Como faço para mandar um relatório do Jasper Reports direto pra impressão, sem aparecer o relatório na tela ou a janela de impressão do Windows?
[]'s
Pessoal,
Como faço para mandar um relatório do Jasper Reports direto pra impressão, sem aparecer o relatório na tela ou a janela de impressão do Windows?
[]'s
JasperPrintManager.printPage(jasperPrint, 0, true);
Testei dessa forma e mesmo assim apareceu a tela de impressão do Windows. 
Já resolvi, era só trocar true por false :thumbup:
Grato!
valeu pela dica
:lol:
Desta forma pelo que entendi vai mandar para a impressora default, como faço para setar o “path” da impressora ?
Para constar,
Resolvi assim :
private void printDirectlyToPrinter(String printerName,JasperPrint jasperPrint)
{
try {
//Lista todas impressoras até encontrar a enviada por parametro
PrintService serviceFound = null;
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
for(PrintService service:services){
if(service.getName().trim().equals(printerName.trim()))
serviceFound = service;
}
if (serviceFound == null)
throw new NegocioException("Impressora não encontrada !");
JRExporter exporter = new JRPrintServiceExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, serviceFound.getAttributes());
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG, Boolean.FALSE);
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.FALSE);
exporter.exportReport();
//JasperPrintManager.printPage(jasperPrint, 0, false);
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
JasperReport:
a) - Visualizar a pagina
JasperViewer.viewReport(jasperPrint, false);
b) - Direto para impressora
JasperPrintManager.printPage(jasperPrint, 0, false);
Falou
é possível em um projeto Web ? Esse comando era imprimir no servidor, correto ?
ola
esse script serve para desktop, em web (a linha que envia os dados direto para impressora, acredito que seria com um applet)
humm!
vou verificar!
valeu
import javax.swing.JApplet;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;
import java.io.;
import javax.swing.;
public class impressodir extends JApplet {
public void init() {
String impna = "PRN";
try {
String dadosw = getParameter("dadosApplet"); //--- recupera dados
PrintWriter pw = new PrintWriter(new FileOutputStream(impna));
pw.println(dadosw);
pw.close();
} catch (Exception p) {
p.printStackTrace();
}
}
}
----------------------------- assinando a applet.jar ------------------
del impressodir.jar
jar cvf impressodir.jar *.class
keytool -genkey -dname “cn=impressodir, ou=SeuNome, o=EmpresaTall, c=BR” -alias Impralias -storepass 123456 -validity 3655
jarsigner -storepass 123456 impressodir.jar Impralias
----------------------------- abrir minha applet ------------------------ com minha jsp -----------
<APPLET codebase="." archive="impressodir.jar" code="impressodir" width=300 height=2 alt="Impressao Invalida !"> <PARAM name="dadosApplet" VALUE="<%out.print(dadosw);%>"> </APPLET>
----------------------------- colocar tudo na mesma pasta … jar, jsp eu coloquei ate a class … e estou utilizando …
espero que ajude
t+ :lol:
e se for um pdf ?
Cara vc sabe se é possivel a applet apos execução de determinada ação fechar o navegador? Por exemplo, eu fiz uma applet de impressão direta, e gostaria q apos a impressao ela fosse fechada !!! tem como ?
TEnte fechar com javascript
javascript:parent.close();
Mas eu so posso fechar apos a impressao, eu ouvi falar que existe um modo da applet executar o java script da página, so nao sei como !!!
veja o link tem um exemplo rodando
http://www.raditha.com/java/mayscript.php
como fez a impressão? pode postar o código, ou pelo menos uma parte ?
Então Vinicius a primeira parte fiz o seguinte, enviei o xml do relatorio (oque é gerado pelo Ireport), por parametro e tambem o resultset por parametro. Mas o result set fiz uma classe que faz a conversão dele para XML. Assim:
public String cachedRowSetToXml(CachedRowSetImpl crs) throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element results = doc.createElement("Results");
doc.appendChild(results);
ResultSetMetaData rsmd = crs.getMetaData();
int colCount = rsmd.getColumnCount();
if(colCount > 0){
Element metadata = doc.createElement("Metadata");
results.appendChild(metadata);
for(int j=1; j<=colCount; j++){
Element node = doc.createElement(rsmd.getColumnName(j));
node.setAttribute("type", String.valueOf(rsmd.getColumnType(j)));
metadata.appendChild(node);
}
while (crs.next()) {
Element row = doc.createElement("Row");
results.appendChild(row);
for (int i = 1; i <= colCount; i++) {
Object value = crs.getObject(i);
Element node = doc.createElement(rsmd.getColumnName(i));
node.appendChild(doc.createTextNode((value == null ? "" : value.toString())));
row.appendChild(node);
}
}
}
DOMSource domSource = new DOMSource(doc);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
StringWriter sw = new StringWriter();
StreamResult sr = new StreamResult(sw);
transformer.transform(domSource, sr);
return sw.toString();
}
Na applet eu faço o caminho inverso com esse XML gerado através de CachedRowSet. Assim :
private CachedRowSetImpl xmlToCachedRowSet(String xml) throws Exception{
CachedRowSetImpl crs = new CachedRowSetImpl();
RowSetMetaData rsmd = new RowSetMetaDataImpl();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new ByteArrayInputStream(xml.getBytes("ISO-8859-1")));
Element elem = doc.getDocumentElement();
//verifica se xml é de erro ou vazio
if(elem.getTagName().equalsIgnoreCase("Error")){
throw new Exception("IntegrateService: "+elem.getTextContent());
}
else if(elem.getTagName().equalsIgnoreCase("Empty")){
return crs;
}
NodeList nl = elem.getElementsByTagName("Row");
NodeList metaList = elem.getElementsByTagName("Metadata");
//monta o metada do CachedRowSet
if(metaList.getLength() > 0){
NodeList metaNodeList = metaList.item(0).getChildNodes();
rsmd.setColumnCount(metaNodeList.getLength());
for(int x=0; x<metaNodeList.getLength(); x++){
Element dt = (Element) metaNodeList.item(x);
rsmd.setColumnLabel(x+1, dt.getTagName());
rsmd.setColumnName(x+1, dt.getTagName());
rsmd.setColumnType(x+1, Integer.parseInt(dt.getAttribute("type")));
}
crs.setMetaData(rsmd);
}
//Monta os dados do CachedRowSet
for(int i=0; i><nl.getLength(); i++) {
NodeList cList = nl.item(i).getChildNodes();
crs.moveToInsertRow();
for(int y=0; y><cList.getLength(); y++){
Element data = (Element)cList.item(y);
int type = rsmd.getColumnType(y+1);
String value = "";
if(data.hasChildNodes()) value = data.getFirstChild().getNodeValue();
//insere o valor pelo tipo de dado
if(value.isEmpty())
crs.updateNull(data.getTagName());
else if(type == java.sql.Types.INTEGER || type == java.sql.Types.NUMERIC || type == java.sql.Types.SMALLINT)
crs.updateInt(data.getTagName(), Integer.parseInt(value));
else if(type == java.sql.Types.FLOAT || type == java.sql.Types.DOUBLE || type == java.sql.Types.DECIMAL)
crs.updateDouble(data.getTagName(), Double.parseDouble(value));
else if (type == java.sql.Types.TIMESTAMP || type == java.sql.Types.DATE){
java.util.Date dataUtil = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(value);
java.sql.Date dataSql = new java.sql.Date(dataUtil.getTime());
crs.updateDate(data.getTagName(), dataSql);
} else
crs.updateString(data.getTagName(), value);
}
crs.insertRow();
crs.moveToCurrentRow();
crs.afterLast();
}
crs.beforeFirst();
return crs;
}
Agora tendo o Xml do relatorio e o cached das informações foi só compilar o relatório e boa … A unica coisa q ainda esta me faltando é a applet enviar um comando javascript para fechar assim que terminar a impressão. Olha a Applet:
[code]
@Override
public void init() {
try {
imprimir();
} catch (Exception ex) {
JOptionPane.showMessageDialog(null,“ERRO:”+ ex.toString());
Logger.getLogger(impressao.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void imprimir() throws Exception {
JasperReport layout = null;
/* Pega Parametros */
getParameters();
if(!xmlRel.isEmpty() && !xmlCached.isEmpty()){
/* Carrega o Design do Relatorio */
JasperDesign jasperDesign = JRXmlLoader.load(new java.io.ByteArrayInputStream((xmlRel).getBytes("UTF-8")));
/* Compila o Relatorio */
layout = JasperCompileManager.compileReport(jasperDesign);
if (isComplete()){
/* Parametros de Localidade para Data no Relatorio */
parameters.put("REPORT_LOCALE", new Locale("pt", "BR"));
JasperPrint jasperPrint = null;
/* Cached de Informações para o Relatorio */
CachedRowSetImpl crs = xmlToCachedRowSet(xmlCached);
/* Relatório Gerado */
jasperPrint = JasperFillManager.fillReport(layout, parameters, new JRResultSetDataSource((java.sql.ResultSet)crs));
/* Faz a Impressão de Acordo com o parametro de visualização da configuração de Impressão */
JasperPrintManager.printPage(jasperPrint, 0, propPrint);
}
}
}
[/code]>
Alguem conseguiu fazer a impressão do PDF para a impressora?
Eu acabei de fazer um teste aqui e até consegui imprimir um arquivo PDF vindo de uma URL direto na impressora, o problema é que o PDF não esta vindo no tamanho normal, não sei pq! Olha o código.
[code]
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPrintPage;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaSizeName;
/**
*
@author LGBIZZAN
*/
public class Print3 {
public Print3(boolean showDialog, String imp) {
try {
String url = “http://xxxxxx/xxxx/resultados/AAKALWCCLWYHHYZNADGX.pdf”;
String docName = “C:\Temp\teste.pdf”;
/Busca Arquivo na URL/
URL remote = new URL(url);
URLConnection conn = remote.openConnection();
conn.setRequestProperty(“Accept”, “/”);
InputStream in = conn.getInputStream();
File fl = new File(docName);
/*Escrever o File*/
OutputStream outputStream = new FileOutputStream(fl);
int read = 0;
byte[] bytes = new byte[1024];
while ((read = in.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
FileInputStream fis = new FileInputStream(fl);
FileChannel fc = fis.getChannel();
ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
PDFFile curFile = new PDFFile(bb); // Create PDF Print Page
PDFPrintPage pages = new PDFPrintPage(curFile);
PrinterJob pjob = PrinterJob.getPrinterJob();
pjob.setJobName(docName);
Book book = new Book();
PageFormat pformat = PrinterJob.getPrinterJob().defaultPage();
book.append(pages, pformat, curFile.getNumPages());
pjob.setPageable(book);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
//aset.add(MediaSizeName.ISO_A4); // informa o tipo de folha
//aset.add(javax.print.attribute.standard.MediaTray.ENVELOPE);
// print
if (showDialog) {
if(pjob.printDialog())
pjob.print();
}else{
PrintService impressora = null;
if(!imp.isEmpty())
impressora = buscaImpressora(imp);
else
impressora = PrintServiceLookup.lookupDefaultPrintService();
pjob.setPrintService(impressora);
pjob.print(aset);
}
if(fl.exists())
fl.delete();
} catch (FileNotFoundException ex) {
Logger.getLogger(Print3.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Print3.class.getName()).log(Level.SEVERE, null, ex);
} catch (PrinterException ex) {
Logger.getLogger(Print3.class.getName()).log(Level.SEVERE, null, ex);
}
}
public PrintService buscaImpressora(String i){
PrintService impressora = null;
DocFlavor df = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
PrintService[] ps = PrintServiceLookup.lookupPrintServices(df, null);
for (PrintService p: ps) {
if(p.getName().equalsIgnoreCase(i)){
impressora = p;
break;
}
}
return impressora;
}
public static void main(String[] args) {
new Print3(true,null);
}
}[/code]
Alguem tem uma ideia ?