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:
總結
以上是生活随笔為你收集整理的itext html转换为pdf排版错乱,使用iText库将html转换为pdf时不适用hr的Inline CSS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go爬取起点中文网 解决文字反爬
- 下一篇: 用python抓取智联招聘信息并存入ex