如何设置下划线到PdfContentByte - iText

时间:2012-11-03 06:16:43

标签: java pdf fonts itext

我无法通过在iText中使用PdfContentByte来设置下划线和上划线。我想在sectionArea == 1 ||中为所有字段设置下划线在getFontForFormat中提到的区域== 3。到目前为止,我只能做大胆的风格,我需要强调和强调。 这是代码:

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;
}

提前致谢

编辑(Bruno 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();
             }
    }

由于

1 个答案:

答案 0 :(得分:3)

使用PdfContentByte.showTextAligned()让自己变得困难。你有什么理由不想使用ColumnText吗?

使用PdfContentByte,您必须处理文字状态 - beginText()endText() - 字体 - setFontAndSize() - ,并且您只能添加String }值。如果您想添加行(例如加下划线),则需要moveTo()lineTo()stroke()操作。这些运算符需要坐标,因此您需要使用BaseFont结合String和字体大小来衡量行的大小。有一些数学参与。

如果您使用ColumnText,则可以选择使用ColumnText.showTextAligned()一次添加一行。或者您可以使用setSimpleColumn()定义列,并让iText负责在不同的行上分发文本。在这两种情况下,您都不必担心处理文本状态,也不必担心字体和大小。 ColumnText接受Phrase个对象,这些对象由Chunk个对象组成,您可以为其定义下划线和上划线值。在这种情况下,iText会为您完成所有数学运算。