IText - Расчет ширины элементов и текста внутри TagWorkers - PullRequest
1 голос
/ 05 июня 2019

В настоящее время я использую IText7 для преобразования файла HTML в PDF. Из-за особенностей приложения каждая строка текста в абзаце должна храниться в отдельной строке внутри своего собственного контейнера div, что вызывает проблемы, оправдывающие абзац в целом. Чтобы обойти это, мне нужно иметь возможность вручную измерить ширину контейнера div, а затем измерить ширину текстового содержимого внутри него, а затем применить обоснование на основе отношения, которое мы решим.

Часть, с которой я борюсь, состоит в том, как измерить ширину упомянутых выше элементов внутри конвейера IText. Я написал TagWorker, который будет запускаться при обнаружении элемента div с атрибутом «justify-text». Я надеялся, что смогу переопределить метод ProcessEnd, определить ширину элементов и действовать соответствующим образом, как бы я ни боролся чтобы узнать как. Я могу найти элементы, о которых идет речь, но расчет ширины - это проблема.

iText 7: высота абзаца в том виде, в котором она будет отображена

Я пытался выполнить эту статью, но я не смог запустить этот код, он выдает ошибку со следующим исключением, которое мне не удалось устранить.

"System.InvalidOperationException: 'FontProvider и FontSet пусты. Не удается разрешить имя семейства шрифтов (см. ElementPropertyContainer # setFontFamily) без инициализированного FontProvider (см. RootElement # setFontProvider).'"

Вот мой код.

    public JustifyWorker(IElementNode element, ProcessorContext context) : base(element, context)
    {

    }


    public override void ProcessEnd(IElementNode element, ProcessorContext context)
    {
        base.ProcessEnd(element, context);

        var result = (Div) this.GetElementResult();

        var width = this.GetWidth(result, new Document(context.GetPdfDocument()).GetRenderer());

    }


    private float GetWidth(IElement prop, RootRenderer parentRenderer)
    {

        IRenderer renderer = prop.CreateRendererSubTree();

        LayoutResult result = renderer.SetParent(parentRenderer).Layout(new LayoutContext(new LayoutArea(1, new Rectangle(100, 1000))));


        return result.GetOccupiedArea().GetBBox().GetWidth();
    }

}

Является ли TagWorkers правильным местом для этого? Если да, то может ли кто-нибудь помочь мне понять, как получить ширину элемента div и текст внутри него?

...