html转为pdf的组件有很多,但是还没有哪一款能达到这个效果,其只要原因是wkhtmltopdf使用webkit网页渲染引擎开发的用来将 html转成 pdf的工具,可以跟多种脚本语言进行集成来转换文档。但是就使用简便性来说还是itext等组件占据优势,如果你要转换格式有比较高的要求,那么wkhtmltopdf绝对是不二之选!
下载路径
官网地址 wkhtmltopdf.org/
github地址 github.com/wkhtmltopdf…
使用方法
java调用demo
public class HtmlToPdfInterceptor extends Thread { private InputStream is; public HtmlToPdfInterceptor(InputStream is){ this.is = is; } public void run(){ try{ InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { System.out.println(line.toString()); //输出内容 } }catch (IOException e){ e.printStackTrace(); } }}public class HtmlToPdf { //wkhtmltopdf在系统中的路径 private static final String toPdfTool = "D:\wkhtmltopdf\bin\wkhtmltopdf.exe"; /** * html转pdf * @param srcPath html路径,可以是硬盘上的路径,也可以是网络路径 * @param destPath pdf保存路径 * @return 转换成功返回true */ public static boolean convert(String srcPath, String destPath){ File file = new File(destPath); File parent = file.getParentFile(); //如果pdf保存路径不存在,则创建路径 if(!parent.exists()){ parent.mkdirs(); } StringBuilder cmd = new StringBuilder(); cmd.append(toPdfTool); cmd.append(" "); cmd.append(" --header-line");//页眉下面的线 cmd.append(" --header-center 这里是页眉这里是页眉这里是页眉这里是页眉 ");//页眉中间内容 //cmd.append(" --margin-top 30mm ");//设置页面上边距 (default 10mm) cmd.append(" --header-spacing 10 ");//(设置页眉和内容的距离,默认0) cmd.append(srcPath); cmd.append(" "); cmd.append(destPath); boolean result = true; try{ Process proc = Runtime.getRuntime().exec(cmd.toString()); HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream()); HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream()); error.start(); output.start(); proc.waitFor(); }catch(Exception e){ result = false; e.printStackTrace(); } return result; } public static void main(String[] args) { HtmlToPdf.convert("https://my.oschina.net/papio/blog/835645", "d:/wkhtmltopdf.pdf"); }}复制代码
wkhtmltopdf 参数详解
wkhtmltopdf [OPTIONS]... <input file> [More input files] <output file>常规选项 --allow <path> 允许加载从指定的文件夹中的文件或文件(可重复) --book* 设置一会打印一本书的时候,通常设置的选项 --collate 打印多份副本时整理 --cookie <name> <value> 设置一个额外的cookie(可重复) --cookie-jar <path> 读取和写入的Cookie,并在提供的cookie jar文件 --copies <number> 复印打印成pdf文件数(默认为1) --cover* <url> 使用HTML文件作为封面。它会带页眉和页脚的TOC之前插入 --custom-header <name> <value> 设置一个附加的HTTP头(可重复) --debug-javascript 显示的javascript调试输出 --default-header* 添加一个缺省的头部,与页面的左边的名称,页面数到右边,例如: --header-left '[webpage]' --header-right '[page]/[toPage]' --header-line --disable-external-links* 禁止生成链接到远程网页 --disable-internal-links* 禁止使用本地链接 --disable-javascript 禁止让网页执行JavaScript --disable-pdf-compression* 禁止在PDF对象使用无损压缩 --disable-smart-shrinking* 禁止使用WebKit的智能战略收缩,使像素/ DPI比没有不变 --disallow-local-file-access 禁止允许转换的本地文件读取其他本地文件,除非explecitily允许用 --allow --dpi <dpi> 显式更改DPI(这对基于X11的系统没有任何影响) --enable-plugins 启用已安装的插件(如Flash --encoding <encoding> 设置默认的文字编码 --extended-help 显示更广泛的帮助,详细介绍了不常见的命令开关 --forms* 打开HTML表单字段转换为PDF表单域 --grayscale PDF格式将在灰阶产生 --help Display help --htmldoc 输出程序HTML帮助 --ignore-load-errors 忽略claimes加载过程中已经遇到了一个错误页面 --lowquality 产生低品质的PDF/ PS。有用缩小结果文档的空间 --manpage 输出程序手册页 --margin-bottom <unitreal> 设置页面下边距 (default 10mm) --margin-left <unitreal> 将左边页边距 (default 10mm) --margin-right <unitreal> 设置页面右边距 (default 10mm) --margin-top <unitreal> 设置页面上边距 (default 10mm) --minimum-font-size <int> 最小字体大小 (default 5) --no-background 不打印背景 --orientation <orientation> 设置方向为横向或纵向 --page-height <unitreal> 页面高度 (default unit millimeter) --page-offset* <offset> 设置起始页码 (default 1) --page-size <size> 设置纸张大小: A4, Letter, etc. --page-width <unitreal> 页面宽度 (default unit millimeter) --password <password> HTTP验证密码 --post <name> <value> Add an additional post field (repeatable) --post-file <name> <path> Post an aditional file (repeatable) --print-media-type* 使用的打印介质类型,而不是屏幕 --proxy <proxy> 使用代理 --quiet Be less verbose --read-args-from-stdin 读取标准输入的命令行参数 --readme 输出程序自述 --redirect-delay <msec> 等待几毫秒为JS-重定向(default 200) --replace* <name> <value> 替换名称,值的页眉和页脚(可重复) --stop-slow-scripts 停止运行缓慢的JavaScripts --title <text> 生成的PDF文件的标题(第一个文档的标题使用,如果没有指定) --toc* 插入的内容的表中的文件的开头 --use-xserver* 使用X服务器(一些插件和其他的东西没有X11可能无法正常工作) --user-style-sheet <url> 指定用户的样式表,加载在每一页中 --username <username> HTTP认证的用户名 --version 输出版本信息退出 --zoom <float> 使用这个缩放因子 (default 1) 页眉和页脚选项--header-center* <text> (设置在中心位置的页眉内容) --header-font-name* <name> (default Arial) (设置页眉的字体名称)--header-font-size* <size> (设置页眉的字体大小)--header-html* <url> (添加一个HTML页眉,后面是网址)--header-left* <text> (左对齐的页眉文本)--header-line* (显示一条线在页眉下)--header-right* <text> (右对齐页眉文本)--header-spacing* <real> (设置页眉和内容的距离,默认0)--footer-center* <text> (设置在中心位置的页脚内容) --footer-font-name* <name> (设置页脚的字体名称) --footer-font-size* <size> (设置页脚的字体大小default 11)--footer-html* <url> (添加一个HTML页脚,后面是网址)--footer-left* <text> (左对齐的页脚文本)--footer-line* 显示一条线在页脚内容上)--footer-right* <text> (右对齐页脚文本)--footer-spacing* <real> (设置页脚和内容的距离)./wkhtmltopdf --footer-right '[page]/[topage]' http://www.baidu.com baidu.pdf./wkhtmltopdf --header-center '报表' --header-line --margin-top 2cm --header-line http://192.168.212.139/oma/ oma.pdf表内容选项中 --toc-depth* <level> Set the depth of the toc (default 3) --toc-disable-back-links* Do not link from section header to toc --toc-disable-links* Do not link from toc to sections --toc-font-name* <name> Set the font used for the toc (default Arial) --toc-header-font-name* <name> The font of the toc header (if unset use --toc-font-name) --toc-header-font-size* <size> The font size of the toc header (default 15) --toc-header-text* <text> The header text of the toc (default Table Of Contents) --toc-l1-font-size* <size> Set the font size on level 1 of the toc (default 12) --toc-l1-indentation* <num> Set indentation on level 1 of the toc (default 0) --toc-l2-font-size* <size> Set the font size on level 2 of the toc (default 10) --toc-l2-indentation* <num> Set indentation on level 2 of the toc (default 20) --toc-l3-font-size* <size> Set the font size on level 3 of the toc (default 8) --toc-l3-indentation* <num> Set indentation on level 3 of the toc (default 40) --toc-l4-font-size* <size> Set the font size on level 4 of the toc (default 6) --toc-l4-indentation* <num> Set indentation on level 4 of the toc (default 60) --toc-l5-font-size* <size> Set the font size on level 5 of the toc (default 4) --toc-l5-indentation* <num> Set indentation on level 5 of the toc (default 80) --toc-l6-font-size* <size> Set the font size on level 6 of the toc (default 2) --toc-l6-indentation* <num> Set indentation on level 6 of the toc (default 100) --toc-l7-font-size* <size> Set the font size on level 7 of the toc (default 0) --toc-l7-indentation* <num> Set indentation on level 7 of the toc (default 120) --toc-no-dots* Do not use dots, in the toc轮廓选项 --dump-outline <file> 转储目录到一个文件 --outline 显示目录(文章中h1,h2来定) --outline-depth <level> 设置目录的深度(默认为4)页脚和页眉 * [page] 由当前正在打印的页的数目代替 * [frompage] 由要打印的第一页的数量取代 * [topage] 由最后一页要打印的数量取代 * [webpage] 通过正在打印的页面的URL替换 * [section] 由当前节的名称替换 * [subsection] 由当前小节的名称替换 * [date] 由当前日期系统的本地格式取代 * [time] 由当前时间,系统的本地格式取代
作者:曹元
链接:https://juejin.im/post/6856547881873047559
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
篇中我们介绍了文本的一些样式,这篇接着讲文本样式。
6.文本下划线
一般文本下划线都用在什么地方呢?我想到一个就是画重点考前划重点,有没有画面感,^v^。
用css来实现划重点,也是别具风格呀。
<!DOCTYPE html>
<html>
<head>
<title>css颜色与度量单位</title>
<style>
span{
text-decoration:underline;
}
</style>
</head>
<body>
<p>
在做等离子物理对撞实验的时候,如果把第三能量的极坐标,向负方向调整三个阿尔法单位,那么对最终的结果将会产生多少影响?
<br>
<span>2伽马一步徐龙根号3</span>
</p>
</body>
</html>
text-decoration可以给文本设置下划线,上划线,删除线,取消线。
上面代码实现效果如下:
这个效果看起来两行之间的距离有点拥挤,我们可以调整的它们的距离,稍微远一点,让它们看起不那么拥挤。
7.文本的行间距
用line-height来指定行间距,因为文本都包含在p标签中,所以我们给p标签加了行间距为50px
调整后的效果如下:
看起来下划线的文字还是不够显眼啊,我们再给它加点颜色上去,会更好。
这回好多了。够显眼,就绝对记得住。
text-decoration后面可以设置的值如下:
值 | 说明 |
none | 让本身有划线装饰的文本取消掉 |
underline | 让文本的底部出现一条下划线 |
overline | 让文本的头部出现一条上划线 |
line-through | 让文本的中部出现一条删除线 |
blink | 让文本进行闪烁,基本不支持了 |
text-decoration:none这个会让本身有划线装饰的文本取消掉的意思,例如a标签,天生就带下划线,那要不想要自带的下划线就可以利用这个样式给它去掉。
来尝试一下
<!DOCTYPE html>
<html>
<head>
<title>css颜色与度量单位</title>
<style>
p{
line-height: 50px;
}
span{
text-decoration:underline;
color: red;
}
</style>
</head>
<body>
<p>
在做等离子物理对撞实验的时候,如果把第三能量的极坐标,向负方向调整三个阿尔法单位,那么对最终的结果将会产生多少影响?
<br>
<span>2伽马一步徐龙根号3</span>
<br>
<a href="http://www.baidu.com">百度</a>
</p>
</body>
</html>
百度两个字下面天生就带了下换线,要去掉请使用text-decoration:none
其余几个大家可以自己动手尝试一下效果。
8.设置英文文本转换为大小写
这个标题很好理解,就是专门针对英文的,如果想把英文文本转换大小写可以使用
<!DOCTYPE html>
<html>
<head>
<title>css颜色与度量单位</title>
<style>
p{
line-height: 50px;
}
span{
text-decoration:underline;
color: red;
}
a{
text-decoration:none;
}
</style>
</head>
<body>
<p>
在做等离子物理对撞实验的时候,如果把第三能量的极坐标,向负方向调整三个阿尔法单位,那么对最终的结果将会产生多少影响?
<br>
<span>2伽马一步徐龙根号3</span>
<br>
<a href="http://www.baidu.com">百度</a>
<br>
<span class="english">
no zuo no die you why cry
<br>
you zuo you die don't ask why
</span>
</p>
</body>
</html>
页面效果如下:
这里的英文文本也是写在了span标签里面,受span标签样式的影响这里也变成了红色,也加了下划线。我们给它取消掉这些样式。并给它设置让英文单词首字母变成大写的样式。
下面给出text-transform的值和作用的表格,大家可以自行动手尝试效果。
值 | 说明 |
none | 将已被转换大小写的值恢复到默认状态 |
capitalize | 将英文单词首字母大写 |
uppercase | 将英文转换为大写字母 |
lowercase | 将英文转换为小写字母 |
9.文本添加阴影
text-shadow:5px 5px 5px red;
这里有四个值(3个5px和一个red):第一个值代表水平偏移;第二个值代表垂直偏移;第三个值代表阴影模糊度(可选);第四个值代表阴影颜色(可选)。
10.设置文本的对齐方式
我们可以设置文本的对齐方式,如果你用过word文档的话,那一定知道左对齐、右对齐、居中对齐。css里面同样有
我们来尝试一下居中对齐
值 | 说明 |
left | 靠左对齐,默认 |
right | 靠右对齐 |
center | 居中对齐 |
justify | 内容两端对齐 |
start | 让文本处于开始的边界 |
end | 让文本处于结束的边界 |
start和end属于css3新增的功能,IE和Opera浏览器可能不支持。
11.处理文本之间的距离(letter-spacing)
也就是两个字间的距离,通过例子来感受一下
很明显的可以看到字间距变大了。
12.设置英文单词之间的距离(word-spacing)
13.文本首行的缩进(text-indent)
一般每个段落的首行都要缩进,这是书写书信文件时的规定。
我们去掉了居中对齐的样式,是为了更好地演示首行缩进的效果。
看效果图红框的地方,明显有缩进。
好了,以上就是今天的内容了。
希望大家可以早日学会编程,踏上高薪之路,早日成为白富美、高富帅。动手练,听我的没错。
们来先来分析一下这个案例。
标题容器左对齐,有固定的宽高。标题文字白色,水平垂直居中。
正文共四个段落,每个段落都有固定的宽度,右侧边界对齐。
前三个段落首行空两个字。每个段落里都有一段高亮的文本,有颜色和下划线修饰,也有文本斜体和加粗效果。
段落中的一些文字还有颜色、加粗、下划线以及倾斜等修饰效果。
第四个段落起始有个吉他图标,英文字体有外发光效果。
下面我们来制作这个网页。
创建 007-css-case-1 文件夹,在文件里创建一个 case-text-fonts.html 页面文件和 case-1.css 样式文件。
在 html 文件内创建基础代码,在 head 标签内部引入外部样式 case-1.css。
首先来制作标题。
添加一个 h1 元素,填入标题文本。
在编写标题样式之前,假设 UI 设计师给你的是一篇文章的图片,你可能就犯难了,如何获得标题的宽高、背景颜色和文字大小呢?
大家打开电脑里的QQ,登录进去,Mac电脑按下键盘 Control + Command + A,Windows电脑按下ctrl+alt+a,圈选页面标题,点击对号按钮,完成截屏。
在浏览器中输入 ps.gaoding.com,打开在线版 PS。点击文件,新建,再点击创建按钮。最后,Control + V,将截屏的图片粘贴过来。
应用选框工具,发现标题选区的宽度和高度分别为 200 和 50 像素,文字的大小为 24 像素。
应用吸管工具,点击标题框吸取背景色,点击前景色按钮,得到十六进制颜色值 #a52a2a。
有了这三个值,就可以定义标题的样式了。
h1 {
width: 200px;
height: 50px;
background-color: #a52a2a;
color: white;
line-height: 50px;
font-size: 24px;
text-align: center;
}
定义 h1 选择器,声明样式 width: 200px,height: 50px,background-color: #a52a2a,color: white,font-size: 24px,text-align:center
在浏览器中查看页面,标题的效果基本上都实现了。接下来完成文本的垂直居中对齐。
可以通过给文本声明 line-height 行高属性,来间接实现文本的垂直居中,那行高的值设置为多少呢?根据前面学习的行高知识,将行高的值设置为 50px,也就是文本所在容器的高度。这样,文本在容器中恰好就垂直居中了。
接下来制作四个段落。
在 HTML里添加四个 p 元素,填入一些文本。下面给这些段落添加样式。
p {
width: 500px;
text-indent: 2em;
text-align: justify;
word-spacing: 10px;
text-transform: capitalize;
line-height: 28px;
}
定义 p 选择器,声明样式:width: 500px,让每一个段落都有固定的宽度。text-indent: 2em,每个段首空两格。text-align: justify,实现段落右侧边界对齐。给最后一段英文添加样式:word-spacing: 10px,添加单词间距。text-transform: capitalize,每个单词首字母大写。最后再添加 line-height: 28px,给段落设置一个行间距。
四个段落基本上制作完毕了。接下来装饰个别段落和文字。
分别使用三个 span 元素将这三部分文字包裹起来。给第一个和第三个 span 元素定义 class 属性,值为 mark1。(第一个段落里面的带有下滑划线区域,和第三个段落中的下划线区域)
在CSS中定义 mark1 选择器,声明样式 color: red,text-decoration-line: underline,text-decoration-style: double。
我们看,这两部分文本被红色、双下划线修饰了。
实际效果第三部分文本还带有一个波浪线。需要再定义一个样式覆盖一下。
给这个 span 的样式类再添加一个 mark2。
定义选择器 mark2,声明样式 text-decoration-style: wavy。
效果实现了。
给第二个 span 添加 class 属性,值为 mark3。
定义选择器 mark3,声明样式 color: orange。
第二部分文本变成了橙色。
案例还要求这两部分文字为倾斜效果。使用 span 元素把他们包裹起来,定义 class 等于 mark4。
定义选择器 mark4,声明样式 font-style: italic。
文本倾斜效果实现了。
实际上,千锋全部学科的名称和被特殊修饰的文本都有加粗效果,给全部学科再添加一个 span元素包裹在外层。给所有需要加粗的 span 都添加 mark0 样式类名。
定义选择器 mark0,声明样式 font-weight: bold。
文本加粗效果实现了。
.mark0 {
font-weight:bold
}
.mark1 {
color: red;
text-decoration-line: underline;
text-decoration-style: double;
}
.mark2 {
text-decoration-style: wavy;
}
.mark3 {
color:orange;
}
.mark4 {
font-style: italic;
}
最后,给英文段落定义特殊字体并添加外发光的效果。
.p1 {
font-family: "Sofia", sans-serif;
text-indent: 0;
}
在 head 里添加引用谷歌字体的 css 链接,和自定义 icon 图标的 js 地址。
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Sofia&effect=outline">
<script src="https://kit.fontawesome.com/772ccfd500.js" crossorigin="anonymous"></script>
给英文的段落元素定义 class 属性,值为 p1 font-effect-outline。
添加 p1 选择器,声明样式:font-family: "Sofia", sans-serif。
字体效果实现了!在段首还有一个 icon 图标。
如何查找自己心仪的图标呢?大家可以访问 fontawesome 官网这个地址,海量图标就任你选择了。guitar 就在这里。 (https://fontawesome.com/search?p=2&favorites=staff)
在段落头部添加 i 元素,定义 class属性,值为 fas fa-guitar。 (注意中间有空格)。
我们发现,真正使用这个图标时,样式类的值,要求在官网查找到的图标名字前,加上 fa- (读作:fa杠),并且还需要添加 fas。
图标添加好了!实际的效果,最后一行没有缩进。
在 .p1 (注意这里有点) 选择器里添加 text-indent: 0,来覆盖 p 元素的样式。
为什么能覆盖呢?答对了,因为作用的优先级—— class 选择器要大于元素选择器。
这样,就取消了最后一行的段首缩进!
文章配套视频链接:https://www.bilibili.com/video/BV1oU4y1278g?p=68
*请认真填写需求信息,我们会在24小时内与您取得联系。