itext7-如何在PDF中绘制水平虚线?

时间:2019-12-22 12:16:32

标签: java pdf kotlin itext7

我正在使用itext7的社区版本(版本7.1.9)。 我想创建一个PDF文档,在其中插入文本段落和水平分隔符,如下所示:

some interesting text
-----------
more interesting text
-----------
still interesting text
-----------
you get the idea
-----------

要实现此文档结构,我将ParagraphLineSeparator类结合使用DashedLinesome interesting text ||||||||||||| more interesting text ||||||||||||| 。但是,即使使用最少的示例,各个破折号也只能是垂直,例如:

width

整个分隔符仍在水平运行,但是传递import com.itextpdf.io.font.constants.StandardFonts import com.itextpdf.kernel.font.PdfFontFactory import com.itextpdf.kernel.pdf.PdfDocument import com.itextpdf.kernel.pdf.PdfWriter import com.itextpdf.kernel.pdf.canvas.draw.DashedLine import com.itextpdf.layout.Document import com.itextpdf.layout.element.LineSeparator import com.itextpdf.layout.element.Paragraph import java.io.File object DashedLineBugReproduction { private fun render() { val docWriter = PdfWriter(File("/tmp/foobar_dashes.pdf")) val document = PdfDocument(docWriter) document.writeContents() document.close() } fun PdfDocument.writeContents() { val doc = Document(this) val font = PdfFontFactory.createFont(StandardFonts.TIMES_ROMAN) val dashedLine = LineSeparator(DashedLine(30f)) val paragraph = Paragraph("Lorem ipsum dolor sit amet.") .setFont(font) .setFontSize(20f) doc.add(dashedLine) for (i in 0 until 8) { doc.add(paragraph) doc.add(dashedLine) } doc.close() } @JvmStatic fun main(args: Array<String>) { render() } } 参数(如Javadoc所定义)似乎实际上为行赋予了 height 。我在这里做错什么了吗?

我怎么做才能生成水平虚线的分隔符,其中虚线本身也是水平的(宽度为30.0是一个通用示例)?

最小复制示例(科特琳):

{{1}}

生成的输出文件(截图,如果需要,我可以提供PDF): problematic output

1 个答案:

答案 0 :(得分:2)

width参数不会设置线段的宽度,而是设置恰好由线段组成的水平线的宽度,因此在那里没有错误。

默认情况下,线段之间的距离无法在DashedLine中进行配置,但是您可以创建自己的类并覆盖draw操作以创建自己的外观。

如果您希望行包含更长的段,则可以使用unitsOn方法的unitsOffphasesetLineDash参数。这只是参考实现和视觉效果:

private static class CustomDashedLine extends DashedLine {
    public CustomDashedLine(float lineWidth) {
        super(lineWidth);
    }

    @Override
    public void draw(PdfCanvas canvas, Rectangle drawArea) {
        canvas.saveState()
                .setLineWidth(getLineWidth())
                .setStrokeColor(getColor())
                .setLineDash(20, 4, 2)
                .moveTo(drawArea.getX(), drawArea.getY() + getLineWidth() / 2)
                .lineTo(drawArea.getX() + drawArea.getWidth(), drawArea.getY() + getLineWidth() / 2)
                .stroke()
                .restoreState();
    }
}

在创建LineSeparator时只需使用此新实现:

LineSeparator dashedLine = new LineSeparator(new CustomDashedLine(3f));

结果如下:

result