如何将一些html元素转换为span元素并从中提取坐标?



我正在尝试将我的html包含的一些元素(标签(转换为span,并能够从中提取位置(坐标(。你能帮帮我吗,因为我是iText 7的新手:

我的代码是:

转换器属性 = 新的转换器属性((; 性能。SetTagWorkerFactory(new CustomTagWorker(((; IList elements = HtmlConverter.ConvertToElements(html, properties(; foreach (元素中的 IElement 元素( { 公文。Add((IBlockElement( element(; } 公文。关闭((;

自定义标签工作线程:

private class CustomSpanTagWorker : iText.Html2pdf.Attach.Impl.Tags.SpanTagWorker { public CustomSpanTagWorker(iText.StyledXmlParser.Node.IElementNode element, iText.Html2pdf.Attach.ProcessorContext context( : base(element, context( { } public override void ProcessEnd(iText.StyledXmlParser.Node.IElementNode element,iText.Html2pdf.Attach.ProcessorContext context( { 基础。进程结束(元素,上下文(; 字符串名称 = 元素。名称((; IList elementResult = GetAllElements((; if (elementResult != null ( { foreach (iText.Layout.IPropertyContainer item in elementResult( { 基础。进程结束(元素,上下文(; } } } }

DefaultTagWorkerFactory:

如果(标记。名称((。Equals(iText.Html2pdf.Html.TagConstants.STRONG, StringComparison.OrdinalIgnoreCase(( {                        返回新的 CustomSpanTagWorker(tag, context(; }

简而言之,您需要将自定义标记工作线程传递给转换器属性(已在代码中完成(,然后检查自定义标记工作线程创建的元素,在那里找到Text元素并将自定义渲染器传递给该元素。如果您从默认实现扩展,渲染器反过来将知道有关文本位置的所有详细信息。下面是打印有关结果位置的基本信息的代码示例:

String html = "hello <strong>world</strong> and others";
ConverterProperties converterProperties = new ConverterProperties();
converterProperties.SetTagWorkerFactory(new CustomTagWorkerFactory());
HtmlConverter.ConvertToPdf(html, new ByteArrayOutputStream(), converterProperties);

多肉帮手类:

private class CustomTagWorkerFactory : DefaultTagWorkerFactory {
public override ITagWorker GetCustomTagWorker(IElementNode tag, ProcessorContext context) {
if (tag.Name().Equals(iText.Html2pdf.Html.TagConstants.STRONG, StringComparison.InvariantCultureIgnoreCase)) {                        
return new CustomSpanTagWorker(tag, context);
}
return base.GetCustomTagWorker(tag, context);
}
}
private class CustomSpanTagWorker : SpanTagWorker {
public CustomSpanTagWorker(IElementNode element, ProcessorContext context) : base(element, context) {
}
public override void ProcessEnd(IElementNode element, ProcessorContext context) {
base.ProcessEnd(element, context);
var leafElements= base.GetOwnLeafElements();
if (leafElements.Count == 1 && leafElements[0] is Text) {
(leafElements[0] as Text).SetNextRenderer(new CustomTextRenderer(leafElements[0] as Text));
}
}
}
private class CustomTextRenderer : TextRenderer {
private Rectangle location;

public CustomTextRenderer(Text textElement) : base(textElement) {
}

protected internal CustomTextRenderer(TextRenderer other) : base(other) {
}
public override IRenderer GetNextRenderer() {
return new CustomTextRenderer((Text) modelElement);
}

protected override iText.Layout.Renderer.TextRenderer CreateCopy(GlyphLine gl, PdfFont font) {
CustomTextRenderer copy = new CustomTextRenderer(this);
copy.SetProcessedGlyphLineAndFont(gl, font);
return copy;
}
public override void Draw(DrawContext drawContext) {
base.Draw(drawContext);
this.location = occupiedArea.GetBBox().Clone();
Console.WriteLine(location);
}
public Rectangle GetLocation() {
return location;
}
}

最新更新