2015-01-08 6 views
6

Ich habe gerade mit Apache PDFBox begonnen und experimentiere mit verschiedenen Beispielen, die ich gefunden habe.So gehen Sie beim Hinzufügen von Text mit Apache PDFBox in die nächste Zeile

Allerdings konnte ich keine einfache Möglichkeit finden, um in die nächste Zeile zu verschieben, wenn Sie Text hinzufügen.

z.

PDPageContentStream content = new PDPageContentStream(document, page); 
PDFont font = PDType1Font.HELVETICA; 
content.beginText(); 
content.setFont(font, 12); 
content.moveTextPositionByAmount(x, y); 
content.drawString("Some text."); 
content.endText(); 

Um eine weitere Textzeile hinzufügen, darunter I in moveTextPositionByAmount mit dem Wert von y Experiment wiederholt hatte, bis er nicht die vorherige Zeile zu überschreiben wurde.

Gibt es eine intuitivere Möglichkeit herauszufinden, wie die Koordinaten der nächsten Linie sind?

TIA

Antwort

7

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*");

+0

Dank @mkl für Ihre Antwort. Es gibt keine PDPageContentStream-Methode namens setLeading. Ich verwende PDFBox Version 1.8.8. – ksl

+0

Ich aktualisierte die Antwort in diesem Anliegen. – mkl

+0

Danke für die Hilfe. – ksl

0

eine neue Zeile hinzufügen, mit in y-Achse versetzt wie dieses

PDPageContentStream content = new PDPageContentStream(document, page); 
PDFont font = PDType1Font.HELVETICA; 
content.beginText(); 
content.setFont(font, 12); 
// by default y = 0 pdf text start in the left bottom corner 
// so you may need to put y = 700 or something to see the new line below 
content.moveTextPositionByAmount(x, y); 
content.drawString("Some text."); 
content.newLineAtOffset(0, -15); 
content.drawString("some text "); 
content.endText(); 
Verwandte Themen