2013-06-18 33 views
6

Có một phương pháp trong lớp phông chữ của PDFBox, PDFont, có tên getFontHeight, âm thanh đủ đơn giản. Tuy nhiên tôi không hoàn toàn hiểu tài liệu và các tham số đó là gì.Lấy chiều cao phông chữ của một ký tự trong PDFBox

getFontHeight Điều này sẽ nhận được chiều rộng phông chữ cho một ký tự.

Tham số:

  • c - Các mã ký tự để có được chiều rộng cho.
  • offset - Giá trị bù vào mảng. dài
  • Độ dài của dữ liệu.

Returns: Chiều rộng là vào năm 1000 đơn vị của không gian văn bản, tức là 333 hoặc 777

là phương pháp này một quyền sử dụng để có được chiều cao của một nhân vật trong PDFBox và nếu như vậy làm sao? Có một số loại mối quan hệ giữa chiều cao phông chữ và cỡ chữ tôi có thể sử dụng thay thế không?

Trả lời

6

Tôi tin rằng câu trả lời được đánh dấu đúng yêu cầu làm rõ thêm.Không có "lỗi" cho mỗi phông chữ cho getHeight() và do đó tôi tin rằng nó không phải là một thực hành tốt bằng tay đoán hệ số cho mỗi phông chữ mới. Đoán nó có thể được tốt đẹp cho các mục đích của bạn chỉ cần sử dụng CapHeight thay vì chiều cao.

float height = (font.getFontDescriptor().getCapHeight())/1000 * fontSize; 

Điều đó sẽ trả lại giá trị tương tự như những gì bạn đang cố gắng sửa bằng cách sửa Chiều cao bằng 0,865 cho Helvetica. Nhưng nó sẽ phổ biến cho bất kỳ phông chữ nào.

Tài liệu PDFBox không giải thích quá nhiều về nó là gì. Nhưng bạn có thể xem hình ảnh trong bài viết Cap_height wikipedia để hiểu rõ hơn cách nó hoạt động và chọn tham số phù hợp với nhiệm vụ cụ thể của bạn.

https://en.wikipedia.org/wiki/Cap_height

7

EDIT: Chiều cao của nắp là thứ tôi đang tìm kiếm. Xem câu trả lời được chấp nhận.

Sau khi tìm hiểu thông qua nguồn của PDFBox, tôi thấy rằng điều này sẽ thực hiện thủ thuật tính chiều cao phông chữ.

int fontSize = 14; 
PDFont font = PDType1Font.HELVETICA; 
font.getFontDescriptor().getFontBoundingBox().getHeight()/1000 * fontSize 

Phương pháp này không hoàn hảo. Nếu bạn vẽ một hình chữ nhật với chiều cao 200 và Y với cỡ chữ 200 bạn sẽ có chiều cao phông chữ 231,2 được tính bằng phương pháp trên mặc dù nó thực sự được in nhỏ hơn hình chữ nhật.

Mỗi phông chữ có lỗi khác nhau nhưng với helvetica, nó gần với 13.5 trước đó quá độc lập với kích thước phông chữ. Vì vậy, để có được chiều cao font chữ phù hợp với helvetica làm việc này ...

font.getFontDescriptor().getFontBoundingBox().getHeight()/1000 * fontSize * 0.865 
0

đây là một phương pháp làm việc để tách các văn bản và tìm kiếm chiều cao

public float heightForWidth(float width) throws IOException { 
    float height = 0; 

    String[] split = getTxt().split("(?<=\\W)"); 
    int[] possibleWrapPoints = new int[split.length]; 
    possibleWrapPoints[0] = split[0].length(); 
    for (int i = 1; i < split.length; i++) { 
     possibleWrapPoints[i] = possibleWrapPoints[i - 1] + split[i].length(); 
    } 

    float leading = font.getFontDescriptor().getFontBoundingBox().getHeight()/1000 * fontSize; 
    int start = 0; 
    int end = 0; 
    for (int i : possibleWrapPoints) { 
     float w = font.getStringWidth(getTxt().substring(start, i))/1000 * fontSize; 
     if (start < end && w > width) { 
      height += leading; 
      start = end; 
     } 
     end = i; 
    } 

    height += leading; 
    return height + 3; 
} 
0

Đối với nhập khẩu True Type Fonts tổng chiều cao của font là

(org.apache.pdfbox.pdmodel.font.PDFont.getFontDescriptor().getDescent() + org.apache.pdfbox.pdmodel.font.PDFont.getFontDescriptor().getAscent() + org.apache.pdfbox.pdmodel.font.PDFont.getFontDescriptor().getLeading()) * point size * org.apache.pdfbox.pdmodel.font.PDFont.getFontMatrix().getValue(0, 0)

Bạn sẽ thấy rằng font.getFontDescriptor().getFontBoundingBox().getHeight() lớn hơn 20% so với giá trị trên vì nó bao gồm 20% dẫn đầu về giá trị trên, nhưng nếu bạn lấy giá trị cao nhất và loại bỏ 20%, phông chữ sẽ nằm ngay bên cạnh nhau mỗi khác

+0

Có nhiều vấn đề trong công thức của bạn: * (A) * ** Gốc ** là số âm; để công thức của bạn có nghĩa là giá trị tuyệt đối của nó (tức là '-... getFontDescriptor(). getDescent()') nên được sử dụng. * (B) * Để xác định ** Ascent ** chiều cao của glyphs cho các ký tự có dấu bị loại trừ; nếu bạn coi các ký tự có dấu trọng âm là một phần của phông chữ, do đó, công thức không thể đúng. Hơn nữa bạn bao gồm một 'điểm kích thước' mà không giải thích nó. Giá trị này không nhỏ. – mkl

Các vấn đề liên quan