Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从c中的itext.layout.element提取属性#_C#_Itext_Itext7 - Fatal编程技术网

C# 从c中的itext.layout.element提取属性#

C# 从c中的itext.layout.element提取属性#,c#,itext,itext7,C#,Itext,Itext7,目前,我正在进行一个项目,使用itext为pdf生成一个目录。我拥有的是一个元素列表(itext.layout.Element对象) 我已经创建了一个字典,我们在那里存储(章节标题和起始页码)。我想考虑 类为Heading2ANOC的段落是章节标题 霉菌代码: var toc = new Dictionary<string,int>(); foreach (IElement element in elements) { Console.WriteLine(element.Ge

目前,我正在进行一个项目,使用itext为pdf生成一个目录。我拥有的是一个元素列表(itext.layout.Element对象)

我已经创建了一个字典,我们在那里存储(章节标题和起始页码)。我想考虑

类为Heading2ANOC的段落是章节标题

霉菌代码:

var toc = new Dictionary<string,int>();
foreach (IElement element in elements)
{
    Console.WriteLine(element.GetType().Name);
    if (element.GetType().Name == "HtmlPageBreak")
    {
        continue;
    }

    else if (element.GetType().Name == "Paragraph")//need a method to check wheather the class is "Heading2ANOC" {

        int count=pdf.GetNumberOfPages();
        toc.Add("section" + i, count);// 
        i++;

    }
   document.Add((IBlockElement)element);
}
var-toc=newdictionary();
foreach(元素中的元素)
{
Console.WriteLine(element.GetType().Name);
if(element.GetType().Name==“HtmlPageBreak”)
{
继续;
}
else if(element.GetType().Name==“段落”)//需要一个方法来检查类是否为“Heading2ANOC”{
int count=pdf.GetNumberOfPages();
目录添加(“章节”+i,计数);//
i++;
}
添加((IBlockElement)元素);
}
我使用以下代码获取元素:

string path = "path for the Html";
string html = File.ReadAllText(path);
IList<IElement> elements = HtmlConverter.ConvertToElements(html);
string path=“Html的路径”;
字符串html=File.ReadAllText(路径);
IList elements=HtmlConverter.ConvertToElements(html);
Html元素示例:

<div style="mso-element: para-border-div; border: solid #A6A6A6 2.25pt; padding: 3.0pt 4.0pt 3.0pt 4.0pt; background: #D9D9D9;">
<p class="Heading2ANOC"><span style="mso-bookmark: _Toc190800487;"><span style="mso-bookmark: _Toc377720650;"><span style="mso-bookmark: _Toc396995390;"><span style="font-size: 11.0pt; font-family: 'Open Sans',sans-serif; color: black; mso-color-alt: windowtext;">SECTION 1 <span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Name of the section</span></span></span></span></p>
</div>

第1节:该节的名称

与您现在采用的方法相比,有一种更干净(更灵活)的方法来完成任务,但它需要编写更多的代码。幸运的是,代码非常基本

要了解需要定制的内容,您需要稍微了解pdfHTML的工作原理。粗略地说,它按DFS顺序遍历DOM树,并将DOM树转换为元素树。每个标记都由一个标记工作程序遍历,该标记工作程序生成一个元素作为结果。这些元素足够灵活,可以包含任何自定义属性(只要您使用的是iText未使用的唯一属性ID),因此您可以在标记工作程序中设置这些属性,并在以后使用它们。在这种情况下,您希望传递
class
property/attribute

首先,让我们创建一个从
PTagWorker
派生的自定义标记工作程序,它将处理HTML中的所有段落并设置一个自定义属性:

public static readonly int CUSTOM_PROPERTY_ID = -10;

private class CustomPTagWorker : PTagWorker {
    public CustomPTagWorker(IElementNode element, ProcessorContext context) : base(element, context) {
    }

    public override void ProcessEnd(IElementNode element, ProcessorContext context) {
        base.ProcessEnd(element, context);
        IPropertyContainer elementResult = GetElementResult();
        if (elementResult != null && !String.IsNullOrEmpty(element.GetAttribute(AttributeConstants.CLASS))) {
            elementResult.SetProperty(CUSTOM_PROPERTY_ID, element.GetAttribute(AttributeConstants.CLASS));
        }
    }
}
然后,我们需要以某种方式使用该标记工作者-为此,我们创建了一个自定义标记工作者工厂:

private class CustomTagWorkerFactory : DefaultTagWorkerFactory {
    public override ITagWorker GetCustomTagWorker(IElementNode tag, ProcessorContext context) {
        if (TagConstants.P.Equals(tag.Name().ToLower())) {
            return new CustomPTagWorker(tag, context);
        }
        return base.GetCustomTagWorker(tag, context);
    }
}
我们现在需要做的就是通过在转换器属性中传递自定义标记工作程序,使pdfHTML了解这些自定义:

ConverterProperties properties = new ConverterProperties().SetTagWorkerFactory(new CustomTagWorkerFactory());
为了测试它,我们可以迭代元素并检查是否存在自定义属性(而不是检查类的名称):

String html=“

hello

world

”; ConverterProperties properties=new ConverterProperties().SetTagWorkerFactory(new CustomTagWorkerFactory()); IList elements=HtmlConverter.ConvertToElements(html,属性); foreach(元素中的元素) { if(element.HasProperty(CUSTOM_PROPERTY_ID)){ String propertyValue=element.GetProperty(自定义属性\u ID); Console.WriteLine(propertyValue); } }
请记住,对于元素相互嵌套的更复杂的HTML,您可能希望以不同的方式执行最终分析,例如

foreach (IElement element in elements)
{
    if (element is AbstractElement<Div>) {
        var children = (element as AbstractElement<Div>).GetChildren();
        // analyze children
    }
}
foreach(元素中的元素)
{
if(元素是抽象元素){
var children=(元素为AbstractElement).GetChildren();
//分析儿童
}
}
与您现在采用的方法相比,有一种更干净(更灵活)的方法来完成任务,但它需要编写更多的代码。幸运的是,代码非常基本

要了解需要定制的内容,您需要稍微了解pdfHTML的工作原理。粗略地说,它按DFS顺序遍历DOM树,并将DOM树转换为元素树。每个标记都由一个标记工作程序遍历,该标记工作程序生成一个元素作为结果。这些元素足够灵活,可以包含任何自定义属性(只要您使用的是iText未使用的唯一属性ID),因此您可以在标记工作程序中设置这些属性,并在以后使用它们。在这种情况下,您希望传递
class
property/attribute

首先,让我们创建一个从
PTagWorker
派生的自定义标记工作程序,它将处理HTML中的所有段落并设置一个自定义属性:

public static readonly int CUSTOM_PROPERTY_ID = -10;

private class CustomPTagWorker : PTagWorker {
    public CustomPTagWorker(IElementNode element, ProcessorContext context) : base(element, context) {
    }

    public override void ProcessEnd(IElementNode element, ProcessorContext context) {
        base.ProcessEnd(element, context);
        IPropertyContainer elementResult = GetElementResult();
        if (elementResult != null && !String.IsNullOrEmpty(element.GetAttribute(AttributeConstants.CLASS))) {
            elementResult.SetProperty(CUSTOM_PROPERTY_ID, element.GetAttribute(AttributeConstants.CLASS));
        }
    }
}
然后,我们需要以某种方式使用该标记工作者-为此,我们创建了一个自定义标记工作者工厂:

private class CustomTagWorkerFactory : DefaultTagWorkerFactory {
    public override ITagWorker GetCustomTagWorker(IElementNode tag, ProcessorContext context) {
        if (TagConstants.P.Equals(tag.Name().ToLower())) {
            return new CustomPTagWorker(tag, context);
        }
        return base.GetCustomTagWorker(tag, context);
    }
}
我们现在需要做的就是通过在转换器属性中传递自定义标记工作程序,使pdfHTML了解这些自定义:

ConverterProperties properties = new ConverterProperties().SetTagWorkerFactory(new CustomTagWorkerFactory());
为了测试它,我们可以迭代元素并检查是否存在自定义属性(而不是检查类的名称):

String html=“

hello

world

”; ConverterProperties properties=new ConverterProperties().SetTagWorkerFactory(new CustomTagWorkerFactory()); IList elements=HtmlConverter.ConvertToElements(html,属性); foreach(元素中的元素) { if(element.HasProperty(CUSTOM_PROPERTY_ID)){ String propertyValue=element.GetProperty(自定义属性\u ID); Console.WriteLine(propertyValue); } }
请记住,对于元素相互嵌套的更复杂的HTML,您可能希望以不同的方式执行最终分析,例如

foreach (IElement element in elements)
{
    if (element is AbstractElement<Div>) {
        var children = (element as AbstractElement<Div>).GetChildren();
        // analyze children
    }
}
foreach(元素中的元素)
{
if(元素是抽象元素){
var children=(元素为AbstractElement).GetChildren();
//分析儿童
}
}

您好,您可能正在使用
HtmlConverter
,对吗?你能附上包含调用
HtmlConverter
的代码吗?是的,我正在使用
HtmlConverter.ConvertToElements(html)
嗨,你可能正在使用
HtmlConverter
,对吗?您可以附加代码,包括调用
HtmlConverter
?是的,我正在使用
HtmlConverter.ConvertToElements(html)
我正在尝试另一个变体

我已经创建了C