如何找出 itext7 中设置换行符(连字符)的位置

How to find out where line breaks(hyphen) are set in itext7

如何找出设置换行符的位置?

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));

Document doc = new Document(pdfDoc, PageSize.A4);

Paragraph paragraph = new Paragraph()
            .setHyphenation(new HyphenationConfig("en", "EN", 2, 2))
            .add(new Text(bigString));

doc.add(paragraph);

doc.close();

在左边,一切都从同一层开始。:

我想将连字符后的边距更改为每行边距不同:

我能找到连字符前的那一行和连字符的宽度吗?

我是这样做的:

1) 找出页面的宽度

MAX =  doc.getPdfDocument().getDefaultPageSize().getWidth() - (doc.getLeftMargin() + doc.getRightMargin());

2) 我算宽字

widthWordsAllLine +=  font.getWidth(words.get(i),22);

3) if (widthWordsAllLine + font.getWidth(words.get(i),22)> MAX) i 分词 .

4) 然后我把每个词和分词加到段落中。并设置 paragraph.setMagrinLeft(10);

我没有描述所有内容,因为这会花费很多时间

它可以工作,但是如果我添加一个新功能,一切都将无法工作(例如文本对齐)。能否以不同方式实施?

我对这个问题的理解:目标是为段落的每一行添加随机边距,这样当使用 handwritten-like 字体时,它仍然看起来像文本是手动编写的。还应使用连字符,因此尝试将文本分成段落的原始方法。

不过,解决方案可以更简单。我们可以将要绘制的段落的线条在绘制之前稍微移动一下。包括断字在内的所有功能都将被保留。

可以通过以下方式使用自定义渲染器完成:

private static class CustomParagraphRenderer extends ParagraphRenderer {
    public CustomParagraphRenderer(Paragraph modelElement) {
        super(modelElement);
    }

    @Override
    public void drawChildren(DrawContext drawContext) {
        Random r = new Random();
        if (lines != null) {
            for (LineRenderer line : lines) {
                int leftMargin = r.nextInt(10);
                line.move(leftMargin, 0);
                line.draw(drawContext);
            }
        }
    }

    @Override
    public IRenderer getNextRenderer() {
        return new CustomParagraphRenderer((Paragraph) modelElement);
    }
}

然后将它应用到段落很容易:

Paragraph paragraph = new Paragraph(longStr);
paragraph.setHyphenation(new HyphenationConfig("en", "US", 2, 2));
paragraph.setNextRenderer(new CustomParagraphRenderer(paragraph));

我得到的结果是这样的: