Die PDFBox-API ermöglicht die Erzeugung von Inhalten auf niedriger Ebene. Dies bedeutet, dass Sie einen Großteil des Layouts selbst erledigen müssen (aber auch, dass Sie dazu in der Lage sind), und entscheiden Sie selbst, wie weit Sie nach unten gehen müssen, um zur nächsten Baseline zu gelangen.
Dieser Abstand (genannt führende in diesem Zusammenhang) hängt von einer Reihe von Faktoren ab:
- die Schriftgröße (natürlich) verwendet
- , wie eng oder lose Abstand der Text erscheinen soll
- das Vorhandensein von Elementen auf den beteiligten Linien außerhalb der regulären Linie, z hochgestellten Indizes, tiefgestellten Indizes, Formeln, ...
Der Standard ist so angeordnet, dass die Nennhöhe von eng beabstandeten Linien von Text 1 Einheit für eine Schriftart in Größe 1. Somit ist in der Regel gezogen werden Sie verwenden ein Vorlauf von 1..1.5 Mal der Schriftgröße, es sei denn, es gibt Material auf der Linie, das darüber hinausgeht.
BTW, wenn Sie sehr oft in die nächste Zeile um den gleichen Betrag zu übermitteln haben, können Sie die Kombination der PDPageContentStream
Methoden setLeading
und newLine
statt moveTextPositionByAmount
verwenden:
content.setFont(font, 12);
content.setLeading(14.5f);
content.moveTextPositionByAmount(x, y);
content.drawString("Some text.");
content.newLine();
content.drawString("Some more text.");
content.newLine();
content.drawString("Still some more text.");
PS: Es sieht aus wie moveTextPositionByAmount
wird in der Version 2.0.0 veraltet sein und durch newLineAtOffset
ersetzt werden.
PPS: Da der OP zeigt in einem Kommentar,
Es gibt keine PDPageContentStream Methode setLeading genannt. Ich verwende PDFBox Version 1.8.8.
Tatsächlich schaute ich auf die aktuelle 2.0.0-SNAPSHOT-Entwicklungsversion.Sie sind derzeit wie folgt umgesetzt:
/**
* Sets the text leading.
*
* @param leading The leading in unscaled text units.
* @throws IOException If there is an error writing to the stream.
*/
public void setLeading(double leading) throws IOException
{
writeOperand((float) leading);
writeOperator("TL");
}
/**
* Move to the start of the next line of text. Requires the leading to have been set.
*
* @throws IOException If there is an error writing to the stream.
*/
public void newLine() throws IOException
{
if (!inTextMode)
{
throw new IllegalStateException("Must call beginText() before newLine()");
}
writeOperator("T*");
}
Man kann externe Hilfsmethoden leicht implementieren das Äquivalent zu tun mit appendRawCommands((float) leading); appendRawCommands(" TL");
und appendRawCommands("T*");
Dank @mkl für Ihre Antwort. Es gibt keine PDPageContentStream-Methode namens setLeading. Ich verwende PDFBox Version 1.8.8. – ksl
Ich aktualisierte die Antwort in diesem Anliegen. – mkl
Danke für die Hilfe. – ksl