2015-01-08 11 views
6

Właśnie zacząłem używać Apache PDFBox i eksperymentowałem z różnymi przykładami, które znalazłem.Jak przejść do następnego wiersza podczas dodawania tekstu za pomocą Apache PDFBox

Jednak nie udało mi się znaleźć łatwego sposobu przejścia do następnego wiersza podczas dodawania tekstu.

E.g.

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(); 

dodać jeden tekstu pod miałem wielokrotnie eksperyment z wartości y w moveTextPositionByAmount dopóki nie zostanie zastąpione poprzedniego wiersza.

Czy istnieje bardziej intuicyjny sposób określania współrzędnych następnej linii?

TIA

Odpowiedz

7

PDFBox API umożliwia generowanie treści niskiego poziomu. Oznacza to, że musisz zrobić (ale także, że jesteś w stanie to zrobić) znaczną część pracy nad układem, między tym decydując o tym, jak bardzo należy przejść w dół, aby przejść do następnej linii bazowej.

To odległość (tzw wiodącym w tym kontekście) zależy od wielu czynników:

  • rozmiar czcionki używany (oczywiście)
  • jak mocno lub luźno rozstawione widnieje tekst
  • obecność elementów na liniach biorących udział poza prostą, np Indeksy górne, dolne, wzory ...

standardzie jest umieszczony tak, że wysokość nominalna ciasno rozmieszczonych linii tekstu jest 1 jednostka dla czcionki sporządzonej w rozmiarze 1. Zwykle zatem użyjesz przewodzenie 1,1,5-krotności rozmiaru czcionki, chyba że w linii znajdującej się poza nią znajduje się materiał.

BTW, jeśli trzeba bardzo często przesyła do następnej linii przez tę samą kwotę można wykorzystać kombinację PDPageContentStream metod setLeading i newLine zamiast moveTextPositionByAmount:

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: To wygląda podobnie jak moveTextPositionByAmount zostanie uznane za przestarzałe w wersji 2.0.0 i zostanie zastąpione przez newLineAtOffset.

PPS: Jak PO wskazuje w komentarzu,

Nie ma metody PDPageContentStream nazywa setLeading. Korzystam z wersji PDFBox 1.8.8.

Rzeczywiście, patrzyłem na aktualną wersję rozwojową 2.0.0-SNAPSHOT.Są one obecnie wdrażane tak:

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

Można łatwo wdrożyć zewnętrzne metody pomocnika robi równowartość korzystając appendRawCommands((float) leading); appendRawCommands(" TL"); i appendRawCommands("T*");

+0

Dzięki @mkl za odpowiedź. Nie ma metody PDPageContentStream o nazwie setLeading. Korzystam z wersji PDFBox 1.8.8. – ksl

+0

Zaktualizowałem odpowiedź w tej sprawie. – mkl

+0

Dzięki za pomoc. – ksl

0

dodać nową linię z przesunięciem w osi y jak to

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(); 
Powiązane problemy