我当前正在使用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元素的宽度以及其中的文本吗?