/* (non-Javadoc) * @see com.itextpdf.html2pdf.css.apply.ICssApplier#apply(com.itextpdf.html2pdf.attach.ProcessorContext, com.itextpdf.html2pdf.html.node.IStylesContainer, com.itextpdf.html2pdf.attach.ITagWorker) */ public virtual void Apply(ProcessorContext context, IStylesContainer stylesContainer, ITagWorker tagWorker ) { IDictionary <String, String> cssProps = stylesContainer.GetStyles(); IPropertyContainer container = tagWorker.GetElementResult(); if (container != null) { WidthHeightApplierUtil.ApplyWidthHeight(cssProps, context, container); BackgroundApplierUtil.ApplyBackground(cssProps, context, container); MarginApplierUtil.ApplyMargins(cssProps, context, container); PaddingApplierUtil.ApplyPaddings(cssProps, context, container); FontStyleApplierUtil.ApplyFontStyles(cssProps, context, stylesContainer, container); BorderStyleApplierUtil.ApplyBorders(cssProps, context, container); HyphenationApplierUtil.ApplyHyphenation(cssProps, context, stylesContainer, container); FloatApplierUtil.ApplyFloating(cssProps, context, container); PositionApplierUtil.ApplyPosition(cssProps, context, container); OpacityApplierUtil.ApplyOpacity(cssProps, context, container); PageBreakApplierUtil.ApplyPageBreakProperties(cssProps, context, container); OverflowApplierUtil.ApplyOverflow(cssProps, container); TransformationApplierUtil.ApplyTransformation(cssProps, context, container); OutlineApplierUtil.ApplyOutlines(cssProps, context, container); OrphansWidowsApplierUtil.ApplyOrphansAndWidows(cssProps, container); } }
/// <summary>Recursively processes a node converting HTML into PDF using tag workers.</summary> /// <param name="node">the node</param> private void Visit(INode node) { if (node is IElementNode) { IElementNode element = (IElementNode)node; element.SetStyles(cssResolver.ResolveStyles(element, context.GetCssContext())); if (!IsDisplayable(element)) { return; } ITagWorker tagWorker = context.GetTagWorkerFactory().GetTagWorker(element, context); if (tagWorker == null) { if (!ignoredTags.Contains(element.Name())) { logger.Error(MessageFormatUtil.Format(iText.Html2pdf.LogMessageConstant.NO_WORKER_FOUND_FOR_TAG, (element) .Name())); } } else { context.GetState().Push(tagWorker); } if (tagWorker is HtmlTagWorker) { ((HtmlTagWorker)tagWorker).ProcessPageRules(node, cssResolver, context); } if (TagConstants.BODY.Equals(element.Name()) || TagConstants.HTML.Equals(element.Name())) { RunApplier(element, tagWorker); } context.GetOutlineHandler().AddOutlineAndDestToDocument(tagWorker, element, context); VisitPseudoElement(element, tagWorker, CssConstants.BEFORE); VisitPseudoElement(element, tagWorker, CssConstants.PLACEHOLDER); foreach (INode childNode in element.ChildNodes()) { if (!context.IsProcessingInlineSvg()) { Visit(childNode); } } VisitPseudoElement(element, tagWorker, CssConstants.AFTER); if (tagWorker != null) { tagWorker.ProcessEnd(element, context); LinkHelper.CreateDestination(tagWorker, element, context); context.GetOutlineHandler().SetDestinationToElement(tagWorker, element); context.GetState().Pop(); if (!TagConstants.BODY.Equals(element.Name()) && !TagConstants.HTML.Equals(element.Name())) { RunApplier(element, tagWorker); } if (!context.GetState().Empty()) { PageBreakApplierUtil.AddPageBreakElementBefore(context, context.GetState().Top(), element, tagWorker); tagWorker = ProcessRunningElement(tagWorker, element, context); bool childProcessed = context.GetState().Top().ProcessTagChild(tagWorker, context); PageBreakApplierUtil.AddPageBreakElementAfter(context, context.GetState().Top(), element, tagWorker); if (!childProcessed && !ignoredChildTags.Contains(element.Name())) { logger.Error(MessageFormatUtil.Format(iText.Html2pdf.LogMessageConstant.WORKER_UNABLE_TO_PROCESS_OTHER_WORKER , context.GetState().Top().GetType().FullName, tagWorker.GetType().FullName)); } } else { if (tagWorker.GetElementResult() != null) { roots.Add(tagWorker.GetElementResult()); } } } element.SetStyles(null); } else { if (node is ITextNode) { String content = ((ITextNode)node).WholeText(); if (content != null) { if (!context.GetState().Empty()) { bool contentProcessed = context.GetState().Top().ProcessContent(content, context); if (!contentProcessed) { logger.Error(MessageFormatUtil.Format(iText.Html2pdf.LogMessageConstant.WORKER_UNABLE_TO_PROCESS_IT_S_TEXT_CONTENT , context.GetState().Top().GetType().FullName)); } } else { logger.Error(iText.Html2pdf.LogMessageConstant.NO_CONSUMER_FOUND_FOR_CONTENT); } } } } }