我无法通过在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();
}
}
由于
答案 0 :(得分:3)
使用PdfContentByte.showTextAligned()
让自己变得困难。你有什么理由不想使用ColumnText
吗?
使用PdfContentByte
,您必须处理文字状态 - beginText()
和endText()
- 字体 - setFontAndSize()
- ,并且您只能添加String
}值。如果您想添加行(例如加下划线),则需要moveTo()
,lineTo()
,stroke()
操作。这些运算符需要坐标,因此您需要使用BaseFont
结合String
和字体大小来衡量行的大小。有一些数学参与。
如果您使用ColumnText
,则可以选择使用ColumnText.showTextAligned()
一次添加一行。或者您可以使用setSimpleColumn()
定义列,并让iText负责在不同的行上分发文本。在这两种情况下,您都不必担心处理文本状态,也不必担心字体和大小。 ColumnText
接受Phrase
个对象,这些对象由Chunk
个对象组成,您可以为其定义下划线和上划线值。在这种情况下,iText会为您完成所有数学运算。