2012-11-03 83 views
1

我無法通過在iText中使用PdfContentByte設置下劃線和上劃線。我想爲sectionArea == 1 ||中的所有字段設置下劃線如getFontForFormat中所提到的區域== 3。到目前爲止,我只能做大膽的風格,我需要它被強調和劃線。 下面是代碼:如何設置下劃線爲PdfContentByte - iText

public void doOutputField(Field field) { 
    String fieldAsString = field.toString(); 
    BaseFont baseFont = getFontForFormat(field); 
    float fontSize = 11; 

    Point bottomLeft = bottomLeftOfField(field, 11, baseFont); 

    int align; 

    align = PdfContentByte.ALIGN_LEFT; 

    //PdfContentByte content 
    content.beginText(); 
    content.setFontAndSize(baseFont, fontSize); 

    content.setColorFill(Color.BLACK); 

    double lineHeight = field.getOutputHeight(); 

    content.showTextAligned(align, fieldAsString, (float) bottomLeft.x, 
       (float) bottomLeft.y, 0f); 

    bottomLeft.y -= lineHeight; 

    content.endText(); 
} 

public BaseFont getFontForFormat(Field field) { 

    try { 
     if (field.getSection().getArea().getArea() == 1 
       || field.getSection().getArea().getArea() == 3) { 
      BaseFont bf = BaseFont.createFont(BaseFont.TIMES_BOLD, 
        BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
      return bf; 
     } else { 
      BaseFont bf = BaseFont.createFont("Times-Roman", 
        BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
      return bf; 
     } 
    } catch (Exception e) { 
    } 
    return null; 
} 

在此先感謝

編輯(由布魯諾Lowagie解決):

這個問題可以通過利用ColumnText來解決。

if (field.getSection().getArea().getArea() == 1 
      || field.getSection().getArea().getArea() == 3) { 

     Chunk chunk = new Chunk(fieldAsString); 
     chunk.setUnderline(+1f, -2f); 

     if (field.getSection().getArea().getArea() == 3) { 
      chunk.setUnderline(+1f, (float) field.getBoundHeight()); 
     } 

      Font font = new Font(); 
      font.setFamily("Times Roman"); 
      font.setStyle(Font.BOLD); 
      font.setSize((float) 11); 
      chunk.setFont(font); 

      Paragraph p = new Paragraph(); 
      p.add(chunk); 

     ColumnText ct = new ColumnText(content); 
     ct.setSimpleColumn(p, (float)bottomLeft.x, (float)bottomLeft.y, 
      (float)field.getBoundWidth() + (float)bottomLeft.x, 
      (float)field.getBoundHeight() + (float)bottomLeft.y, 
      (float)lineHeight, align); 
      try { 
      ct.go(); 
      } catch (DocumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
    } 

感謝

回答

3

你自己因此很難用PdfContentByte.showTextAligned()。你有什麼理由不使用ColumnText

隨着PdfContentByte,你必須處理的文本狀態 - beginText()endText() - ,字體 - setFontAndSize() - ,你只能添加String值。如果要添加行(例如加下劃線),則需要moveTo(),lineTo(),stroke()操作。這些操作員需要座標,因此您需要使用BaseFont結合String和字體大小來測量線條的大小。有一些數學涉及。

如果您使用ColumnText,則可以使用ColumnText.showTextAligned()一次添加一行。或者您可以使用setSimpleColumn()來定義一個列,並讓iText負責將文本分佈在不同的行上。在這兩種情況下,您不必擔心處理文本狀態,也不必擔心字體和大小。 ColumnText接受Phrase對象,並且這些對象由Chunk對象組成,您可以爲其定義下劃線和上劃線值。在這種情況下,iText會爲你做所有的數學。

+0

是的..我剛剛發現了答案也是通過使用columnText,因爲你說..我仍然有問題與超線雖然..任何想法? 我會發布我上面的當前解決方案.. 謝謝.. –

+0

請下載http://www.manning.com/lowagie2/samplechapter2.pdf並尋找setUnderline()方法。我引用:「使用Chunk.setUnderline()方法,可以設置線條粗細(在 示例中爲0.2 pt)和Y位置(在本例中爲基線之下2 pt)。位置允許您使用相同的方法通過塊創建一條線。「我可以補充說:它允許你使用相同的方法在Chunk上劃線。 –

+0

現在所有的作品..非常感謝..:D –