Как узнать, где в itext7 установлены разрывы строк (дефис) - PullRequest
0 голосов
/ 30 апреля 2019

Как узнать, где установлены разрывы строк?

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) Я считаю ширинуword

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

3) if (widthWordsAllLine + font.getWidth (words.get (i), 22)> MAX) я делю слово.

4) Тогда я делаю все слова и делюслово добавить в абзац.и установите para.setMagrinLeft (10);

Я не описал все, потому что это заняло бы много времени

это работает, но если я добавлю новую функцию, все будетне работает (например, выравнивание текста).Может ли это быть реализовано по-другому?

1 Ответ

1 голос
/ 12 мая 2019

Мое понимание вопроса: цель состоит в добавлении случайных полей в каждую строку абзаца, чтобы при использовании рукописного шрифта он по-прежнему выглядел так, как будто текст был написан вручную. Также следует использовать переносы и, следовательно, оригинальный подход к попытке разбить текст на абзацы.

Однако решение может быть проще. Мы можем взять линии абзаца, которые должны быть нарисованы, и немного сдвинуть их непосредственно перед рисованием. Все функции, включая переносы, будут сохранены.

Это можно сделать с помощью специального средства визуализации следующим образом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...