Apache fop -- welche Möglichkeit gibt es um den Fortschritt anzuzeigen (Progressbar)

Hein_nieH

Bekanntes Mitglied
Hallo,

ich nutze die Bibliothek Apache fop um aus einer großen xml-Datei via xslt eine pdf-Datei zu erzeugen.
Das funktioniert jetzt auch alles wie es soll. Leider dauert es einige Sekunden bis die pdf-Datei generiert wurde.
Gerne würde ich den aktuellen Fortschritt in einem Progressbar oder Progressmonitor sichtbar machen.

Leider finde ich keinen Ansatz dazu. Ich habe mich an die Codebeispiele in der fop-Bibliothek gehalten.
Hat jemand einen Lösungsansatz?

Gruss Hein_nieH
 

Oneixee5

Top Contributor
Wie viele Seiten PDF werden eigentlich erzeugt? Selbst bei 1500-1800 Seiten zeige ich nur an: "Bitte haben Sie ein paar Sekunden Geduld, Ihr Dokument wird gerade erstellt." - mit so einem "loading gears"-Gif daunter. Ich denke das dauert nicht länger als 10-15 Sekunden. Darüber bekommt der Nutzer dann eine Mail mit Download-Link für die nächsten 48 Stunden oder auch direkt einen Slot in der Druckerei. Sehr lange darf das aber auch nicht dauern. Stell dir mal vor du hast gerade 10 Nutzer, die so große PDF's erstellen wollen. Dann ist es notwendig so schnell wie möglich den Speicher wieder frei zu bekommen. Auch die Druckerei kostet ganz schön viel Geld, das will man ja nicht für Wartezeit ausgeben.
 

Hein_nieH

Bekanntes Mitglied
Hallo

es sind etwa 970 - 1000 Seiten.
Das dauert auf meinem Rechner etwa 15 Sekunden.
Die Motivation war es eine perfekte Lösung zu schaffen.

Gruss Hein_nieH
 

Oneixee5

Top Contributor
Mich hat das Thema selbst mal interessiert und ich habe mal etwas herumgespielt. Das Ergebnis will ich hier mal kurz zeigen. Es ist noch nicht perfekt, mehr so ein proof of concept. Die volle Länge würde den Rahmen hier sprengen, also etwas gekürzt. Der Fortschritt wird über eine eigene FOP-Extension: fox:progress getrackt. Das Element wird nicht in PDF umgewandelt, sondern dafür verwendet ein Event für den Fortschritt auszulösen. Der Fortschritt kann dann per Eventlistener abgeholt werden. Ich hoffe der Code + XML/XSL ist weitgehend selbsterklärend. Feedback willkommen.

XML:
        <xsl:element name="fox:progress">
            <xsl:attribute name="value">
                <xsl:value-of select="$count_factor *  position()" />
            </xsl:attribute>
        </xsl:element>
Java:
        final EventBroadcaster eventBroadcaster = foUserAgent.getEventBroadcaster();
        eventBroadcaster.addEventListener(new ProgressEventListener());
        fopFactory.addElementMapping(new ProgressElementMapping(eventBroadcaster));


test.xml:
<?xml version="1.0"?>

<employees>
    <companyname>FOP Inc.</companyname>

    <employee>
        <id>101</id>
        <name>Jürgen</name>
        <designation>Manager</designation>
    </employee>

    <employee>
        <id>102</id>
        <name>Emil</name>
        <designation>Executive</designation>
    </employee>

    <employee>
        <id>103</id>
        <name>Klaus</name>
        <designation>Executive</designation>
    </employee>

</employees>
test.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"    
    xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"
    exclude-result-prefixes="fo">
   
    <xsl:variable name="count_factor" select="100 div count(/employees/employee)" />
   
    <xsl:template match="employees">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="simpleA4"
                    page-height="29.7cm" page-width="21cm" margin-top="2cm"
                    margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
                    <fo:region-body />
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="simpleA4">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block font-size="16pt" font-weight="bold"
                        space-after="5mm">
                        Company Name:
                        <xsl:value-of select="companyname" />
                    </fo:block>
                    <fo:block font-size="10pt">
                        <fo:table table-layout="fixed" width="100%"
                            border-collapse="separate">
                            <fo:table-column column-width="4cm" />
                            <fo:table-column column-width="4cm" />
                            <fo:table-column column-width="5cm" />
                            <fo:table-body>
                                <xsl:apply-templates select="employee" />
                            </fo:table-body>
                        </fo:table>
                    </fo:block>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>
    <xsl:template match="employee">
        <fo:table-row>
            <xsl:if test="designation = 'Manager'">
                <xsl:attribute name="font-weight">bold</xsl:attribute>
            </xsl:if>
            <fo:table-cell>
                <fo:block>
                    <xsl:value-of select="id" />
                </fo:block>
            </fo:table-cell>

            <fo:table-cell>
                <fo:block>
                    <xsl:value-of select="name" />
                </fo:block>
            </fo:table-cell>
            <fo:table-cell>
                <fo:block>
                    <xsl:value-of select="designation" />
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
        <xsl:element name="fox:progress">
            <xsl:attribute name="value">
                <xsl:value-of select="$count_factor *  position()" />
            </xsl:attribute>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
FopProgressTest.java:
public class FopProgressTest {

    private static final class Progress extends FONode {

        private String elementName;
        private final EventBroadcaster eventBroadcaster;

        Progress(final FONode parent, final EventBroadcaster eventBroadcaster) {
            super(parent);
            this.eventBroadcaster = eventBroadcaster;
        }

        @Override
        public void processNode(final String elementName, final Locator locator,
                final Attributes attlist, final PropertyList propertyList) throws FOPException {
            setLocator(locator);
            this.elementName = elementName;
            final Event event = new Event(this, this.elementName, EventSeverity.INFO,
                    Event.paramsBuilder().param("value", attlist.getValue("value")).build());
            this.eventBroadcaster.broadcastEvent(event);
        }

        @Override
        public String getLocalName() {
            return this.elementName;
        }

        @Override
        public String getNamespaceURI() {
            return ExtensionElementMapping.URI;
        }

        @Override
        public String getNormalNamespacePrefix() {
            return null;
        }

    }

    private static final class ProgressElementMapping extends ElementMapping {

        private static class ProgressMaker extends ElementMapping.Maker {

            private final EventBroadcaster eventBroadcaster;

            public ProgressMaker(final EventBroadcaster eventBroadcaster) {
                this.eventBroadcaster = eventBroadcaster;
            }

            @Override
            public FONode make(final FONode parent) {
                return new Progress(parent, this.eventBroadcaster);
            }
        }

        private final EventBroadcaster eventBroadcaster;

        public ProgressElementMapping(final EventBroadcaster eventBroadcaster) {
            this.eventBroadcaster = eventBroadcaster;
            this.namespaceURI = ExtensionElementMapping.URI;
        }

        @Override
        protected void initialize() {
            if (this.foObjs == null) {
                this.foObjs = new HashMap<>();
                this.foObjs.put("progress", new ProgressMaker(this.eventBroadcaster));
            }
        }

    }

    private static final class ProgressEventListener implements EventListener {

        private static final StringBuilder SB = new StringBuilder();
        private static final char[] chars = new char[106];
        static {
            Arrays.fill(chars, '\b');
        }

        @Override
        public void processEvent(final Event event) {
            if ("progress".equals(event.getEventID())) {
                final String s = (String) event.getParams().get("value");
                final int p = Integer.parseInt(s.split("\\.")[0]);
                SB.setLength(0);
                for (int i = 0; i < 100; i++) {
                    SB.append(i < p ? '█' : '░');
                }
                System.out.print(chars);
                System.out.print("[" + String.format("%-100s", SB.toString()) + "] " + p + "%");
            }
        }

    }

    public static void main(final String[] args) {
        final FopProgressTest fopTest = new FopProgressTest();
        try {
            //fopTest.transform("test.xsl", "test.xml", "test.fo");
            fopTest.convertToPDF();
        } catch (final FOPException | IOException | TransformerException e) {
            e.printStackTrace();
        }
        System.out.println();
    }

    private void convertToPDF()  throws IOException, FOPException, TransformerException {
        final File xsltFile = new File("test.xsl");
        final StreamSource xmlSource = new StreamSource(new File("test.xml"));
        final FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
        final FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        final EventBroadcaster eventBroadcaster = foUserAgent.getEventBroadcaster();
        eventBroadcaster.addEventListener(new ProgressEventListener());
        fopFactory.addElementMapping(new ProgressElementMapping(eventBroadcaster));

        try (OutputStream out = new java.io.FileOutputStream("test.pdf")) {
            final Fop fop = fopFactory.newFop(org.apache.xmlgraphics.util.MimeConstants.MIME_PDF, foUserAgent, out);
            final TransformerFactory factory = TransformerFactory.newInstance();
            final Transformer transformer = factory.newTransformer(new StreamSource(xsltFile));
            final Result res = new SAXResult(fop.getDefaultHandler());
            transformer.transform(xmlSource, res);
        }
    }

    public void transform(final String inputXSL, final String inputXML, final String outfile)
            throws TransformerException {
        final Result out = new StreamResult(outfile);
        final StreamSource xml = new StreamSource(inputXML);
        final StreamSource xsl = new StreamSource(inputXSL);
        final Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
        transformer.transform(xml, out);
    }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Apache fop - OutOfMemoryError Allgemeine Java-Themen 10
B Schnittstelle zwischen MySQL und Apache Allgemeine Java-Themen 8
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
F Fehlermeldung: java.lang.NoClassDefFoundError: org/apache/commons/net/ntp/NTPUDPClient Allgemeine Java-Themen 6
N Apache POI/ neue Reihe in Excel mit einem Button Allgemeine Java-Themen 2
I Apache POI Bild in Word ersetzen Allgemeine Java-Themen 15
O xlsx Datei auslesen mit POI Apache liest keine LEERZELLEN Allgemeine Java-Themen 6
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
L APACHE POI PIVOT TABELLEN Allgemeine Java-Themen 4
L Apache POI Datenquelle Allgemeine Java-Themen 1
S Apache POI Filtern nach bestimmten Kriterium Allgemeine Java-Themen 1
L JavaFX JavaFX Chart in Apache Poi Excel Datei Allgemeine Java-Themen 2
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
F Input/Output NullPointerException, aber wieso? [Apache POI] Allgemeine Java-Themen 11
F Input/Output NullPointerException with Apache POI Allgemeine Java-Themen 7
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
J Apache POI - No external workbook with name Allgemeine Java-Themen 5
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
M Apache Tika: Warnmeldungen und Beispielcode Allgemeine Java-Themen 12
X Performance für Tomcat / Apache optimieren Allgemeine Java-Themen 2
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
FrittenFritze Swing Apache Batik - Zoom an einer bestimmten Stelle Allgemeine Java-Themen 4
K Apache poi: Deprecated getCellType Allgemeine Java-Themen 3
J Apache POI Excel- Blattschutz aufheben Allgemeine Java-Themen 2
I Apache POI Word Text einfügen Allgemeine Java-Themen 26
T Geschlossen: Apache POI - Excel einlesen Allgemeine Java-Themen 0
K Apache POI Word Tabelle Zellen verbinden Allgemeine Java-Themen 4
K Apache POI Word Tabelle Spaltenbreite festlegen Allgemeine Java-Themen 7
K Apache POI Word bestimmte Textstellen bearbeiten Allgemeine Java-Themen 1
R Apache POI XSSF Allgemeine Java-Themen 2
E Apache POI Powerpoint Verlinkungen ändern Allgemeine Java-Themen 4
T xls-Datei per Apache Commons CsvParser einlesen UTF-8 Zeichen russische Zeichen Allgemeine Java-Themen 2
zer0zer0 Best Practice apache common cli - optionen für hilfe ausblenden Allgemeine Java-Themen 5
S Eclipse Apache Camel FTP: Fehlerbehandlung, wie? Allgemeine Java-Themen 2
H Excel Datei einlesen mit Apache POI Allgemeine Java-Themen 1
GianaSisters Apache POI - Hyperlink erstellen Allgemeine Java-Themen 0
reibi Apache PDFBox Allgemeine Java-Themen 0
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
C Was bekomme ich eine Nullpointerexception? (Apache POI) Allgemeine Java-Themen 3
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
H Apache POI HSSF - Farbe/Rahmen etc. ohne Style-Vorlage? Allgemeine Java-Themen 4
E Apache POI-Datei lesen und umschreiben Allgemeine Java-Themen 8
G Input/Output Apache POI Excel Allgemeine Java-Themen 5
L Apache CLI: Args[] übergeben Allgemeine Java-Themen 3
P docx mit Apache POI auslesen, verändern und zurückschreiben Allgemeine Java-Themen 2
N Applet Apache Poi Wert einer Formel ausgeben Allgemeine Java-Themen 5
L Apache Common CLI Allgemeine Java-Themen 4
J Webstart (auf Apache) jnlp wird nicht geladen Allgemeine Java-Themen 2
S HTTP Apache HTTPClient Problem Allgemeine Java-Themen 4
R org.apache.http kompletter Internetausfall Allgemeine Java-Themen 7
J xlsx Dateien lesen OHNE apache POI Allgemeine Java-Themen 6
V Für was benötigt man Apache Common Allgemeine Java-Themen 3
V Apache POI Excel Datum auslesen Allgemeine Java-Themen 6
V Apache POI Excel Sheet auslesen Allgemeine Java-Themen 5
B Problem mit RegEs und org.apache.regexp.RE Allgemeine Java-Themen 5
T Apache POI Export EXCEL - [Zahlen-Werte] Allgemeine Java-Themen 1
Landei Erfahrungen mit JavaConfig oder Apache Commons Config? Allgemeine Java-Themen 3
J Apache FTPClient upload Allgemeine Java-Themen 3
A Apache License, Version 2.0 Allgemeine Java-Themen 7
S Bzip2 apache commons-compress Allgemeine Java-Themen 3
Chris81T Apache FOP 0.20-5 mit JNI von C++ Code aufrufen Allgemeine Java-Themen 8
C Apache POI(HSSF) Conditional Formatting Allgemeine Java-Themen 3
G Apache soll mit SVN zusammenarbeiten Allgemeine Java-Themen 3
E Apache Commons - PropertyConfiguration - Autosave Allgemeine Java-Themen 2
G Servlet über apache Tomcat ansprechen Allgemeine Java-Themen 6
alexpetri DirectoryWalker apache.commons Allgemeine Java-Themen 3
S Apache Commons Net geht nicht Allgemeine Java-Themen 5
G mit Apache-Jakarta-POI auch Graphiken aus Excel einlesen? Allgemeine Java-Themen 3
T Apache Lucene Allgemeine Java-Themen 2
Q Ant und org.apache.log4j.xml.DOMConfigurator Problem Allgemeine Java-Themen 2
M Java Webserver - Tomcat alleine oder zusammen mit Apache? Allgemeine Java-Themen 3
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
F Java Web App - welche Technologien? Allgemeine Java-Themen 11
S Welche API? Allgemeine Java-Themen 6
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
K Welche Zertifizierung passt? Allgemeine Java-Themen 10
A Variable, welche Exeption wirft als "Global" deklarieren Allgemeine Java-Themen 13
J Videokonferenz mittel Java ? Welche Möglichkeiten habe ich ? Allgemeine Java-Themen 2
J Welche Layouts benutzt ihr? Allgemeine Java-Themen 2
G Wiedereinstieg, welche Java Version empfehlt ihr Allgemeine Java-Themen 7
M Welche Exceptionbehandlung ist sinnvoll? Allgemeine Java-Themen 3
H NetBeans geotools 15 oder 16 - welche Abhängingkeiten gibt es? Welche Jars brauche ich? Allgemeine Java-Themen 4
S Welche Java Techologien gibt es fürs Frontend Allgemeine Java-Themen 4
S Welche Nutzen bringen Lamda Expressions? Allgemeine Java-Themen 1
M Welche Umgebung und Frameworks für mich als Umsteiger Allgemeine Java-Themen 6
C Welche Styleconvention Allgemeine Java-Themen 0
ruutaiokwu datenstruktur welche sich "im kreis" dreht Allgemeine Java-Themen 26
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
F Welche Systeme für hoch skalierbare Webanwendung? Allgemeine Java-Themen 7
Landei Welche Klassen fehlen im JDK? Allgemeine Java-Themen 18
P Check, welche Java Version installiert bevor ein Programm ausgeführt wird. Allgemeine Java-Themen 12
G Welche Datenstruktur? Allgemeine Java-Themen 19
I Webseite auslesen (welche mittels Javascript Inhalt einbindet) Allgemeine Java-Themen 4
R Welche waren eure ersten Projekte? Allgemeine Java-Themen 10
G Wie kann man sehen, welche Applikationen mit java arbeiten? Allgemeine Java-Themen 17
L Social Media Webportal -> Welche Technologie (JEE, GWT) Allgemeine Java-Themen 8
J Welche Informationen werden beim Kompilieren gespeichert? Allgemeine Java-Themen 3
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben