首页 > 解决方案 > IText - 计算 TagWorkers 中元素和文本的宽度

问题描述

我目前正在使用 IText7 将 HTML 文件转换为 PDF。由于应用程序的性质,段落中的每一行文本都需要存储在其自己的 div 容器内的单独行中,这会导致整个段落的合理性问题。为了解决这个问题,我需要能够手动测量 div 容器的宽度,然后测量其中文本内容的宽度,然后根据我们决定的比率应用理由。

我正在努力的部分是如何测量 IText 管道中上述元素的宽度。我编写了一个 TagWorker,当检测到具有“justify-text”属性的 div 元素时会触发它,我希望我可以覆盖 ProcessEnd 方法,检测元素的宽度并采取适当的行动,但是我很挣扎了解如何。我可以找到有问题的元素,但计算宽度是个问题。

iText 7:将呈现的段落高度

我试图按照这篇文章来做到这一点,但是我无法让这段代码运行,它出现了以下我无法解决的异常。

System.InvalidOperationException: 'FontProvider 和 FontSet 为空。如果没有初始化 FontProvider(请参阅 RootElement#setFontProvider),则无法解析字体系列名称(请参阅 ElementPropertyContainer#setFontFamily)。

这是我的代码。

    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 元素的宽度以及里面的文本?

标签: c#itexthtml-to-pdf

解决方案


推荐阅读