gpt4 book ai didi

java - 如何为 PdfContentByte 设置下划线——iText

转载 作者:行者123 更新时间:2023-11-29 05:53:01 26 4
gpt4 key购买 nike

我在使用 iText 中的 PdfContentByte 设置下划线和上划线时遇到了问题。我想为 sectionArea == 1 || 中的所有字段设置下划线getFontForFormat 中提到的 Area == 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();
}
}

谢谢

最佳答案

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

使用 PdfContentByte,您必须处理文本状态 —beginText()endText()—,字体 — setFontAndSize()—,你只能添加String值。如果要添加线条(例如加下划线),则需要 moveTo()lineTo()stroke() 操作。这些运算符需要坐标,因此您需要使用 BaseFont 结合 String 和字体大小来测量线条的大小。这涉及到一些数学。

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

关于java - 如何为 PdfContentByte 设置下划线——iText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13206578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com