2017-09-16 1 views
1

Ich versuche, einen Einzug von zwei Zeichen mit einer Schriftart mit fester Breite in einem XML-FO-Dokument zu erstellen. Ich übersetze es mit FOP.So geben Sie einen Einzug von 2ch in XML-FO mit FOP

Leider, wenn ich eine Länge wie "2ch" angeben, FOP diese Fehlermeldung erzeugt:

[ERROR] PropertyMaker - Unknown length unit 'ch' 

Die XML-FO-Dokumentation besagt, dass jede CSS bekannte Längeneinheit erlaubt ist, und CSS gibt an, dass ch das ist Breite des 0 Zeichen. Also AFAIU das sollte funktionieren und immer noch nicht.

Ich fand auch keine konkrete Liste der Längeneinheiten, die von FOP verstanden werden (die ix hat auch nicht funktioniert). Die em wird jedoch verstanden. Aber es stellt (sogar bei Verwendung des festen Monospaces mit fester Zeichenbreite) eine Breite von etwa 1,5 Zeichen dar.

Gibt es eine Möglichkeit anzugeben, einen Einzug von zwei Zeichen in Monospace zu haben?

Gibt es eine umfassende Liste von Längeneinheiten, die von FOP unterstützt werden?

Gibt es einen anderen Weg, um mein Ziel der Einrückung um eine konkrete Anzahl von Zeichen zu erreichen? Ich könnte einen Hack wie 1.3em verwenden, aber das ist wahrscheinlich nicht genau.

+0

Haben Sie eine Quelle für das Zitat haben _ "jede CSS - bekannte Längeneinheit ist erlaubt "_? Ich konnte es in der [XSL-Empfehlung] (https://www.w3.org/TR/xsl) nicht finden. – lfurini

+1

Ich googelte für 'xmlfo length units' und fand https://www.xml.com/pub/a/2001/01/17/xsl-fo/index.html wobei angegeben ist:" Die Einheiten unten sind alle in Zentimetern , aber Sie können jede der CSS-Einheiten verwenden, wie px (Pixel), pt (Punkt), em, in, mm usw. " Dann schaute ich nach 'css length units' und fand https://www.w3schools.com/cssref/css_units.asp, welches die 'ch'-Einheit angibt. – Alfe

Antwort

1

die Maßeinheiten in der XSL recommendation definiert sind:

  • cm (Zentimeter)
  • mm (Millimeter)
  • in (Zoll)
  • pt (Punkte)
  • pc (picas)
  • px (Pixel)
  • em (aktuelle font-size)

FOP unterstützt sie alle, mit dem Zusatz von mpt (Milli), aber keiner von ihnen, wie Sie bemerkt haben, beziehen sich auf die Breite ein Zeichen für eine Schriftart mit fester Schreibweise.

Andere Formatierer unterstützen möglicherweise zusätzliche Maßeinheiten, zum Beispiel sehe ich AntennaHouse XSLFormatter unterstützt ch.

mögliche Abhilfen für FOP

Wenn Sie nur ein text-indent (dnur für die erste Zeile) können Sie non-breaking Leerzeichen verwenden:

<fo:block>&#x00A0;&#x00A0;Lorem ipsum dolor ...</fo:block> 

Wenn Sie im Voraus wissen, dass der Block nur eine Zeile erzeugen, können Sie auch von erhalten regelmäßige Räume zur leichteren Lesbarkeit verwenden könnte FO-Datei:

<fo:block white-space-treatment="preserve" 
    white-space-collapse="false"> Lorem ipsum dolor ...</fo:block> 

im allgemeinsten Fall (wenn Sie möchten einen start-indent, end-indent, ... definieren), können Sie den genauen Wert mit den Schriftinformationen berechnen:

  1. die Font-Metriken erstellen

    java -classpath build/fop.jar:fop/lib/avalon-framework-api-4.3.1.jar:fop/lib/commons-logging-1.0.4.jar:fop/lib/commons-io-1.3.1.jar:fop/lib/xmlgraphics-commons-svn-trunk.jar org.apache.fop.fonts.apps.TTFReader -enc ansi /path/to/font.ttf metrics.xml

  2. offen metrics.xml und suchen Sie nach einem Element ähnlich wie <char idx="29" wdt="600"/> (der wdt Wert kann unterschiedlich sein, aber es sollte das gleiche für alle char Elemente sein)

  3. 10 ist die Breite eines Zeichens in Millipunkte: Multiplizieren Sie es für die font-size und die Anzahl der Zeichen, und Sie erhalten die Länge h Sie benötigen

Zum Beispiel: 600 x 12 x 2 = 14400mpt = 14.4pt = Länge von zwei Zeichen mit einer font-size 12pt

+0

Das ist ein Mist, aber danke für die ausführliche Antwort. Eigentlich werde ich bei meiner aktuellen Problemumgehung von '1.2em' bleiben, die genau zu dem Ergebnis führt, was '2ch' hätte sein sollen. Ich kann nicht so konkrete Dinge wie Font-Metriken verwenden, weil meine Sachen Schriften abstrahieren sollen. Auch die Quelle wird mehrere unterschiedlich formatierte PDFs erzeugen, daher sind auch keine Nbspaces möglich. Wenn es keine andere Antwort gibt (die ich bezweifle, da ich umfangreiche Recherchen angestellt habe), werde ich diese Antwort akzeptieren. Fühlen Sie sich frei, mich nach ein paar Tagen zu erinnern, falls ich es vergesse :-) – Alfe

Verwandte Themen