1、使用背景
     最近公司需要把html页面的内容生成pdf并下载,试过很多方法都没有满意的效果,后来找到wkhtmltopdf这款软件,终于解决了这个问题。

wkhtmltopdf是exe文件,需要下载安装,之后全部文件放到mvc项目,用C#的ProcessStartInfo调用执行。

要导出的html页面:

2、下载安装
     官网:https://wkhtmltopdf.org/

主页download里下载对应系统的版本安装并把安装后的文件放到vs里面方便之后调用。

3、使用的参数

      wkhtmltopdf的参数有四种: 封面对象、目录对象、文档对象和页面对象。这里需要用到的是文档对象和页面对象。

还有很多其他参数,具体的参数列表可以看官方文档:https://wkhtmltopdf.org/usage/wkhtmltopdf.txt

使用方法:wkhtmltop
      df [GLOBAL OPTION]... [OBJECT]... <output file>

从左到右依次是:命令开始、使用灰度模式、禁止智能缩放、设置页眉为html文件、生成pdf的页面网址、生成的pdf文件名称。
     上面是在命令提示符使用的方式,在mvc里使用:

  ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = file;
startInfo.Arguments = "wkhtmltopdf --grayscale --disable-smart-shrinking --header-html head.html https://www.baidu.com 123.pdf";
startInfo.CreateNoWindow = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
var cc = Process.Start(startInfo);
cc.WaitForExit();
cc.Close();

4、添加水印
     公司要求生成的pdf需要添加水印,每页pdf显示两个logo水印图片。开始是用给每个div设置背景图片的方式添加水印,让背景图片以y轴重复。由于每个div的高度不定,导致一个水印生成在两个pdf页面,影响美观,果断放弃。后来使用页眉设置html的方式来显示水印,这里要注意的是,页眉会占用html的位置,所以我用before和after伪元素来写两个logo水印。

水印效果图:

 <!DOCTYPE html>
<html>
<head>
<style>
* { margin:0;padding:0;}
#divd::before{content:"";width:400px;height:400px;background:url(mark.png);position:absolute;opacity:0.3;left:50%;margin-left:-200px;}
#divd::after{content:"";width:400px;height:400px;background:url(mark.png);position:absolute;opacity:0.3;left:50%;margin-left:-200px;top:400px}
</style>
</head>
<body style="border:0; margin: 0;">
<div id="divd" style=""></div>
</body>
</html>

之后只要用--header-html head.html方式调用这个页面就会每页pdf生成两个水印图片。

5、pdf分页
默认pdf生成是把内容从上往下写入,并不好看,导出的pdf效果:

公司要求每个div处需要从新的页开始,这里给需要分页的div添加page-break-before:left样式即可,最终pdf效果:

6、其他
     a、如果有td或者th需要隐藏border,需要使用这个样式border:0。
     b、生成的pdf设置间距时用padding不用margin,类似“padding:1px 2px 3px 4px”这种样式要改成“padding-top:1px;padding-right:2px;padding-bottom:3px;padding-left:4px;”。

c、html里面如果有font-family样式和h1、h2、h3标签也会出错;解决方法是去掉或者替换这些字符串。

wkhtmltopdf导出html到pdf的更多相关文章

  1. Java操作wkhtmltopdf实现Html转PDF

    做java开发的都知道,java生成pdf大部分都是用itext,itext的确是java开源组件的第一选择.不过itext也有局限,就是要自己写模版,系统中的表单数量有好几百个,为每个表单做一个导出 ...

  2. wkhtmltopdf 将网页转换为PDF和图片

    wkhtmltopdf 是一个shell工具,它使用了WebKit渲染引擎和Qt,将网页html转换为pdf的强大工具,转换后的pdf也可以通过pdf工具进行复制.备注.修改 官网下载地址:http: ...

  3. 导出excel和PDF小结 vba

    最近接触了一个关于Access工具的项目,所以整理下需要使用的方法. 功能要求简介: 1.将数据表中的数据导出到excel和PDF 2.并根据某个字段名称分sheet输出. 3.无模板方式 方案简介: ...

  4. 【转】Java通过IText导出word和pdf

    原帖地址:http://blog.csdn.net/zwx19921215/article/details/34439851 最近做的项目中需要用到把Highcharts图表导出word和pdf的功能 ...

  5. BarTender 2016如何导出模板为pdf文件?

    最近有小伙伴来问,BarTender 2016能不能导出模板为pdf文件?这个是可以的,之前针对BarTender 10.1就介绍过一种方法了.本文,小编再针对BarTender 2016给大家讲下如 ...

  6. jquery插件导出excel和pdf(解决中文乱码问题)

    参考文件:http://jackyrong.iteye.com/blog/2169683 https://my.oschina.net/aruan/blog/418980 https://segmen ...

  7. Magicodes.IE已支持导出Word、Pdf和Html

    关于Magicodes.IE 导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel.Word.Pdf和Html. GitHub地址:https://github.com/xin-la ...

  8. C#&.Net干货分享- iTextSharp导出数据源到PDF

    namespace Frame.ITextSharp{    /// <summary>    /// iTextSharp导出数据源到PDF    /// </summary> ...

  9. php使用wkhtmltopdf导出pdf

    参考:史上最强php生成pdf文件,html转pdf文件方法 http://biostall.com/wkhtmltopdf-add-header-footer-to-only-first-last- ...

随机推荐

  1. angularjs 获得当前元素属性

    先用 console.log(this)查看下当前被点击元素的 this 属性,然后可以看见里面有个$index属性,该属性指向的就是DOM元素列表中当前被点击的那个DOM的下标,只需要使用this. ...

  2. bzoj 2836 魔法树 —— 树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2836 树链剖分裸题: 写码五分钟,调码两小时,RE不断,狂交二十五遍,终于找到一处小细节—— ...

  3. PHP empty()函数使用需要注意

    在 PHP 5.5 之前,empty() 仅支持变量:任何其他东西将会导致一个解析错误.换言之,下列代码不会生效: empty(trim($name)). 作为替代,应该使用trim($name) = ...

  4. Android Handler消息机制源码解析

    好记性不如烂笔头,今天来分析一下Handler的源码实现 Handler机制是Android系统的基础,是多线程之间切换的基础.下面我们分析一下Handler的源码实现. Handler消息机制有4个 ...

  5. CoreBluetooth Central模式 Swift版

    也是醉了,CB这个API到现在也没有Swift的文档.最新的文档还是3年前还是4年前的OC版的,被雷的外焦里嫩的.自己一点一点写成Swift还各种报错,最坑的是这些错误压根找不到解决方案.索性自己做个 ...

  6. poj1511【最短路spfa】

    题意: 计算从源点1到各点的最短路之和+各点到源点1的最短路之和: 思路: 源点这个好做啊,可是各点到源点,转个弯就是反向建边然后求一下源点到各点的最短路,就是各点到源点的最短路,在两幅图里搞: 贴一 ...

  7. update cdh version ,but cdh use old conf ,problem solve

    最近升级cdh版本,从4.5 升级到 5.0.0 beta-2 但是升级后,发现/etc/alternatives 路径下的软链接还是只想旧的4.5 版本,而且hadoop环境也是沿用4.5 的版本c ...

  8. PHP 使用 header 方式实现文件下载功能

    header() 函数向客户端发送原始的 HTTP 报头. 下载文件要用的的请求头: header("Content-type:application/octet-stream") ...

  9. C++类的默认函数

    在C++中,一个类有八个默认函数: 默认构造函数: 默认拷贝构造函数: 默认析构函数: 默认重载赋值运算符函数: 默认重载取址运算符函数: 默认重载取址运算符const函数: 默认移动构造函数(C++ ...

  10. PyQt5编程入门

    1  25行的弹出式闹钟 import sys import time from PyQt5 import QtCore from PyQt5.QtWidgets import QLabel from ...