IText-计算TagWorkers中元素和文本的宽度

时间:2019-06-05 11:50:16

标签: c# itext html-to-pdf

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

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

iText 7: Paragraph height as it would be rendered

我试图按照本文进行操作,但是我无法运行此代码,但由于以下异常而出错,但我未能解决。

“ 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元素的宽度以及其中的文本吗?

0 个答案:

没有答案