如何创建自定义虚线分隔符?
How to create a custom dashed line separator?
使用 DottedLineSeparator class 我可以在 itext 中绘制虚线分隔符。同样,是否可以在 PdfPCell 中绘制连续的连字符,如“--------------------”作为分隔符?
我检查了示例 here。还有其他可用的解决方案吗?
LineSeparator
class 可以用来画水平实线。作为 HTML 中的 <hr>
标签的等价物,或者作为同一行两部分文本之间的分隔符。 DottedLineSeparator
扩展了 LineSeparator
class 并绘制了一条虚线而不是实线。您可以通过更改线宽来定义点的大小,并获得一种定义点之间间隙的方法。
您需要一条虚线,创建您自己的 LineSeparator
实现非常容易。最简单的方法是像这样扩展 DottedLineSeparator
class:
class CustomDashedLineSeparator extends DottedLineSeparator {
protected float dash = 5;
protected float phase = 2.5f;
public float getDash() {
return dash;
}
public float getPhase() {
return phase;
}
public void setDash(float dash) {
this.dash = dash;
}
public void setPhase(float phase) {
this.phase = phase;
}
public void draw(PdfContentByte canvas, float llx, float lly, float urx, float ury, float y) {
canvas.saveState();
canvas.setLineWidth(lineWidth);
canvas.setLineDash(dash, gap, phase);
drawLine(canvas, llx, urx, y);
canvas.restoreState();
}
}
如您所见,我们引入了两个额外的参数,一个 dash
值和一个 phase
值。 dash
值定义了 hyphen
的长度。 phase
值告诉 iText 从哪里开始(例如,以半个连字符开始)。
请查看 CustomDashedLine 示例。在此示例中,我使用 LineSeparator
的自定义实现,如下所示:
CustomDashedLineSeparator separator = new CustomDashedLineSeparator();
separator.setDash(10);
separator.setGap(7);
separator.setLineWidth(3);
Chunk linebreak = new Chunk(separator);
document.add(linebreak);
结果是一条带连字符的虚线,长 10pt,厚 3pt,间距 7pt。第一个破折号只有 7.5pt 长,因为我们没有更改 phase
值。在我们的自定义实现中,我们定义了一个 2.5pt 的相位,这意味着我们从 2.5pt 开始 10pt 的连字符,结果是一个长度为 7.5pt 的连字符。
您可以像使用 DottedLineSeparator
一样使用此自定义 LineSeparator
,例如作为 PdfPCell
.
中的 Chunk
double wPage = doc.PageSize.Width;
double hPage = doc.PageSize.Height;
cb.MoveTo(0,hPage/2);
for (int i = 0; i < wPage; i+=5)
{
cb.LineTo(i, hPage / 2);
i += 5;
cb.MoveTo(i, hPage / 2);
}
这是 :))
的解决方案
使用 DottedLineSeparator class 我可以在 itext 中绘制虚线分隔符。同样,是否可以在 PdfPCell 中绘制连续的连字符,如“--------------------”作为分隔符?
我检查了示例 here。还有其他可用的解决方案吗?
LineSeparator
class 可以用来画水平实线。作为 HTML 中的 <hr>
标签的等价物,或者作为同一行两部分文本之间的分隔符。 DottedLineSeparator
扩展了 LineSeparator
class 并绘制了一条虚线而不是实线。您可以通过更改线宽来定义点的大小,并获得一种定义点之间间隙的方法。
您需要一条虚线,创建您自己的 LineSeparator
实现非常容易。最简单的方法是像这样扩展 DottedLineSeparator
class:
class CustomDashedLineSeparator extends DottedLineSeparator {
protected float dash = 5;
protected float phase = 2.5f;
public float getDash() {
return dash;
}
public float getPhase() {
return phase;
}
public void setDash(float dash) {
this.dash = dash;
}
public void setPhase(float phase) {
this.phase = phase;
}
public void draw(PdfContentByte canvas, float llx, float lly, float urx, float ury, float y) {
canvas.saveState();
canvas.setLineWidth(lineWidth);
canvas.setLineDash(dash, gap, phase);
drawLine(canvas, llx, urx, y);
canvas.restoreState();
}
}
如您所见,我们引入了两个额外的参数,一个 dash
值和一个 phase
值。 dash
值定义了 hyphen
的长度。 phase
值告诉 iText 从哪里开始(例如,以半个连字符开始)。
请查看 CustomDashedLine 示例。在此示例中,我使用 LineSeparator
的自定义实现,如下所示:
CustomDashedLineSeparator separator = new CustomDashedLineSeparator();
separator.setDash(10);
separator.setGap(7);
separator.setLineWidth(3);
Chunk linebreak = new Chunk(separator);
document.add(linebreak);
结果是一条带连字符的虚线,长 10pt,厚 3pt,间距 7pt。第一个破折号只有 7.5pt 长,因为我们没有更改 phase
值。在我们的自定义实现中,我们定义了一个 2.5pt 的相位,这意味着我们从 2.5pt 开始 10pt 的连字符,结果是一个长度为 7.5pt 的连字符。
您可以像使用 DottedLineSeparator
一样使用此自定义 LineSeparator
,例如作为 PdfPCell
.
Chunk
double wPage = doc.PageSize.Width;
double hPage = doc.PageSize.Height;
cb.MoveTo(0,hPage/2);
for (int i = 0; i < wPage; i+=5)
{
cb.LineTo(i, hPage / 2);
i += 5;
cb.MoveTo(i, hPage / 2);
}
这是 :))
的解决方案