整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

java将html转为pdf


html转为pdf的组件有很多,但是还没有哪一款能达到这个效果,其只要原因是wkhtmltopdf使用webkit网页渲染引擎开发的用来将 html转成 pdf的工具,可以跟多种脚本语言进行集成来转换文档。但是就使用简便性来说还是itext等组件占据优势,如果你要转换格式有比较高的要求,那么wkhtmltopdf绝对是不二之选!

下载路径

官网地址 wkhtmltopdf.org/

github地址 github.com/wkhtmltopdf…

使用方法

  1. windows直接使用:只要在windows命令行中输入c:\wkhtmltopdf.exe my.oschina.net/papio/blog/… c:\blog.pdf 就可以把这篇文章转成pdf,并保存到C盘根目录。
  2. java调用:java中调用wkhtmltopdf的命令Runtime.getRuntime().exec("c:\wkhtmltopdf.exe my.oschina.net/papio/blog/… c:\blog.pdf")就可以实现转换。

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