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
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
015-12-02 10:26:02 作者:马荣
【中关村在线软件资讯】12月2日消息:臭名昭著的Adobe Flash居然要改名了,Adobe今日宣布Flash Professional将在以后版本中更名为Adobe Animate CC。
Adobe Animate CC将加入对HTML5的支持,这应该算是对趋势的一种顺应。为此,Adobe将大部分Flash事业部员工转移到新的部门来开发HTML5,CSS3和SVG等。
在HTMML5逐渐普及之后,Adobe Flash Professional也加强了对HTML5的支持,帮助开发人员创建更多网站、广告和动画电影。不过Animate CC还将继续支持Flash SWF文件。
Adobe Animate CC
目前已经没有人使用Flash来制作网站,只有网络广告还在对Flash提出需求,但是,自从推出HTML5之后,Flash音频和视频源数量也已经显著下降。
在业界越来越多的人排斥Flash,所以Adobe将其更名为Adobe Animate CC也是情理之中的,当然也是转变的开始。这样一来CC家族的成员又壮大了。
网页中添加视频、声音、动画等,可以增强用户体验。在HTML5之前,为网页添加多媒体的唯一办法,就是使用第三方的插件(如,Adobe Flash等)。
HTML5中,提供了对多媒体的原生支持,只需通过 video 元素,就可以向网页嵌入视频、电影或音频资源,通过 audio 元素向网页嵌入音频资源,省时省力。
HTML中嵌入视频和音频代码
在HTML5时代,在网页中嵌入视频非常简单,只需要一个 video 元素,并设置它的 src 属性,使其链接一个视频地址就可以完全搞定了,这个太esay了
<video src="media/vedio.mp4"></video>
把这个网站在IE8中打开一看,网站上除了一片空白外,什么也没有,这是为什么呢?
原来 video 是HTML5最新引入的元素,并不是所有浏览器都支持它,IE8及以下版本都无法识别 video 标签。如果浏览器不识别 video标签,则会忽略它,当做什么都没有。这就是网站上一片空白的原因。
这个问题好解决,只需在 video 标签之间放置文本信息,不支持 video 标签的老浏览器,会显示 video 标签之间的文本信息,以提示用户浏览器不支持 video,就这么简单!
<video src="media/vedio.mp4">
你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!
</video>
在IE8上打开一看,确实显示了提示文本,这下好多了,至少用户知道自己的浏览器不能播放视频,该换浏览器了。
下载了Opera浏览器的最新版本25.0,打开一看,怎么还是一片空白外!Opera浏览器明明是支持video标签的,那又是为什么呢?
这个就得从视频的编码格式说起了。video 元素支持三种视频格式:Ogg、MP4、WebM。
Ogg是带有Theora视频编码和Vorbis音频编码的文件,后缀名为 .ogg;MP4是带有H.264视频编码和AAC音频编码的MP4文件,后缀名为 .mp4;WebM是VP8视频编码和Vorbis音频编码的文件,后缀名为 .webm。
这个Opera浏览器呢,它可以支持ogg,但不支持mp4。由于Opera支持video标签,故video标签之间的文本信息没有显示出来,但它不支持ogg,所以就不进行播放,最终导致页面出现一片空白。这下可怎么办呢?
其实办法有的是,我们可以从网上下载一副图像,放到视频播放窗口,如果视频无法播放,就显示这张图片,是不是更好呢?从网上下载一张美女图片,干脆叫beauty.jpg吧。那这个图像怎么添加到视频窗口呢?
video标签有个poster 属性,就是专门在视频窗口放置图片的。poster是一个video的占位符,无论什么情况下,只要视频还没有播放(视频下载过程中、视频不存在、不支持该视频类型、用户点击播放按钮前),就会显示该图像,可以看做是视频播放之前插入的宣传画或海报。
<video src="media/vedio.mp4" poster = "img/beauty.jpg">
你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!
</video>
在Opera浏览器上刷新一下,真的有一个美女冲着自己微笑呢。虽然视频没有播放出来,这回心情却是好多了。
那我可不能一天到晚只看美女呀,视频还是还是要想办法播放出来的。既然Opera浏览器不支持mp4,我们就换成需要ogg吧,这样就肯定没问题了。
我想了想,这个办法不好,万一某个浏览器只支持支持ogg,不支持mp4呢。这年头,什么都缺,就是不缺点子,随便在网上一搜,办法就有了。
在 video 元素中添加 source 元素,就可以解决这个问题。在source 元素中,通过 src 属性指定视频的地址,通过 type 属性指定视频的类型,以帮助浏览器决定是否能播放该视频。并且,在 video 元素中可以添加任意多个source 元素,让不同的 source 元素链接到不同的视频文件。
这样的话,当浏览器发现 video 元素时,首先会查看它本身是否定义了 src 属性。如果没有,就会检查 source 元素。浏览器会逐个查看这些视频源,直到找到一个可以播放的视频。一旦找到,就会播放它并忽略其他的视频源。我们干脆添加两个source,一个是mp4,一个是ogg,这下视频是一定能播放出来了。
<video poster = "img/beauty.jpg">
<source src="media/vedio.mp4" type="video/mp4">
<source src="media/vedio.ogg" type="video/ogg">
你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!
</video>
在Opera浏览器上又刷新一下,只有美女冲着我微笑,视频还是没播放出来。唉,太粗心了,忘记添加播放视频的控件了。
在video标签中,通过添加controls 属性来为视频添加播放控件,方便用户执行播放、暂停操作和音量控制。
<video poster = "img/beauty.jpg" controls>
(此处略去500字…)
</video>
在Opera浏览器上又刷新一下,效果真的不一样,这次不仅看到美女,还看到了视频控件。用鼠标猛戳一下那个播放按钮,哈哈,不错,真的听到美妙的旋律。我们的ogg文件,终于播放出来了,让我们好好享受一下吧O(∩_∩)O。
听了一会,忽然一想,不对呀,我刚才点了播放按钮后,等了半天才听到声音。能不能我一点播放按钮,就立即播放呢?
原来视频也是需要下载缓存的,点击播放按钮后,首先缓存,然后才播放的。那能不能在页面加载的同时就缓存呢。这样,用户点击播放后,就不必等待了。
这当然可以,在video标签中,通过添加preload属性来为视频添加预加载功能,在页面加载的同时加载视频。
<video poster = "img/beauty.jpg" controls preload>
(此处略去500字…)
</video>
关于 preload 属性,稍微再啰嗦一点,就是可以把它设置为 metadata,让浏览器仅仅预加载视频的基本信息,如尺寸、时长、以及一些关键的帧。这样的话,在开始播放之前,浏览器可以提前计算视频的显示尺寸。
既然一切都OK了!让我们看看mp4是不是能正常播放。下载最新版的Google Chrome 38.0浏览器,打开网页,猛戳一下播放按钮。
等等~,等等~,不对,怎么只有声音没有画面,明明是mp4格式的文件呀?使用暴风影音试了一下,是有画面的呀!
辛辛苦苦又在网上搜了一番,花了整整586秒,终于找到了答案。mp4视频需要h.264编码格式才会有图像的。
找了一个 h.264 编码格式的 mp4 试了一下,不错,确实有图像了!看了半天,原来是一部老外的电影,叽里咕噜一阵,一句话也没听懂。那O(∩_∩)O~,能否提供中文字幕呢,这样就不必费老大劲去听了!
HTML5中,通过在video元素添加track元素为视频添加字幕。字幕文件有两种格式:WebVTT和TTML。WebVTT是Web视频文本轨迹(Web Video Text Track),是UTF-8编码格式的文本文件;TTML是时序文本标记语言(Timed Text Markup Language),是XML格式的文件。两种文件的具体格式,已经超出我们的讨论范围。
video元素支持添加多个track元素,不同的track元素链接到不同的字幕文件。用户可以在各个字幕间进行切换。
<video poster = "img/beauty.jpg" controls preload>
<track src="en_track.vtt" kind="subtitles" srclang="en" label="English" default>
<track src="cn_track.vtt" kind="captions" srclang="zh" label="简体中文">
</video>
track元素中,src属性指定字幕文件的URL;srclang属性字幕文件的语言类型,若kind 属性值是 "subtitles" 时,该属性必需的;label 属性指定字幕标签,每个字幕元素必需设置一个唯一不重复的标签,切换字幕时,会显示标签的名称;kind指定字幕内容类型,只能是subtitles、captions、descriptions、chapters、metadata 之一;default属性指定是否是默认字幕,如果一个都没指定,将不会自动显示字幕。
除了字幕外,我还希望对视频进行过多的控制,比如让视频自动播放、循环播放、默认静音,以及视频窗口的尺寸等等,这些都能做到吗?
这已经不是什么事了,video 元素已经提供了相关属性,根据需要设置相应的属性就可以了。这些属性及含义见表 23:
HTML中嵌入视频和音频代码
哦,原来这么简单呀!那就到此为止吧,网页中嵌入视频的全部代码都在这里,就打包给你吧!
<video width="300" poster="img/beauty.jpg" controls preload autoplay loop muted>
<source src="media/vedio.mp4">
<source src="media/vedio.ogg">
<track src="en_track.vtt" kind="subtitles" srclang="en" label="English" default>
<track src="cn_track.vtt" kind="captions" srclang="zh" label="简体中文">
你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!
</video>
睁大眼睛一看,却只有7行代码。然而,就这区区7行代码,可把他折磨得够呛。
看着这一切都全部搞定,他仰望着天空,长长呼了一口气,显得是那么的放松,那么的惬意。此时,他闭上眼睛,在自己的梦幻世界里遨游!
有了在网页中嵌入视频的经历,要在网页中嵌入音频,那简直就是小菜一碟了。只要把vedio元素换成 audio 元素,就全部搞定。
但需要了解的是,audio 所支持的音频格式只有Ogg Vorbis、mp3 和 wav。还要知道,由于音频没有画面,也就没有 width、height、poster 属性,而其他属性都支持,并且跟视频的含义相同。
网页中嵌入音频的代码如下:
<audio controls preload autoplay loop muted>
<source src="media/audio.mp3">
<source src="media/audio.wav">
<source src="media/audio.ogg">
你的浏览器已经老掉牙了,不支持audio,还不赶快使用现代浏览器O(∩_∩)O~!
</audio>
*请认真填写需求信息,我们会在24小时内与您取得联系。