最近花了2天多的时间终于把HTML生成PDF弄好了。步骤如下:

1、首先是技术选型。看了好多都是收费的就不考虑了。

免费的有:

  1. jsPDF(前端生成,清晰度不高,生成比较慢)
  2. iText(严格要求html标签。这个好像也是收费的)
  3. wkhtmltopdf(简单、配置选项多、生成快、支持跨平台、也支持HTML生成图片)

因此选择wkhtmltopdf。

2、前期准备,首先需要下载wkhtmltopdf.exe(下载地址:https://wkhtmltopdf.org/downloads.html)阅读配置参数(https://wkhtmltopdf.org/usage/wkhtmltopdf.txt

常用参数:

  1. -T 0 :设置上下左右margin-top=0(-B 0 -L 0 -R 0 -T 0,上下左右都设置一下)
  2. -s A4:设置A4纸大小,默认A4
  3. --disable-smart-shrinking:禁止缩放(不设置这个,生成的pdf会缩放)
  4. --zoom 1:设置缩放系数,默认为1。如果--disable-smart-shrinking设置了,--zoom就不用设置了。
  5. --cookie name value:设置cookie,如果下载的url需要登录(用cookie),那么这个参数很重要。

3、设置需要打印的页面(核心是分页)

A4纸大小:210mm×297mm,因此页面的每个div大小也是A4纸大小。

这里的页面设置很重要。另外,设置了分页的页码,示例如下:

<style>
#view {
height: %;
margin: auto;
padding: ;
width: 210mm;
} /*设置A4打印页面*/
/*备注:由于@是否特殊符号,样式放在css文件中没问题,放在cshtml文件就不行了,需要@@。*/
@preview-item {
size: A4;
margin: ;
} @media print {
.preview-item {
margin: ;
border: initial;
border-radius: initial;
width: initial;
min-height: initial;
box-shadow: initial;
background: initial;
page-break-after: always;
}
}
.preview-item {
width: %;
height: 297mm;
position: relative;
} .page-view {
position: absolute;
width: %;
text-align: center;
height: 60px;
line-height: 60px;
bottom: ;
}
</style> <div id="view">
<div class="preview-item">
<div class="preview-item-body">这是第一页</div>
<div class="page-view">/</div>
</div>
<div class="preview-item">
<div class="preview-item-body">这是第二页</div>
<div class="page-view">/</div>
</div>
<div class="preview-item">
<div class="preview-item-body">这是第三页</div>
<div class="page-view">/</div>
</div>
</div>

  

4、C#代码实现(核心是Arguments的设置)

        /// <summary>
/// HTML生成PDF
/// </summary>
/// <param name="url">url地址(需要包含HTTP://)</param>
/// <param name="path">PDF存放路径(可以是aaa.pdf,也可以用路径,只能是绝对地址,如:D://aaa.pdf)</param>
public static bool HtmlToPdf(string url, string path)
{
path = HttpContext.Current.Server.MapPath(path);string cookie = "cookieKey cookieValue";//改为为你自己的
string Arguments = "-q -B 0 -L 0 -R 0 -T 0 -s A4 --no-background --disable-smart-shrinking --cookie " + cookie + " " + url + " " + path; //参数可以根据自己的需要进行修改 try
{
if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(path))
return false;
var p = new Process();
string str = HttpContext.Current.Server.MapPath("/htmlToPDF/wkhtmltopdf.exe");
if (!File.Exists(str))
return false;
p.StartInfo.FileName = str;
p.StartInfo.Arguments = Arguments;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = false;
p.Start();
p.WaitForExit();
System.Threading.Thread.Sleep(); return true;
}
catch (Exception ex)
{
LogHelper.WriteError(ex);
}
return false;
}

方法的调用:

            string url = Request.Url.AbsoluteUri.Replace("DownloadPDF", "Detail");//DownloadPDF是下载页面,Detail是上面的HTML页面
string pdfDirectory = "/Data/PDF/";
if (!System.IO.Directory.Exists(HttpContext.Current.Server.MapPath(pdfDirectory)))
{
System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath(pdfDirectory));
}
string path = pdfDirectory + Guid.NewGuid() + ".pdf";
HtmlToPdf(url, path); if (!System.IO.File.Exists(Utils.GetMapPath(path)))//如果生成失败,重试一次
{
HtmlToPdfHelper.HtmlToPdf(url, path);
} if (!System.IO.File.Exists(Utils.GetMapPath(path)))//如果生成失败,重试一次
{
HtmlToPdfHelper.HtmlToPdf(url, path);
}

  

5、ok,采坑结束~

C#使用wkhtmltopdf,把HTML生成PDF(包含分页)的更多相关文章

  1. wkhtmltopdf 将网页生成pdf文件

    先安装依赖 yum install fontconfig libXrender libXext xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi freetype l ...

  2. C# html生成PDF遇到的问题,从iTextSharp到wkhtmltopdf

    我们的网站业务会生成一个报告,用网页展示出来,要有生成pdf并下载的功能,关键是生成pdf. 用内容一段段去拼pdf,想想就很崩溃,所以就去网上找直接把html生成pdf的方法. 网上资料大部分都是用 ...

  3. wkhtmltopdf 生成pdf

    public class PdfHelper { static string RootPath { get { string AppPath = ""; HttpContext H ...

  4. 页面导出生成pdf,使用wkhtmltopdf第三方工具

    把页面导出生成pdf,这里用到第三方的工具,使用方法中文文档没有找到,网上也没找到网友详细的神作.没有深入研究,所以也不赘述了,当然最基本的使用大多数也够用了,详细参数的官网也没介绍,大家使用的时候, ...

  5. java调用wkhtmltopdf生成pdf文件,美观,省事

    最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...

  6. wkhtmltopdf+itext实现html生成pdf文件的打印下载(适用于linux及windows)

    目中遇到个根据html转Java的功能,在java中我们itext可以快速的实现pdf打印下载的功能,在itext中我们一般有以下三中方式实现 配置pdf模板,通过Adobe Acrobat 来设置域 ...

  7. 使用wkhtmltopdf工具生成pdf

    背景:将前台页面转换成pdf文档保存到服务器 最开始计划使用canvas2pdf在前端进行生成.但是canva2pdf转换的pdf有严重的失真问题,然后决定使用wkhtmltopdf工具进行生成. 思 ...

  8. Python之将Python字符串生成PDF

      笔者在今天的工作中,遇到了一个需求,那就是如何将Python字符串生成PDF.比如,需要把Python字符串'这是测试文件'生成为PDF, 该PDF中含有文字'这是测试文件'.   经过一番检索, ...

  9. 使用puppeteer生成pdf与截图

    之前写过一篇 vue cli2 使用 wkhtmltopdf 踩坑指南,由于wkhtmltopdf对vue的支持并不友好,而且不支持css3,经过调研最终选择puppeteer,坑少,比较靠谱. 一. ...

随机推荐

  1. C++关键字:重学记录

    const_cast dynamic_cast explicit

  2. _initialize() 区别 __construct()

    _initialize()方法是在任何方法执行之前,都要执行的,当然也包括 __construct构造函数. 也就是说如果存在_initialize()函数,调用对象的任何方法都会导致_initial ...

  3. 学习记录--如何将exec执行结果放入变量中?

    declare @num int, ) set @sqls='select @a=count(*) from tb ' exec sp_executesql @sqls,N'@a int output ...

  4. Arduino 串口通讯参考笔记 - Serial 类库及相关函数介绍

    声明: 本ID发布的所有文章及随笔均为原创,可随意转载,单转载文章必须注明作者 aiyauto 及包含原文出处地址 http://www.cnblogs.com/aiyauto/p/7071712.h ...

  5. hadoop balancer

    一.balancer是当hdfs集群中一些datanodes的存储要写满了或者有空白的新节点加入集群时,用于均衡hdfs集群磁盘使用量的一个工具.这个工具作为一个应用部署在集群中,可以由集群管理员在一 ...

  6. Django——11 状态保持 form表单 登陆注册样例

    Django 状态保持 用户状态例子 实现注册登陆实例 django forms 表单的使用 注册功能 登陆功能   状态保持cookie和session 1.http协议是无状态的:每次请求都是一次 ...

  7. ZooKeeper学习总结(1)——ZooKeeper入门介绍

    1. 概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等. 它有如下的一些特点: 简单 Zookeeper的核 ...

  8. HDU - 1403 - Longest Common Substring

    先上题目: Longest Common Substring Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  9. MyEclipse10及插件安装教程(附安装包和破解文件)

    MyEclipse10安装包+破解文件:MyEclipse10安装包.MyEclipse10破解文件MyEclipse10安装包地址:http://pan.baidu.com/s/1pJrCLB1My ...

  10. boost::shared_ptr

    boost::shared_ptr是boost库中用来管理指针的模板,使用它需要#include <boost/shared_ptr.hpp>.本文介绍它的一些基本用法. 第一,boost ...