Java HTML to PDF via Flying Saucer (Wald und Bäume Problem)

DeusExMachina

Lt. Junior Grade
Registriert
Jan. 2008
Beiträge
369
Ich versuche grade ein HTML Template für eine Report als PDF zu speichern,

mittel der Wahl war Flying Saucer und herrausgekommen ist dieser Scource Code :


Code:
package just.another.package

import java.io.BufferedInputStream;
import java.io.DataInputStream;
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 org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;

public class ToPdf {

	public static void main(String[] args) throws DocumentException, IOException {
		
		try {
			File filename = new File("template.html");
			DataInputStream datInStre = new DataInputStream(new FileInputStream(filename));
			dis.readUTF();
			InputStream in = new BufferedInputStream(new FileInputStream(filename));

			if (!filename.canRead() || !filename.isFile())
				System.exit(0);
			try {
				
				ITextRenderer renderer = new ITextRenderer();
				renderer.setDocument(datInStre);
				String outputFile = "test.pdf";
				OutputStream os;
				try {
					os = new FileOutputStream(outputFile);
					renderer.layout();
					renderer.createPDF(os);
					os.flush();
					os.close();
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			} finally {
				in.close();
			}
		} catch (IOException e) {
			System.exit(1);
		}
		
		

		
	}
	
}

Leider will das ganze nicht so wie ich wohl will und Eclispe meckert mit bei renderer.setDocument(datInStre);

Leider verstehe ich nicht warum.

Gibt es ein gutes Tutorial oder einen passenden Scource Code der das Problem lösen hilft?

Ich bin für jede Hilfe dankbar.
 
wäre hilfreich wenn du uns mitteilst was genau denn Eclipse nun zu meckern hat....
 
Indeed.

The method setDocument(String) in the type ITextRenderer is not applicable for the arguments (DataInputStream) wäre die Fehlermeldung.

Tausche ich die Zeile zu renderer.setDocumentFromString(dis.toString()); (datInStre wurde zu dis weil einfacher) hab ich keine Fehlermeldung das programm läuft auch durch erzeugt aber kein pdf
 
Steht doch da, die Methode setDocument erwartet einen String und keinen DataInputStream?
 
das ist mir aufgefallen.

aber wie ändere ich das so das ich mein PDF bekommen und Eclipse "frieden gibt". Oder mit anderen worten welche semantischen Änderungen muss ich vornehmen damit die Syntax korrekt (im sinne des erwarteten Ergebnisses) ausgewertet wird.
 
dann kann ich mir ja den ganzen Datainputstream sparen.


Hab das jetzt mal auf diese Version verkürzt das gibt keine Fehler mehr aber leider auch kein PDF:
Code:
package de.humance.redmine.reporter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.DocumentException;

public class ToPdf {

	public static void main(String[] args) throws DocumentException, IOException {
		
		try {
			File filename = new File("template.html");

			if (!filename.canRead() || !filename.isFile())
				System.exit(0);
			try {
				
				ITextRenderer renderer = new ITextRenderer();
				renderer.setDocument(filename);
				String outputFile = "test.pdf";
				try {
					FileOutputStream os = new FileOutputStream(outputFile);
					renderer.layout();
					renderer.createPDF(os);
					os.flush();
					os.close();
					
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			} finally {
			
			}
		} catch (IOException e) {
			System.exit(1);
		}
	}
	
}
 
Mal mit dem Debugger geschaut wie das Programm abläuft? Kann auf deine HTML-Datei korrekt zugegriffen werden?
Irgendwoe gibt es ja anscheinend einen Fehler.
 
Step dich mich mal Schritt für Schritt durchs Programm und behalte die Variablen im Blick. Wird der Inhalt des zweiten und dritten try-Blocks überhaupt durchlaufen?
 
anscheinend wird die orginal datei nicht richtig geladen und das programm steigt mit dem ersten catch aus.

die frage ist nur wo liegt da der fehler erkennen tu ich ihn nicht
 
Liegt die HTML-Datei im gleichen Verzeichnis wie dein Programm?
 
ja liegt im gleichen ordner wie die .java files.
 
Zuletzt bearbeitet:
Die .java-Dateien sind aber nur der Quellcode, das fertige Kompilat sind die .class-Dateien, und die werden bei den meisten IDEs in einem anderen Verzeichnis abgelegt.
Verschiebe die Dateien mal dorthin oder gib mal den absolluten Pfad an, also komplett mit Laufwerk usw.
 
Zuletzt bearbeitet:
AW: HTML to PDF via Flying Saucer , Quelldatei wird nicht gelesen

die dateien liegen in beiden ordern aber er ließt die datei nicht irgendwas mach ich falsch und ich sehe es nicht.

Code sieht im moment so aus:

Code:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.DocumentException;

public class ToPdf {

	public static void main(String[] args) throws DocumentException, IOException {
		
		try {
			System.out.println("1st Try-Block");
			BufferedReader file = new BufferedReader(new FileReader("testTemplate.html"));
			
			
			
			try {
					System.out.println("2nd Try-Block");
					ITextRenderer renderer = new ITextRenderer();
					renderer.setDocument((Document) file, null);
					String outputFile = "test.pdf";
					try {
						System.out.println("3rd Try-Block");
						FileOutputStream os = new FileOutputStream(outputFile);
						renderer.layout();
						renderer.createPDF(os);
						os.flush();
						os.close();
					
						} 
					catch (FileNotFoundException e)
						{
							System.out.println("Fehlschlag again");
						}
					} 
			finally {
							System.out.println("Finally");
						}
				
		}
		catch (IOException e) {
			System.out.println("Fehlschlag");
		}
	}
	}

Aber das Programm landet immer nach einer pause von ca 15sec im "Fehlschlag" Catch.
 
Zuletzt bearbeitet:
edit: Falsch gelesen. Es gibt wohl Probleme beim Lesen deiner Datei. Gib mal absolute Pfade an.
 
Zuletzt bearbeitet:
ok das geht (das aber nicht gut da ich später das ganze in ein weiter führendes Programm einbetten will das als jar von jedem beliebigen ordner aus funktionieren soll)

Obwohl da wird dann keine Datei geladen sondern ein Objekt übergeben da enfällt der Pfad ja eh...

wobei geht ist relativ jetzt kommt diese Ausgabe:
1st Try-Block
2nd Try-Block
Finally
Exception in thread "main" java.lang.ClassCastException: java.io.BufferedReader cannot be cast to org.w3c.dom.Document
at de.humance.redmine.reporter.ToPdf.main(ToPdf.java:25)
 
das problem steht doch da: du versuchst, aus einem BufferedReader ein Document zu machen. ich nehme mal an, weil ohne den cast eclipse "gemeckert" hat. in dem fall sollte das ziel aber nicht sein, auf irgendeine beliebige weise eclipse zufriedenzustellen, sondern den code korrekt zu fixen.

schau dir dazu vielleicht die methoden, die du verwendest, in zukunft mal etwas genauer an...
 
Zuletzt bearbeitet:
AW: HTML to PDF via Flying Saucer

Das hatte ich mir schon gedacht und auch schon nach dem Entsprechenden richtigen Code gesucht.

Leider bin ich bis her nicht fündig geworden.

Tante Edit sagt:

Kann es sein das mein Versuch ein HTML Dokument umzuwandeln evtl. einen Gedankenfehler unterliegt?

ich versuche eine Datei die als HTML (der spätere Datenstrom wird ja auch nur HTML als String) vorliegt umzuwandeln.

Geht das überhaupt? oder muss ich das ganze erst in xml phrasen?
 
Zuletzt bearbeitet:
Welche Funktionen deine Bibliothek dir zur Verfügung stellt, musst du dir schon selbst anschauen.
 
Zurück
Oben