![](/img/trans.png)
[英]Convert local image to iText.Layout.Element image xamarin forms
[英]Attribute extraction from itext.layout.element in c#
目前,我正在一個項目上使用itext生成pdf目錄,我所擁有的是元素列表(itext.layout.Element對象)。
我創建了一個dictionary <string,int>用來存儲(章節標題和起始頁碼)。 我想考慮
<p class="Heading2ANOC" >
類別為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);
}
我通過使用以下代碼獲取Elements:
string path = "path for the Html";
string html = File.ReadAllText(path);
IList<IElement> 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;"> </span>Name of the section</span></span></span></span></p>
</div>
與您現在所采用的方法相比,有一種更干凈(更靈活)的方法來處理任務,但是它需要編寫更多的代碼。 幸運的是,該代碼非常基本。
要了解需要自定義的內容,您需要了解pdfHTML的工作原理。 粗略地說,它以DFS順序遍歷DOM樹,並將DOM樹轉換為元素樹。 每個標記都由標記工作程序遍歷,並且該標記工作程序會生成一個元素。 元素足夠靈活,可以包含任何自定義屬性(只要您使用iText不使用的唯一屬性ID),因此可以在標記工作器中設置這些屬性,並在以后使用它們。 在這種情況下,您希望傳遞class
property / attribute。
首先,讓我們創建一個從PTagWorker
派生的自定義標簽工作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 = "<p class=\"Heading2ANOC\">hello</p><p>world</p>";
ConverterProperties properties = new ConverterProperties().SetTagWorkerFactory(new CustomTagWorkerFactory());
IList<IElement> elements = HtmlConverter.ConvertToElements(html, properties);
foreach (IElement element in elements)
{
if (element.HasProperty(CUSTOM_PROPERTY_ID)) {
String propertyValue = element.GetProperty<String>(CUSTOM_PROPERTY_ID);
Console.WriteLine(propertyValue);
}
}
請記住,對於元素相互嵌套的更復雜的HTML,您可能希望以不同的方式執行最終分析,例如
foreach (IElement element in elements)
{
if (element is AbstractElement<Div>) {
var children = (element as AbstractElement<Div>).GetChildren();
// analyze children
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.