1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > itext html转换为pdf排版错乱 使用iText库将html转换为pdf时不适用hr的Inline CSS

itext html转换为pdf排版错乱 使用iText库将html转换为pdf时不适用hr的Inline CSS

时间:2019-11-08 15:41:29

相关推荐

itext html转换为pdf排版错乱 使用iText库将html转换为pdf时不适用hr的Inline CSS

我是一个.NET开发人员,所以该代码是在C#。但是你应该可以轻松地翻译以下内容。

iText是一个PDF优先库,而[X]HTML解析相当复杂,所以它在这方面不是全功能。每当解析[X]HTML,事情不会你期望的特定标签的方式,你应该遵循的基本步骤是:

验证XML Worker支持标签:Tags class。

如果标签是支持,在这种情况下,这是真实的,看看默认的实现。这是由the HorizontalRule class处理的。但是,我们发现不支持您的用例,因此一种方法是使用该代码作为蓝图。 (如下所示)您也可以继承特定的标记类并覆盖End()方法as done here。无论哪种方式,你所做的只是实现一个自定义标签处理器。

如果标签为而不是支持,则需要从AbstractTagProcessor继承自定义标签处理器。

无论如何,下面是一个简单的例子,让你开始。首先,自定义标签处理器:

public class CustomHorizontalRule : AbstractTagProcessor

{

public override IList Start(IWorkerContext ctx, Tag tag)

{

IList result;

LineSeparator lineSeparator;

var cssUtil = CssUtils.GetInstance();

try

{

IList list = new List();

HtmlPipelineContext htmlPipelineContext = this.GetHtmlPipelineContext(ctx);

Paragraph paragraph = new Paragraph();

IDictionary css = tag.CSS;

float baseValue = 12f;

if (css.ContainsKey("font-size"))

{

baseValue = cssUtil.ParsePxInCmMmPcToPt(css["font-size"]);

}

string text;

css.TryGetValue("margin-top", out text);

if (text == null) text = "0.5em";

string text2;

css.TryGetValue("margin-bottom", out text2);

if (text2 == null) text2 = "0.5em";

string border;

css.TryGetValue(CSS.Property.BORDER_BOTTOM_STYLE, out border);

lineSeparator = border != null && border == "dotted"

? new DottedLineSeparator()

: new LineSeparator();

var element = (LineSeparator)this.GetCssAppliers().Apply(

lineSeparator, tag, htmlPipelineContext

);

string color;

css.TryGetValue(CSS.Property.BORDER_BOTTOM_COLOR, out color);

if (color != null)

{

// WebColors deprecated, but docs don't state replacement

element.LineColor = WebColors.GetRGBColor(color);

}

paragraph.SpacingBefore += cssUtil.ParseValueToPt(text, baseValue);

paragraph.SpacingAfter += cssUtil.ParseValueToPt(text2, baseValue);

paragraph.Leading = 0f;

paragraph.Add(element);

list.Add(paragraph);

result = list;

}

catch (NoCustomContextException cause)

{

throw new RuntimeWorkerException(

LocaleMessages.GetInstance().GetMessage("customcontext.404"),

cause

);

}

return result;

}

}

大部分代码是直接设置边框样式和颜色取自现有的源,随着检查的除外CSS.Property.BORDER_BOTTOM_STYLE和CSS.Property.BORDER_BOTTOM_COLOR,如果他们在

会内联style属性。

然后添加自定义标签处理器上面的XML工人TagProcessorFactory:

using (var stream = new FileStream(OUTPUT_FILE, FileMode.Create))

{

using (var document = new Document())

{

var writer = PdfWriter.GetInstance(document, stream);

document.Open();

var tagProcessorFactory = Tags.GetHtmlTagProcessorFactory();

// custom tag processor above

tagProcessorFactory.AddProcessor(

new CustomHorizontalRule(),

new string[] { HTML.Tag.HR }

);

var htmlPipelineContext = new HtmlPipelineContext(null);

htmlPipelineContext.SetTagFactory(tagProcessorFactory);

var pdfWriterPipeline = new PdfWriterPipeline(document, writer);

var htmlPipeline = new HtmlPipeline(htmlPipelineContext, pdfWriterPipeline);

var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);

var cssResolverPipeline = new CssResolverPipeline(

cssResolver, htmlPipeline

);

var worker = new XMLWorker(cssResolverPipeline, true);

var parser = new XMLParser(worker);

var xHtml = "

";

using (var stringReader = new StringReader(xHtml))

{

parser.Parse(stringReader);

}

}

}

有一点要注意的是,即使我们使用速记border内嵌样式,iText的的CSS解析器似乎设置全部内部样式。也就是说,您可以使用四种手形中的任何一种来检查 - 我只是碰巧使用了CSS.Property.BORDER_BOTTOM_STYLE和CSS.Property.BORDER_BOTTOM_COLOR。

所生成的PDF:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。