日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > CSS >内容正文

CSS

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

發(fā)布時間:2023/12/14 CSS 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 itext html转换为pdf排版错乱,使用iText库将html转换为pdf时不适用hr的Inline CSS 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我是一個.NET開發(fā)人員,所以該代碼是在C#。但是你應該可以輕松地翻譯以下內容。

iText是一個PDF優(yōu)先庫,而[X]HTML解析相當復雜,所以它在這方面不是全功能。每當解析[X]HTML,事情不會你期望的特定標簽的方式,你應該遵循的基本步驟是:

驗證XML Worker支持標簽:Tags class。

如果標簽是支持,在這種情況下,這是真實的,看看默認的實現(xiàn)。這是由the HorizontalRule class處理的。但是,我們發(fā)現(xiàn)不支持您的用例,因此一種方法是使用該代碼作為藍圖。 (如下所示)您也可以繼承特定的標記類并覆蓋End()方法as done here。無論哪種方式,你所做的只是實現(xiàn)一個自定義標簽處理器。

如果標簽為而不是支持,則需要從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;

}

}

大部分代碼是直接設置邊框樣式和顏色取自現(xiàn)有的源,隨著檢查的除外CSS.Property.BORDER_BOTTOM_STYLE和CSS.Property.BORDER_BOTTOM_COLOR,如果他們在


會內聯(lián)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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。