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;…

Linux fast open,Linux内核3.7 TCP Fast Open验证实例

Linux内核在3.6和3.7合入了TCP Fast Open特性&#xff0c;在3.7.3版本上验证了一下&#xff0c;I did it!以下是C语言实例()&#xff1a;server端代码&#xff1a;#include /* See NOTES */#include#include#includeint main(){int portno 5060;socklen_t clilen;char buffer[…

vue 怎么全局到入常量_Vue 中如何定义全局的变量和常量(转)

17.6k 次阅读 读完需要 10 分钟7Vue 中如何定义全局的变量和常量我想要定义一个变量, 在项目的任何地方都可以访问到, 不需要每一次使用的时候, 都引入.尝试1:创建 global.js 并且在其中定义let a 10;在入口文件中引入 global.jsimport ./global.js在项目中使用:a// 报错发…

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

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

android搭建opencv开发环境,Android Studio搭建opencv开发环境

文章不配图片&#xff0c;阅读需要有Android开发基础并熟悉Android Studio。一、搭建基于Java开发环境以下内容介绍如何搭建基于Java jni的opencv开发环境。1、准备工作从opencv官网下载Android平台开发sdk并解压&#xff0c;假设解压后文件夹名为opencv-4.3.0-android-sdk。(此…

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.如何将数…

python程序打包成安卓app教程_Python打包方法基本应用方式介绍

Python编程语言是一款功能强大的免费开源的通用型计算机程序应用语言&#xff0c;对于经验丰富的开发人员来说&#xff0c;掌握这样一款语言在其程序开发中是一个比较重要的选择。我们今天就先来了解一下python打包方法的相关应用。 一、简介 py2exe是一个将Python脚本转换成wi…

android添加删除项目,编写android计算器添加删除按钮,出现很抱歉,XX项目已停止运行。...

这是删除按钮监听代码&#xff1a;//del 按钮的监听btnDel (Button) findViewById(R.id.delete);btnDel.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View view) {btnDel.setOnClickListener(this);//短按//btnDel.setOnLongClickListener(this);…

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

解二元一次方程组---加减法一、教学目的&#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;下载安装快图浏览&…

h5微信本地调试 vue_vueh5中使用微信sdk

微信官方sdk教程安装vue 微信sdk 使用NPM安装&#xff0c;不会的百度学npm install jweixin-module --save创建一个wxsdk.js 文件// 引入微信sdkvar jweixin require(jweixin-module);export default {//判断是否在微信中isWechat: function() {var ua window.navigator.user…

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

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