首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >itext7 -如何在PDF中绘制水平虚线?

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

Stack Overflow用户
提问于 2019-12-22 12:16:32
回答 1查看 2.6K关注 0票数 0

我使用的是itext7的社区版本(7.1.9版本)。我想创建一个PDF文档,在其中插入文本段落,并在其中插入一个横向分隔符:

代码语言:javascript
运行
复制
some interesting text
-----------
more interesting text
-----------
still interesting text
-----------
you get the idea
-----------

为了实现这个文档结构,我使用ParagraphLineSeparatorDashedLine类结合使用。然而,即使用一个最小的例子,单独的破折号最终也会变成垂直,如下所示:

代码语言:javascript
运行
复制
some interesting text
|||||||||||||
more interesting text
|||||||||||||

整体分隔符仍然水平运行,但是传递一个width参数(如Javadoc中定义的)似乎实际上给了行高度。我在这里做错什么了吗?

如何生成带有水平虚线的分隔符,其中虚线本身也是水平的(宽度为30.0是一个通用示例)?

最小复制示例(Kotlin):

代码语言:javascript
运行
复制
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()
    }
}

结果输出文件(屏幕截图,如果需要,我可以提供PDF ):

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-25 17:47:08

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

默认情况下,段之间的距离在DashedLine中是不可配置的,但是您可以创建自己的类并重写draw操作来创建自己的外观。

如果您希望您的行包含较长的段,则可以使用unitsOnunitsOffsetLineDash方法的phase参数。这里只是一个参考实现和可视化结果:

代码语言:javascript
运行
复制
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时只需使用此新实现即可

代码语言:javascript
运行
复制
LineSeparator dashedLine = new LineSeparator(new CustomDashedLine(3f));

结果如下:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59444114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档