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

How to convert some html elements into span elements and extract coordinates from them?

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

我的代码是:

ConverterProperties properties = new ConverterProperties();
properties.SetTagWorkerFactory(new CustomTagWorker());

IList elements = HtmlConverter.ConvertToElements(html, properties);

foreach (IElement element in elements)
{
    document.Add((IBlockElement) element);
}

document.Close();

自定义标签工人:

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)
    {
        base.ProcessEnd(element, context);
        string nombre = element.Name();
        IList elementResult = GetAllElements();

        if (elementResult != null )
        {
            foreach (iText.Layout.IPropertyContainer item in elementResult)
            {

                base.ProcessEnd(element, context);
            }

        }
    }
}

DefaultTagWorkerFactory:

if (tag.Name().Equals(iText.Html2pdf.Html.TagConstants.STRONG, StringComparison.OrdinalIgnoreCase))
{                        
    return new 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;
    }
}