如何将一些 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;
}
}
我正在尝试将我的 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;
}
}