API của PDFBox cho phép tạo nội dung ở mức độ thấp. Điều này ngụ ý rằng bạn phải làm (nhưng cũng là bạn được kích hoạt để làm) phần lớn các công việc bố trí chính mình, trong đó quyết định bao nhiêu để di chuyển xuống để có được đến đường cơ sở tiếp theo.
khoảng cách đó (gọi là hàng đầu trong bối cảnh này) phụ thuộc vào một số yếu tố:
- kích thước phông chữ được sử dụng (rõ ràng)
- cách chặt chẽ hay lỏng lẻo cách nhau các văn bản sẽ xuất hiện
- sự hiện diện của các phần tử trên các đường liên quan đến vị trí bên ngoài đường chuẩn, ví dụ superscript, subscript, công thức, ...
Tiêu chuẩn được bố trí sao cho chiều cao trên danh nghĩa của dòng cách nhau chặt chẽ của văn bản là 1 đơn vị cho một phông chữ được vẽ ở kích thước 1. Vì vậy, thông thường bạn sẽ sử dụng dẫn đầu gấp 1,.1,5 lần kích thước phông chữ trừ khi có tài liệu trên dòng vượt ra ngoài nó.
BTW, nếu bạn có để chuyển tiếp đến dòng kế tiếp bởi cùng một số lượng rất thường xuyên, bạn có thể sử dụng sự kết hợp của PDPageContentStream
phương pháp setLeading
và newLine
thay vì 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: Dường như moveTextPositionByAmount
sẽ không còn được dùng trong phiên bản 2.0.0 và được thay thế bằng newLineAtOffset
.
PPS: Khi OP chỉ trong một chú thích,
Không có phương pháp PDPageContentStream gọi setLeading. Tôi đang sử dụng phiên bản PDFBox 1.8.8.
Thật vậy, tôi đã xem phiên bản phát triển 2.0.0-SNAPSHOT hiện tại.Họ đang thực hiện như thế này:
/**
* 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*");
}
Người ta có thể dễ dàng thực hiện các phương pháp helper bên ngoài thực hiện tương đương sử dụng appendRawCommands((float) leading); appendRawCommands(" TL");
và appendRawCommands("T*");
Cảm ơn này @mkl cho câu trả lời của bạn. Không có phương thức PDPageContentStream nào được gọi là setLeading. Tôi đang sử dụng phiên bản PDFBox 1.8.8. – ksl
Tôi đã cập nhật câu trả lời trong mối quan tâm đó. – mkl
Cảm ơn sự giúp đỡ. – ksl