android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS

我是.NET开发人员,因此代码在C#中.但是你应该能够轻松翻译以下内容.

iText是一个PDF优先的库,[X] HTML解析非常复杂,因此在这方面并不完整.每当解析[X] HTML并且事情不按预期的方式进行特定标记时,您应遵循的基本步骤是:

>验证XML Worker支持标记:Tags class.

>如果支持标记(在本例中为true),请查看默认实现.这里由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的检查除外,如果它们在< hr>中内联,则设置边框样式和颜色.样式属性.

然后将上面的自定义标记处理器添加到XML Worker 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);

}

}

}

有一点需要注意的是,即使我们使用的是速记边框内联样式,iText的CSS解析器似乎也会在内部设置所有样式.即,您可以使用四种速记样式中的任何一种来检查 – 我恰好使用了CSS.Property.BORDER_BOTTOM_STYLE和CSS.Property.BORDER_BOTTOM_COLOR.

结果PDF:

78b9f2f1471cf34f3cdb50ed087f0005.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 小说爬虫_从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载

从零开始写Python爬虫 --- 1.7 爬虫实践&#xff1a; 排行榜小说批量下载Ehco 5 个月前 本来只是准备做一个爬起点小说名字的爬虫&#xff0c;后来想了一下&#xff0c;为啥不顺便把小说的内容也爬下来呢&#xff1f;于是我就写了这个爬虫&#xff0c;他爬下了各类小说排行榜上…

java 某个字符在字符串中出现的所有位置_Java面试常考核心概念

这篇文章专注于Java基础知识&#xff0c;不涉及List、Map、多线程、锁相关的内容&#xff0c;需要的可以查看我的其他博客hofes blog​hhf443.github.ioJDK&JRE&JVMJDK&#xff08;Java Development Kit&#xff09;是针对 Java 开发员的产品&#xff0c;是整个 Java 的…

lan交换和无线教师手册_简单几步,无线路由器变交换机

当原来的路由器lan口不够用&#xff0c;可以加一个交换机扩展lan口数量&#xff0c;如果需要增加的lan口数量不超过3个可以考虑找台不用的无线路由器当交换机用。另外&#xff0c;随着交换机更新家中都有旧无线路由器闲置&#xff0c;完全可以再次利用。下面看一下&#xff0c;…

revit找不到附加模块程序集_TensorFlow基础知识——常用模块(一)

1本节简述对于开展深度学习开发的目标而言&#xff0c;我们需要掌握的除了必要的深度学习理论基础、必要的开发依赖库基础知识、基本的开发套路之外&#xff0c;我们还需要掌握它常见的外围小帮手都有哪些。这些小帮手就是深度学习依赖库中的其他并不是核心的模块&#xff0c;但…

99 网络编程_网络工程师技能图谱,看看你会多少技能

技术推动了时代变革&#xff0c;互联网则加速了这场变革。在蓬勃发展的互联网浪潮下&#xff0c;网络作为基础设施的关键纽带保障着网路流量的顺利流通&#xff0c;维持着赛博世界的繁荣。而在这繁荣之下&#xff0c;生存着这样一个群体——网络工程狮&#xff0c;为网络纽带保…

python 3.8.0安卓_Python for Mac v3.8.0 官方最新版

Python for Mac是一款全新推出的编程工具&#xff0c;所有 python.org macOS 安装程序都附带了 OpenSSL 的内置副本。此外&#xff0c;还有一个针对 macOS 10.9 的新增安装程序变体&#xff0c;其中包含 Tcl / Tk 8.6的内置版本&#xff0c;有需要的朋友快来下载试试吧!Python …

线程join_Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

点击上方“Coder编程”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;并发编程.png每天进步一点&#xff0c;不做curd工程师与Api调用工程师 欢迎访问个人博客网站&#xff1a;https://www.coder-programming.cn/ 作者&#xff1a;liuxiaopeng | http://www…

4位先行进位电路 logisim_你真的了解74系列集成电路吗?让我帮你总结一下

74系列集成电路大致可分为6大类&#xff1a;74(标准型)74LS(低功耗肖特基)74S(肖特基)74ALS(先进低功耗肖特基)74AS(先进肖特基)74F(高速)HC为COMS工作电平&#xff1b;HCT为TTL工作电平&#xff0c;可与74LS系列互换使用HCU适用于无缓冲级的CMOS电路。这9种74系列产品&#xf…

android ios av tv,iOS使用AVPlayer制作战旗TvDEMO OC版

在视频教学中看到一个别人写的战旗TvDEMO写得很好&#xff0c;于是自己动手试着制作一个。效果如下图所示主界面竖屏播放横屏播放点击出现工具栏视频播放使用的是AVPlayer,具体的使用方式如下//---PlayView---_playView [[UIView alloc]init];_playView.frame CGRectMake(0, …

matlab 子图title的位置_matlab 画图基本介绍

1.在命令窗口输入命令时&#xff0c;可以不必每输入一条命令就按enter键执行&#xff0c;可以在输入几行后一同运行。方法是&#xff1a;换行时&#xff0c;只要在按住<shift>键的同时按<enter>键即可&#xff0c;否则matlab就会执行上面输入的所有语句。2.如何将数…

二元一次方程有唯一解的条件_人教版初中数学七年级下册用适当方法解二元一次方程组公开课优质课课件教案视频...

解二元一次方程组---加减法一、教学目的&#xff1a;1&#xff0e;使学生掌握用加减法解二元一次方程组的步骤。2&#xff0e;熟练运用加减法解二元一次方程组。3&#xff0e;培养学生分析问题、解决问题的能力。二、教学重点、难点和关键&#xff08;一&#xff09;重点&#…

为什么从网页上打印怎们好像被缩放_全网最详细关于3D打印的zbrush技术

这个小教程旨在为刚开始对3D打印感兴趣的新人朋友提供一些快速上手小技巧&#xff0c;以便在zbrush中制作适合桌面FDM 3D打印的创作&#xff0c;本次小教程需要读者已经有一些zbrush基础知识。1设置系统单位导入1英尺的box&#xff0c;1英尺X1英尺X1英尺。一旦导入到场景中&…

android图片浏览远近,快图浏览编辑图片方法介绍_怎么编辑图片_3DM手游

既然是图片管理工具&#xff0c;那么快图浏览肯定也是少不了图片编辑功能的。如何使用快图浏览编辑图片呢&#xff1f;下面小编带来的详细的使用方法&#xff0c;有需要的小伙伴一起来看看吧&#xff01;编辑照片方法介绍&#xff1a;1.第一步&#xff0c;下载安装快图浏览&…

matlab 三维 作图 坐标轴_MATLAB学习——MATLAB中的三维绘图指令

2 基本XYZ立体绘图命令mesh和plot是三度空间立体绘图的基本命令&#xff0c;mesh可画出立体网状图&#xff0c;plot则可画出立体曲面图&#xff0c;两者产生的图形都会依高度而有不同颜色。下列命令可画出由函数形成的立体网状图: xlinspace(-2, 2, 25); % 在x轴上取25点 ylins…

说说python程序的执行过程_表示说的词语

展开全部1、奉劝 [ fng qun ] 释义&#xff1a;敬辞。郑重劝说62616964757a686964616fe58685e5aeb931333365653331。 造句&#xff1a;我们厌恶那些阴险的恶人&#xff0c;奉劝他们改恶为善&#xff0c;才能得到社会的原谅&#xff01; 2、劝告 [ qun go ] 释义&#xff1a;拿道…

HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)

课程里涉及到的内容讲的还是很清楚的&#xff0c;但个别地方有点脱节&#xff0c;任何看不懂卡住的地方&#xff0c;请自行查阅经典著作《Compilers——priciples, Techniques and Tools》(也就是大名鼎鼎的龙书)的对应章节。一. 编译的基本流程完整的编译的5个基本步骤包括lex…

rocketmq 消息指定_SpringBoot 整合 RocketMQ 如何实现消息生产消费?

有时候我们在使用消息队列的时候&#xff0c;往往需要能够保证消息的顺序消费&#xff0c;而RocketMQ是可以支持消息的顺序消费的。RocketMQ在发送消息的时候&#xff0c;是将消息发送到不同的队列中&#xff0c;然后消费端从多个队列中读取消息进行消费&#xff0c;很明显&…

mysql怎么看实例名_南方“中看不中吃”的前4名水果,莲雾只是垫底,你怎么看?...

水果很多人都喜欢吃&#xff0c;南方人可以说是最幸福的&#xff0c;因为南方的水果种类有很多种&#xff0c;而且水果的价格也很便宜&#xff0c;一年四季都能吃到便宜又好吃的水果&#xff0c;南方的很多水果&#xff0c;北方人可能都没有吃过&#xff0c;虽然南方的水果种类…

vuex中的值变化 页面重新渲染_浅谈浏览器的渲染过程,重绘与回流

浏览器的渲染过程 首先&#xff0c;我们先来了解一下浏览器的渲染过程是什么样的&#xff0c;也就是说浏览器把一堆代码呈现到页面上的过程是什么样子的&#xff0c;浏览器采用流式布局模型(Flow Bsaed Layout)&#xff0c;根据下图&#xff0c;我们可以总结出浏览器的渲染步骤…

vc 将已有项目打包成dll 并应用于其他项目_.NET混淆器 Dotfuscator使用教程:保护你的应用之存档报告文件...

Dotfuscator是一款.NET混淆器和压缩器&#xff0c;防止你的应用程序被反编译。本篇文章将继续上一篇文章与大家分享保护应用程序的后续三个部分&#xff1a;存档报告文件、加强保护和替代方法。存档报告文件作为构建的一部分&#xff0c;Dotfuscator会生成报告文件(在Dotfuscat…