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

时间:2019-04-30 11:17:40

标签: java pdf itext 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();

在左侧,所有内容均从同一级别开始。

enter image description here

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

enter image description here

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

我是这样做的:

1)找出页面的宽度

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

2)我数了个宽字

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

3)如果(widthWordsAllLine + font.getWidth(words.get(i),22)> MAX)我将单词除。

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

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

它可以工作,但是如果我添加了一项新功能,则所有功能都将无法工作(例如,文本对齐)。可以以其他方式实施吗?

1 个答案:

答案 0 :(得分:1)

我对问题的理解:目标是在段落的每一行中添加随机页边距,以便在使用类似手写字体的字体时,它看起来仍像是手动编写的文本。还应使用连字符,因此是尝试将文本分成段落的原始方法。

但是,解决方案可以更简单。我们可以采用将要绘制的段落的行,并在绘制之前将其稍稍移动。包括连字符在内的所有功能都将保留。

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

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));

我得到的结果如下:

output PDF