我是一个.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();
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:
我是一个.NET开发人员,所以该代码是在C#。但是你应该可以轻松地翻译以下内容。iText是一个PDF优先库,而[X]HTML解析相当复杂,所以它在这方面不是全功能。每当解析[X]HTML,事情不会你期望的特定标签的方式,你应该遵循的基本步骤是:验证XML Worker支持标签:Tags class。如果标签是支持,在这种情况下,这是真实的,看看默认的实现。这是由the HorizontalRul...
iText
7是一个Java
库
,用于生成
PDF
文档。
iText
7提供了从
HTML
到
PDF
的
转换
功能,可以通过以下步骤将
HTML
转换
为
PDF
并解决中文乱码问题:
添加
iText
7依赖
在您的项目中添加以下依赖项:
<dependency>
<groupId>com.
itext
pdf
</groupId>
<artifactId>itex...
各种文档,文章,报表,报告等这种依靠数据生成的资料,一般用户都会提出需要导出的功能。
导出一般要求导出word,Excel和
pdf
,这里谈一下测试过多种
html
转
pdf
的心得。(
html
转word目前没发现特别好用的工具包,目前我的实现的方式是apache poi ,但是确实不太好用,样式是自己解析的,在处理附加图片的
时
候真心很费劲)。
html
转
pdf
之
itext
itext
是开源的j...
在上一篇文章中,我们学习了
使用
对
pdf
进行盖章/签章/数字签名,到此为止,常用的
pdf
操作已经全部实现,但是实际开发中很多人比较喜欢将
html
转成
pdf
,本文介绍将
html
转
pdf
的方法(之前用的都是
itext
5,这次需要用到
itext
7中的
html
2
pdf
这个强大的组件)
首先,先贴上代码之前一直
使用
的
itext
5的方式,将
html
转
pdf
(很多标签无法兼容)
import java.i...
public static void
html
To
PDF
(String
pdf
Path, String
html
Path) t
hr
ows Exception {
try {
IText
Renderer renderer = new
IText
Renderer();
IText
FontResolver fontResolver = renderer.getFontResolver();
OutputStre