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*");
Dzięki @mkl za odpowiedź. Nie ma metody PDPageContentStream o nazwie setLeading. Korzystam z wersji PDFBox 1.8.8. – ksl
Zaktualizowałem odpowiedź w tej sprawie. – mkl
Dzięki za pomoc. – ksl