2015-01-08 26 views
6

Tôi vừa mới bắt đầu sử dụng Apache PDFBox và đã thử nghiệm các ví dụ khác nhau mà tôi đã tìm thấy.Cách chuyển sang dòng tiếp theo khi thêm văn bản bằng cách sử dụng Apache PDFBox

Tuy nhiên, tôi chưa thể tìm thấy một cách dễ dàng để chuyển sang dòng tiếp theo khi thêm văn bản.

Ví dụ:

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

Để thêm một dòng văn bản bên dưới tôi đã phải liên tục thử nghiệm với các giá trị của y trong moveTextPositionByAmount cho đến khi nó không được ghi đè lên các dòng trước đó.

Có cách nào trực quan hơn để tìm ra tọa độ của dòng tiếp theo không?

TIA

Trả lời

7

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 setLeadingnewLine 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");appendRawCommands("T*");

+0

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

+0

Tôi đã cập nhật câu trả lời trong mối quan tâm đó. – mkl

+0

Cảm ơn sự giúp đỡ. – ksl

0

thêm một dòng mới với offset tại trục y như

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(); 
Các vấn đề liên quan