(XSL-FO) Bilder auf Maximalgröße skalieren
Julian von Mendel
- xml
Hi,
ich hab drei Fragen zu XSL-FO. Ich transfomiere mittels XSLT XML-Dateien in FOP-Dateien um, aus denen anschließend PDFs erzeugt werden.
1. Die PDFs haben logischerweise bestimmmte Seitengrößen. In meinem XSL-FO-Buch wird keine Möglichkeit erwähnt, Bildgrößen in einer relativen Einheit anzugeben, es wäre jedoch äußerst praktisch, wenn man den verfügbären Platz vollständig nutzen könnte, ohne die Größenangaben auszuprobieren (natürlich könnte man die gesamte Seitengröße ausmessen, wenn dann aber noch Text über dem Bild steht, wirds schwierig). Deswegen würde ich mich freuen, wenn jemand eine Möglichkeit kennt und mir verrät, wie man den gesamten verfügbaren Raum nutzen kann.
2. Ich möchte den Text auf einigen Seiten vertikal zentriert oder vertikal unten ausrichten. Ich habe dafür im obersten block-Element der Seite das Attribut "vertical-align" auf "bottom" gesetzt. Das scheint jedoch nicht auszureichen. Irgendwie muss man das block-Element wohl auch über die gesamte Seite erstrecken, damit die vertikale Ausrichtung überhaupt relevant wird, oder? Wie mache ich das?
3. Ist der Text einer Inhaltsseite zu lang, wird dieser umgebrochen. Das ist jedoch NICHT erwünscht, da das das Gesamtlayout stört. Es wäre deutlich cooler, wenn beim Umwandeln der Daten eine Warning käme, die anzeigt, bei welcher Seite es Probleme gibt. Dummerweise weiß ich nicht, wie man soetwas prüfen sollte - im Endeffekt kann das XSLT-Stylesheet ja nicht wissen ob der Text zu lang ist, sondern nur FOP. Gibt es in FOPO Funktionen die dafür vorgesehen sind? Gibt es eine andere Möglichkeit?
Vielen Dank
Julian
Hi,
noch eine Frage:
wenn ich zwei Lisenelemente mit einem Zeilenumbruch trenne möchte, wie mache ich das sinnvollerweise? <fo:block /> allein bewirkt gar nichts...
Schöne Grüße
Julian
Hi,
Lisen- oder Listenelemente?
Schau mal hier: http://www.data2type.de/xml/Listen.html
war mir damals auch eine sehr gute Einsteigerseite.
Das Umbruchsystem erklärt man da auch: http://www.data2type.de/xml/typo.html
Gruß,
hh
Hallo,
ich hab drei Fragen zu XSL-FO. Ich transfomiere mittels XSLT XML-Dateien in FOP-Dateien um, aus denen anschließend PDFs erzeugt werden.
- Die PDFs haben logischerweise bestimmmte Seitengrößen. In meinem XSL-FO-Buch wird keine Möglichkeit erwähnt, Bildgrößen in einer relativen Einheit anzugeben, es wäre jedoch äußerst praktisch, wenn man den verfügbären Platz vollständig nutzen könnte,
scalieren bei höhe:
<fo:external-graphic height="100%" content-height="scale-to-fit" content-width="100%" scaling="uniform" ... />
oder bei breite:
<fo:external-graphic width="100%" content-width="scale-to-fit" content-height="100%" scaling="uniform" ... />
allerdings erzeugt fo:external-graphic ein inline-area, du kannst es jedoch in ein fo:block packen.
- Ich möchte den Text auf einigen Seiten vertikal zentriert oder vertikal unten ausrichten. Ich habe dafür im obersten block-Element der Seite das Attribut "vertical-align" auf "bottom" gesetzt. Das scheint jedoch nicht auszureichen. Irgendwie muss man das block-Element wohl auch über die gesamte Seite erstrecken, damit die vertikale Ausrichtung überhaupt relevant wird, oder? Wie mache ich das?
<fo:region-body display-align="after" ...> sollte das tun.
- Ist der Text einer Inhaltsseite zu lang, wird dieser umgebrochen.
logisch.
Das ist jedoch NICHT erwünscht, da das das Gesamtlayout stört.
So ein Pech aber. Schreibt weniger Text.
Ehlich: was soll denn deiner Meinung nach mit dem "überschüssigen" Text passieren? Du kannst ihn natürlich abschneiden, so das er einfach nicht angezeigt wird. Aber ob das gewünscht ist?
Es wäre deutlich cooler, [...] Gibt es in FOPO Funktionen die dafür vorgesehen sind?
Nein.
Was du versuchen könntest ist:
<fo:region-body overflow="error-if-overflow" ...> aber wie FOP das implementiert hat, kann ich dir jetzt nicht sagen.
Gibt es eine andere Möglichkeit?
Viele:
- weniger Text schreiben
- die Seiten als Grafik erstellen und eine Seite pro Grafik erstellen
- die Seiten von einem Maler auf A4-Seiten malen lassen.
- überlegen, das man gescheite Regel für keeps und breaks schreibt.
noch eine Frage: wenn ich zwei Lisenelemente mit einem Zeilenumbruch trenne möchte, wie mache ich das sinnvollerweise? <fo:block /> allein bewirkt gar nichts...
margin-bottom="" oder space-after="" (z.B: space-after.minimum=10pt, space-after.optimum=12pt, space-after.maximum=14pt,) für fo:list-item definieren.
Grüße
Thomas
Hi,
- überlegen, das man gescheite Regel für keeps und breaks schreibt.
kannst du das ein wenig ausführen? Ich habe keine Ahnung, was das bedeutet.
noch eine Frage: wenn ich zwei Lisenelemente mit einem Zeilenumbruch trenne möchte, wie mache ich das sinnvollerweise? <fo:block /> allein bewirkt gar nichts...
margin-bottom="" oder space-after="" (z.B: space-after.minimum=10pt, space-after.optimum=12pt, space-after.maximum=14pt,) für fo:list-item definieren.
Das ist sicher die sinnvollste Möglichkeit, aber ich möchte den Zeilenumbruch nur erzeugen, wenn ein br im XML steht. Das mit den List-Items war ein Beispiel, genau das gleiche ist es, wenn zwei Bilder hintereinander stehen und der Abstand zwischen diesen erhöht werden soll. Dann ist gewünscht, das man einfach zwischen die beiden Bilder ein br setzt und der Abstand sich erhöht.
Vielen Dank für deine umfangreiche Antwort, das hat mir sehr geholfen!
Schöne Grüße
Julian
Hi,
scalieren bei höhe:
<fo:external-graphic height="100%" content-height="scale-to-fit" content-width="100%" scaling="uniform" ... />
oder bei breite:
<fo:external-graphic width="100%" content-width="scale-to-fit" content-height="100%" scaling="uniform" ... />
[ERROR] Error in height property value '100%': org.apache.fop.fo.expr.PropertyException: No conversion defined
[ERROR] Error in content-height property value 'scale-to-fit': org.apache.fop.fo.expr.PropertyException: No conversion defined
[ERROR] Error in content-width property value '100%': org.apache.fop.fo.expr.PropertyException: No conversion defined
allerdings erzeugt fo:external-graphic ein inline-area, du kannst es jedoch in ein fo:block packen.
Hab ich gemacht.
- Ich möchte den Text auf einigen Seiten vertikal zentriert oder vertikal unten ausrichten. Ich habe dafür im obersten block-Element der Seite das Attribut "vertical-align" auf "bottom" gesetzt. Das scheint jedoch nicht auszureichen. Irgendwie muss man das block-Element wohl auch über die gesamte Seite erstrecken, damit die vertikale Ausrichtung überhaupt relevant wird, oder? Wie mache ich das?
<fo:region-body display-align="after" ...> sollte das tun.
Tut nicht. Ich habe das meinem region-body zugewiesen, es hat sich aber nichts geändert.
Schöne Grüße
Julian
Hallo,
<fo:external-graphic width="100%" content-width="scale-to-fit" content-height="100%" scaling="uniform" ... />
[ERROR] Error in height property value '100%': org.apache.fop.fo.expr.PropertyException: No conversion defined
[ERROR] Error in content-height property value 'scale-to-fit': org.apache.fop.fo.expr.PropertyException: No conversion defined
[ERROR] Error in content-width property value '100%': org.apache.fop.fo.expr.PropertyException: No conversion defined
Welche FOP-Version, laut ihre eigene Liste http://xmlgraphics.apache.org/fop/compliance.html#fo-property-content-height unterstützt der 0.91 oder 0.92 beta diese Eigenschaft. (der 0.20.5 ist wirklich sehr beschränkt)
- Ich möchte den Text auf einigen Seiten vertikal zentriert oder vertikal unten ausrichten.
<fo:region-body display-align="after" ...> sollte das tun.Tut nicht. Ich habe das meinem region-body zugewiesen, es hat sich aber nichts geändert.
Das hätte eigentlich den Inhalt der Seite unten ausrichten müssen, es sei denn die Seite ist voll. Ich müsste ein paar Test machen, denn sonst kann ich dir nichts mehr dazu sagen.
- überlegen, das man gescheite Regel für keeps und breaks schreibt.
kannst du das ein wenig ausführen? Ich habe keine Ahnung, was das bedeutet.
Ich meine eine Mischung aus break-after, break-before, keep-together, ... und orphans und widows für deine Block-Elemente.
http://www.w3.org/TR/xsl/slice7.html#section-N43268-Keeps-and-Breaks-Properties
margin-bottom="" oder space-after="" (z.B: space-after.minimum=10pt, space-after.optimum=12pt, space-after.maximum=14pt,) für fo:list-item definieren.
Das ist sicher die sinnvollste Möglichkeit, aber ich möchte den Zeilenumbruch nur erzeugen, wenn ein br im XML steht.
Gut, aber was ist z.B. mit einem:
<fo:block space-after.minimum="10pt" space-after.optimum="12pt" space-after.maximum="14pt"></fo:block> für die <br />s?
Grüße
Thomas
Hi,
<fo:external-graphic width="100%" content-width="scale-to-fit" content-height="100%" scaling="uniform" ... />
[ERROR] Error in height property value '100%': org.apache.fop.fo.expr.PropertyException: No conversion defined
[ERROR] Error in content-height property value 'scale-to-fit': org.apache.fop.fo.expr.PropertyException: No conversion defined
[ERROR] Error in content-width property value '100%': org.apache.fop.fo.expr.PropertyException: No conversion definedWelche FOP-Version, laut ihre eigene Liste http://xmlgraphics.apache.org/fop/compliance.html#fo-property-content-height unterstützt der 0.91 oder 0.92 beta diese Eigenschaft. (der 0.20.5 ist wirklich sehr beschränkt)
Danke für idese Information. Werde ich an den Administrator weitergeben.
- Ich möchte den Text auf einigen Seiten vertikal zentriert oder vertikal unten ausrichten.
<fo:region-body display-align="after" ...> sollte das tun.Tut nicht. Ich habe das meinem region-body zugewiesen, es hat sich aber nichts geändert.
Das hätte eigentlich den Inhalt der Seite unten ausrichten müssen, es sei denn die Seite ist voll.
Das war sie nicht.
margin-bottom="" oder space-after="" (z.B: space-after.minimum=10pt, space-after.optimum=12pt, space-after.maximum=14pt,) für fo:list-item definieren.
Das ist sicher die sinnvollste Möglichkeit, aber ich möchte den Zeilenumbruch nur erzeugen, wenn ein br im XML steht.
Gut, aber was ist z.B. mit einem:
<fo:block space-after.minimum="10pt" space-after.optimum="12pt" space-after.maximum="14pt"></fo:block> für die <br />s?
<ul><li>foo</li></ul><br /><ul><li>bar</li></ul>
ist nicht unterscheidbar von
<ul><li>foo</li><li>bar</li></ul>
Schöne Grüße
Julian
Hallo,
Das ist sicher die sinnvollste Möglichkeit, aber ich möchte den Zeilenumbruch nur erzeugen, wenn ein br im XML steht.
Gut, aber was ist z.B. mit einem:
<fo:block space-after.minimum="10pt" space-after.optimum="12pt" space-after.maximum="14pt"></fo:block> für die <br />s?<ul><li>foo</li></ul><br /><ul><li>bar</li></ul>
ist nicht unterscheidbar von
<ul><li>foo</li><li>bar</li></ul>
- auch nicht mit deinem Code für's br.
Irgendwas ist ist an deinem FOP sehr merkwürdig, normalerweise geht die eine oder andere Lösung.
Dann versuche mal mit einer Abfrage im Template für <ul>.
<xsl:template match="ul">
<xsl:if test="preceding-sibling::br">
<xsl:attribute name="margin-top">12pt</xsl:attribute>
</xsl:if>
</xsl:template>
Was anderes fällt mir nicht mehr ein.
Grüße
Thomas
Hi,
Irgendwas ist ist an deinem FOP sehr merkwürdig, normalerweise geht die eine oder andere Lösung.
ja. Irgendwas ist merkwürdig. Einige Beispiele aus meinem Buch laufen auch nicht. Das Problem ist, dass ich beim Arbeitgeber nicht die Softwareinstallationen verwalte, sondern ein Administrator das zentral für alle Rechner tut - und der will keine Betasoftware installieren. Danke dir für die vielen Tipps.
Schöne Grüße
Julian
Hallo,
sondern ein Administrator das zentral für alle Rechner tut - und der will keine Betasoftware installieren.
Ah!? Ihr seid ein Firma wo es kein Windows gibt!?
(wenn der Admin mal einen Exchange-Server aufgesetzt hat, weiss er was echte Beta-Software ist) *scnr*
Grüße
Thomas
Hi,
sondern ein Administrator das zentral für alle Rechner tut - und der will keine Betasoftware installieren.
Ah!? Ihr seid ein Firma wo es kein Windows gibt!?
(wenn der Admin mal einen Exchange-Server aufgesetzt hat, weiss er was echte Beta-Software ist) *scnr*
hihi. Hat er glaub ich nicht. Sind über 10 Debian-Rechner, die zentral verwaltet werden.
Thomas
Schöne Grüße
Julian
Hi,
http://xmlgraphics.apache.org/fop/compliance.html#fo-property-display-align erklärt warum das display-align bei mir nichts gebracht hat. Gibt es auch eine Möglichkeit, display-align mit dem block-Element so zu nutzen, dass der gesamte Seiteninhalt vertikal mittig oder unten ausgerichtet ist?
Das mit dem br geht jetzt, es war mein Fehler, weil ich die zu verarbeitenden Tags bei <xsl:apply-templates... eingeschränkt hatte (schließlich war nicht geplant, dass br außerhalb eines text-Elements genutzt werden kann, um Abstand zwischen Bildern, Listen und Tabellen zu erzeugen).
Schöne Grüße
Julian
Hallo,
http://xmlgraphics.apache.org/fop/compliance.html#fo-property-display-align erklärt warum das display-align bei mir nichts gebracht hat. Gibt es auch eine Möglichkeit, display-align mit dem block-Element so zu nutzen, dass der gesamte Seiteninhalt vertikal mittig oder unten ausgerichtet ist?
Du kannst es ja versuchen was dort steht "[0.20.5] Implemented only for table-cell and block-container."
Also machst du ein <fo:block-container display-align="..."> und unterbringst darin den gesamten Seiteninhalt (und bei Bedarf kannst du dem ja auch eine Höhe geben, weil es ja den gesamten Platz in der Seite einnimmt)
Grüße
Thomas