PDA

View Full Version : [JAVA] Stampare HTML?????


alemuscolino
12-11-2008, 23:04
Il problema è "semplice"... sapete dirmi come si fa a mandare in stampa un documento HTML in java. In particolar modo, supponendo che io abbia una stringa contenente il codice HTML, a partire da qui come posso stampare la pagina generata dal codice HTML in questione???
Vi ringrazio in anticipo!! Aiutatemi!

alemuscolino
14-11-2008, 11:20
Datemi una mano vi pregooooooo!!!!!!!

ally
14-11-2008, 11:40
java digerisce solo in parte il codice html...potresti aprire il proswer con la pagina selezionata come una sorta di preview...e da qui l'utente lancerebbe il comando di stampa...

ciao Andrea

alemuscolino
14-11-2008, 11:49
No, a me servirebbe qualcosa che direttamente lo stampi, l'utente non deve vedere nulla... Io ho implementato questo... ma mi stampa 9999 pagine vuote??? DATEMI UNA MANO SONO NEI CASINI!!!!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
import java.lang.*;
import java.math.BigDecimal;
import java.net.*;
import java.lang.reflect.*;
import java.awt.print.*;


public class Stampare {
public static void main(String argom[]) {
try{
printableEditorPane jEditorPane = new printableEditorPane();
jEditorPane.setContentType("text/html");
jEditorPane.read(new BufferedReader(new FileReader("esempio.html")), "");
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(jEditorPane);
if (job.printDialog()) /* Displays the standard system print dialog*/{

job.print();
}
}
catch (Exception ex){
System.out.println(ex);
}
return;
}

public static class printableEditorPane extends JEditorPane implements
Printable, Serializable
{
public int print (Graphics g, PageFormat pf, int pageIndex) throws PrinterException{
Graphics2D g2 = (Graphics2D)g;
g2.setColor (Color.black);

RepaintManager.currentManager(this).setDoubleBufferingEnabled(false);
Dimension d = this.getSize();
double panelWidth = d.width;
double panelHeight = d.height;
double pageWidth = pf.getImageableWidth();
double pageHeight = pf.getImageableHeight();
double scale = pageWidth / panelWidth;
int totalNumPages = (int)Math.ceil(scale * panelHeight /
pageHeight);

// Check for empty pages
if (pageIndex >= totalNumPages) return Printable.NO_SUCH_PAGE;

g2.translate(pf.getImageableX(), pf.getImageableY());
g2.translate(0f, -pageIndex * pageHeight);
g2.scale(scale, scale);
this.paint(g2);

return Printable.PAGE_EXISTS;
}
}


}


AIUTOOOOOOOOOOOOOOOOOOO!!!!!!

ally
14-11-2008, 11:50
per la cronaca dai un occhio al PrinterJob per capire meglio quale strada intraprendere...guardando un po' in rete consigliano di convertire la pagina in pdf o in una immagine tramite programmi esterni per poi darli in pasto a java da stampare...

alemuscolino
14-11-2008, 11:52
Allora a me serve stampare qualcosa di più pulito di un semplice testo nn formattato. Andrebbe bene anche pdf!!! C'è un esempio di codice dal quale a partire da una stringa mi fa stampare un qualcosa di decente????

alemuscolino
14-11-2008, 12:44
Ragazzi ma è così difficile st probema????

fbcyborg
14-11-2008, 12:51
Non so quanto sia utile essere impazienti.

Io stavo facendo delle ricerche per te, ma ancora non ho trovato nulla, se ci riesco te lo dico.
A quanto pare non è proprio una cavolata.

banryu79
14-11-2008, 12:58
Ti consiglio di dare un occhio alla libreria JasperReports, magari c'è quello che fa per te.
Però non è che la scarichi ed entro domani hai già la funzionalità integrata bella e pronta, ti tocca studiarla un attimo prima.

Se poi hai la fortuna che qualcuno che ha già fatto una cosa simile passi di qua e legga, dandoti delle dritte, tanto meglio.

alemuscolino
14-11-2008, 13:04
Non c'è nulla di pronto quindi....:( mi sento troppo a mare... :cry: ma voi cosa mi consigliate di alternativo per il mio problema.
In sintesi io vorrei mandare in stampa automaticamente un documento html da java, anche da riga di comando, ma basa che sia in via automatica. qualsiasi csa va bene!!! Ditemi se magari è più facile eseguire una conversione pdf o cose simili... mi basterebbe generare qualcosa di pulito e formattato e stamparlo... Vi ringrazio infinitamente!!!!

fbcyborg
14-11-2008, 14:34
Qualche giorno fa avevo trovato su Internet una pagina che diceva che con un semplice comando si manda in stampa "una certa cosa" passata come parametro facendo comparire la classica finestra di stampa.. il problema è che non lo ritrovo. :cry: La cosa interessa anche a me.

alemuscolino
14-11-2008, 14:38
Il codice che ho scritto apre quella finestra... guarda un po dove bisogna operare per gli html... magari in due riusciamo a svelare l'arcano!:D

fbcyborg
14-11-2008, 14:39
Intanto perché non editi il tuo post e metti il tuo codice fra i tag [CODE] che ci sono apposta?

alemuscolino
14-11-2008, 14:57
Il programma di prima non stampa nulla... dice che ci sono 9999 pagine....:muro: :muro: Questo programma invia in stampa il documento senza aprire la finestra di selezione stampanti... che a me interessa aprire... in particolar modo ho scoperto che la porzione di codice:

PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
DocPrintJob job = services[0].createPrintJob();

Rappresenta il metodo per richiamare la stampante [0] predefinita...

il codice completo è:

import java.io.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.awt.print.*;

public class TestURLPrint {
public FileInputStream psStream = null;

public TestURLPrint(String htmlFileName) throws IOException {
try {
psStream = new FileInputStream(htmlFileName);
} catch (FileNotFoundException ffne) {
}
if (psStream == null) {
return;
}

DocFlavor psInFormat = new DocFlavor("application/octet-stream","java.io.InputStream");

Doc myDoc = new SimpleDoc(psStream, psInFormat, null);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(1));

aset.add(OrientationRequested.PORTRAIT);
aset.add(new JobName("Impression",null));
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
DocPrintJob job = services[0].createPrintJob();
try {
job.print(myDoc, aset);
try {
Thread.sleep(3000);
} catch ( Exception ex ) {
System.err.println("Error sleeping: " + ex );
}
System.out.println("HERE!!!!!!!!");
} catch(PrintException pe) {
System.out.print("ERROR!!!!---> " + pe);
}
}

public static void main(String args[]) {
try {
TestURLPrint tup = new TestURLPrint("gg.html");
} catch (IOException ioe) {
System.out.println("IO ERR " + ioe);
}
}
}

Ma se lo provate purtroppo avvia stampe senza far comparire la finestra di selezione della stampante... e anche se metto come oggetto dell'array [1] (XPS document writer... quella virtuale va) non mi fa selezionare il percorso dove salvare il file immagine di stampa... è un problemone... come si risolve???? Io sto cercando come un addannato... spero di trovare una soluzione decente e pubblicarla almeno chi si troverà in una situazione del genere in futuro potrà fare un copy/paste....:)

AIUTATEMI!!!! grazie;)

banryu79
14-11-2008, 15:16
Se risolvi così bene, altrimenti quoto il consiglio di Ally, e cioè di trovare e usare una libreria per Java che converta da Html a PDF, e quindi di mandare in stampa il PDF.

Io ne ho viste alcune commerciali, non so se ne esistano di gratuite.

alemuscolino
14-11-2008, 15:37
credo che il problema adesso riguardi la semplice programmazione e nient'altro... guardate qui:

import java.io.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.awt.print.*;

public class TestURLPrint {
public FileInputStream psStream = null;

public TestURLPrint(String htmlFileName) throws IOException {
try {
psStream = new FileInputStream(htmlFileName);
} catch (FileNotFoundException ffne) {
}
if (psStream == null) {
return;
}
try {
DocFlavor psInFormat = new DocFlavor("application/octet-stream","java.io.InputStream");

Doc myDoc = new SimpleDoc(psStream, psInFormat, null);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(1));
aset.add(OrientationRequested.PORTRAIT);
aset.add(new JobName("Impression",null));
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
String ser=services[0].toString();
System.out.println(ser);
//DocPrintJob job = services[1].createPrintJob();

PrintService selectedPrinter = ServiceUI.printDialog(null, 50, 50, services, services[0], null, aset);

DocPrintJob job = selectedPrinter.createPrintJob();



try {
Thread.sleep(3000);
} catch ( Exception ex ) {
System.err.println("Error sleeping: " + ex );
}
System.out.println("HERE!!!!!!!!");
} catch(Exception exe) {
System.out.print("ERROR!!!!---> " + exe);
}
}

public static void main(String args[]) {
try {
TestURLPrint tup = new TestURLPrint("gg.html");
} catch (IOException ioe) {
System.out.println("IO ERR " + ioe);
}
}
}

Perchè non mi compare la printDialog???????