c# - IText - 计算 TagWorkers 中元素和文本的宽度
问题描述
我目前正在使用 IText7 将 HTML 文件转换为 PDF。由于应用程序的性质,段落中的每一行文本都需要存储在其自己的 div 容器内的单独行中,这会导致整个段落的合理性问题。为了解决这个问题,我需要能够手动测量 div 容器的宽度,然后测量其中文本内容的宽度,然后根据我们决定的比率应用理由。
我正在努力的部分是如何测量 IText 管道中上述元素的宽度。我编写了一个 TagWorker,当检测到具有“justify-text”属性的 div 元素时会触发它,我希望我可以覆盖 ProcessEnd 方法,检测元素的宽度并采取适当的行动,但是我很挣扎了解如何。我可以找到有问题的元素,但计算宽度是个问题。
我试图按照这篇文章来做到这一点,但是我无法让这段代码运行,它出现了以下我无法解决的异常。
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 元素的宽度以及里面的文本?
解决方案
推荐阅读
- visual-studio-code - vs code consistent keybindings for Mac and windows with settings sync
- r - Data on secondary axis in GGPlot
- java - How to format date and time values when using itextpdf forms
- mysql - Is there a way in MySQL to update a view with data from a table that is not covered by the view?
- python - checking if a list is a key in a dictionary and returning corresponding value
- javascript - Transforming a list of Input Elements into a multiselect dropdown menu that works with website search
- sql - Adding Percent Column Based on Combination of 2 columns (Postgresql)
- google-cloud-dataflow - Apache Beam 是否所有键都必须放入工作人员的内存中
- three.js - 如何在对象与射线的交点处检索对象的纹理颜色
- nginx - apt更新后Nginx版本降级