Hallo!
Ich hoffe, so eine Frage ist hier im Forum okay. Ich habe ein programm geschrieben, was per FileChooser eine xml-Datei einließt und sie dann in PDF umwandelt, wobei die PDF je nach Dateiname der XML anders heißt. Nun wollte ich fragen, ob mal jemand über den Code gucken könnte und mir sagen könnte, was da so alles für Fehler drin sind.
Funktionieren tut das Ganze, aber der Code ist ziemlich sicher nicht optimal.
Ich hab z. B. versucht, die main-Klasse vom Layout und von der Transformation zu trennen. Ist das so sinnvoll?
Vor allem interessiert mich Folgendes: Wie müsste ich vorgehen, um mehrere Dateien einlesen zu können und alle diese Dateien dann als PDF mit unterschiedlichen Dateinamen zu erhalten.
Ich hatte schon was mit einem File-Array probiert und einer ArrayList<File> aber ich bleibe da stecken. Das Problem ist vor allem, dass die Methoden .getPath() und getName() mit getselectedFiles() nicht funkionieren. Hier wäre ich für ein paar Schubser in die richtige Richtung dankbar.
Ein Problem gibt es noch: Wenn im Dateinamen der xml-Datei ein Umlaut ist, dann gibt eine Fehlermeldung:
Hier der Code:
Mit dieser Klasse lasse ich mir noch das FO-Zwischenformat ausgeben:
Vielen Dank schon mal an alle, die sich die Zeit nehmen!
Ich hoffe, so eine Frage ist hier im Forum okay. Ich habe ein programm geschrieben, was per FileChooser eine xml-Datei einließt und sie dann in PDF umwandelt, wobei die PDF je nach Dateiname der XML anders heißt. Nun wollte ich fragen, ob mal jemand über den Code gucken könnte und mir sagen könnte, was da so alles für Fehler drin sind.
Funktionieren tut das Ganze, aber der Code ist ziemlich sicher nicht optimal.
Ich hab z. B. versucht, die main-Klasse vom Layout und von der Transformation zu trennen. Ist das so sinnvoll?
Vor allem interessiert mich Folgendes: Wie müsste ich vorgehen, um mehrere Dateien einlesen zu können und alle diese Dateien dann als PDF mit unterschiedlichen Dateinamen zu erhalten.
Ich hatte schon was mit einem File-Array probiert und einer ArrayList<File> aber ich bleibe da stecken. Das Problem ist vor allem, dass die Methoden .getPath() und getName() mit getselectedFiles() nicht funkionieren. Hier wäre ich für ein paar Schubser in die richtige Richtung dankbar.
Ein Problem gibt es noch: Wenn im Dateinamen der xml-Datei ein Umlaut ist, dann gibt eine Fehlermeldung:
Code:
Error
I/O error reported by XML parser processing C:\Users\z003a5bp\Desktop\FOP2\zz\püz.xml: unknown protocol: c
net.sf.saxon.trans.XPathException: I/O error reported by XML parser processing C:\Users\z003a5bp\Desktop\FOP2\MeinZeug\püz.xml: unknown protocol: c
Hier der Code:
Code:
public class MainFOP {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Thread() {
private String file;
public void run() {
File xsl = new File("stylesheet.xsl");
String xslfile = xsl.toString();
Layout layout = new Layout();
try {
layout.GUI();
file = layout.fileInput();
} catch (NullPointerException e) {
System.out
.println("Da ist etwas schiefgelaufen, nämlich:\n");
e.printStackTrace();
System.exit(0);
}
try {
layout.fileNamePDF();
layout.fileInput();
XMLtoPDF.xmlToPdfPerXsl(xslfile, file, layout.fileNamePDF());
XMLtoFO.XMLtoFOdo(xslfile, file);
} catch (Exception e) {
System.out.println("Fehler:\n");
e.printStackTrace();
System.exit(0);
}
}
});
}
}
Code:
public class Layout {
private static String dateiname;
private String datei;
private static JFileChooser chooser;
protected void GUI() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
FileFilter filter = new FileNameExtensionFilter("XML-Dateien",
"xml");
chooser = new JFileChooser();
chooser.addChoosableFileFilter(filter);
chooser.showOpenDialog(null);
}
protected String fileInput() {
datei = chooser.getSelectedFile().getPath();
return datei;
}
protected String fileNamePDF() {
dateiname = chooser.getSelectedFile().getName();
StringBuilder b = new StringBuilder(dateiname);
b.replace(dateiname.lastIndexOf("."), dateiname.lastIndexOf("l") + 1,
"_result.pdf");
dateiname = b.toString();
return dateiname;
}
protected static String fileNameFO() {
dateiname = chooser.getSelectedFile().getName();
StringBuilder c = new StringBuilder(dateiname);
c.replace(dateiname.lastIndexOf("."), dateiname.lastIndexOf("l") + 1,
"_resultxml.fo");
dateiname = c.toString();
return dateiname;
}
}
Code:
public final class XMLtoPDF {
protected static void xmlToPdfPerXsl(String inputXSL, String file,
String string) throws Exception {
if (true) {
System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
}
OutputStream pdf = null;
try {
pdf = new FileOutputStream(string);
Fop fop = FopFactory.newInstance().newFop(MimeConstants.MIME_PDF,
pdf); // ?
Source xml = new StreamSource(file);
Source xsl = new StreamSource(inputXSL);
Result sax = new SAXResult(fop.getDefaultHandler()); // ?
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(xsl);
transformer.transform(xml, sax);
} catch (Exception e) {
e.printStackTrace();
} finally {
pdf.close();
}
}
}
Mit dieser Klasse lasse ich mir noch das FO-Zwischenformat ausgeben:
Code:
public final class XMLtoFO {
protected static void XMLtoFOdo(String inputXSL, String file) throws Exception {
if(true) {
System.setProperty(
"javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
}
TransformerFactory f = TransformerFactory.newInstance();
Source stylesheet = new StreamSource(inputXSL);
try {
Transformer t = f.newTransformer(stylesheet);
Source sourcexml = new StreamSource(file);
Result result = new StreamResult(new File(Layout.fileNameFO()));
t.transform(sourcexml, result);
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
Vielen Dank schon mal an alle, die sich die Zeit nehmen!
Zuletzt bearbeitet: