网络采集软件核心技术剖析系列(4)---使用C#语言如何将html网页转换成pdf(html2pdf)
一 本系列随笔概览及产生的背景
本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第四篇,希望大家继续支持,为我继续写作提供动力。
自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱。同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的。
该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者。
本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持。
很多初学者常有此类困惑,“为什么我书也看了,C#相关的各个方面的知识都有所了解,但就是没法写出一个像样的应用呢?”
这其实还是没有学会综合运用所学知识,锻炼出编程思维,建立起学习兴趣,我想该系列文章也许会帮到您,但愿如此。
开发环境:VS2008
本节源码位置:https://github.com/songboriceboy/csharphtml2pdf
源码下载办法:安装SVN客户端(本文最后提供下载地址),然后checkout以下的地址:https://github.com/songboriceboy/csharphtml2pdf
系列文章提纲如下:
二 第四节主要内容简介(使用C#语言如何将html网页转换成pdf)
本节示例代码的运行界面如下图所示。点击生成PDF按钮后,程序做了3件事情:
(1)下载网页地址中博文的正文;
(2)下载博文中的全部图片到本地;
(3)将文字和图片用后面所说的工具生成为PDF文档。

点击生成PDF按钮后,该程序后自动下载网址中对应的网页,并在可执行程序所在目录生成一个以博文标题命名的文件夹,如下图所示:

该文件夹中包含了网页正文的html文档(index.html文件),正文中的全部图片,以及最后生成的pdf文档。如下图所示:

生成的pdf文档效果如下图所示:

将html文件转换成pdf文件所需要的技术非常高,我们需要写一个既能解析html文档(类似浏览器功能),又能生成pdf文档(需要掌握pdf文档结构细节)的工具,幸运的是一个有一个好用免费的现成的工具,那就是wkhtmltopdf(http://www.wkhtmltopdf.org/)。
首先,我们来看一下如何通过这个工具来转html文档到pdf文档。下载对应平台的可执行文件(windows平台的可以在我上面的github地址中下载到,在PDFLIB文件夹中)。文件夹中有4个文件,如下图所示:

进入DOS界面,执行命令wkhtmltopdf.exe www.cnblogs.com cnblogs.pdf,第一个参数是要转化的网页地址(www.cnblogs.com),
第二个参数是要保存的pdf文件名称(cnblogs.pdf),这个命令执行成功之后会发现在当前路径下生成了一个cnblogs.pdf文件(我这里的路径是d:/PDFLIB/)。

生成的PDF文件如下:

接下来我们需要做的是将这个生成过程整合到我们自己开发的软件中。
由上面的做法可以很容易得出,我们需要使用C#语言来实现进程间通信,即在我们自己的代码中启动wkhtmltopdf.exe进程,并传递给wkhtmltopdf.exe其所需要的参数。
C#中启动一个进程可以利用Process类,下面我们就来看一下具体做法,核心代码如下:
public bool _html2pdf(string fileName)
{
string strPdfSavedPath = m_strPath;
if (!Directory.Exists(strPdfSavedPath))//判断是否存在
{
Directory.CreateDirectory(strPdfSavedPath);//创建新路径
} if (!File.Exists(strPdfSavedPath + fileName + ".pdf"))
{ string strHtmlSavedPath = m_strPath;
string file_flvbind = Application.StartupPath + @"\PDFLIB\wkhtmltopdf.exe";
//MoveFolderTo(fileName, Application.StartupPath + @"\PDFLIB\");
//生成ProcessStartInfo
ProcessStartInfo pinfo = new ProcessStartInfo(file_flvbind);
//pinfo.WorkingDirectory = Application.StartupPath + @"\PDFLIB\";
pinfo.WorkingDirectory = strHtmlSavedPath;
//设置参数
StringBuilder sb = new StringBuilder();
sb.Append("--footer-line ");
sb.Append("--footer-center \"powered by 际为软件事务所(http://www.cnblogs.com/ice-river)\" ");
sb.Append("\"" + "index.html\""); sb.Append(" \"" + strPdfSavedPath + fileName + ".pdf" + "\""); pinfo.Arguments = sb.ToString();
//隐藏窗口
pinfo.WindowStyle = ProcessWindowStyle.Hidden;
//启动程序 Process p = Process.Start(pinfo);
p.WaitForExit();
//DeleteFiles(Application.StartupPath + @"\PDFLIB\");
if (p.ExitCode == 0)
{
DelegatePara dp = new DelegatePara();
dp.strLog = "生成 [" + fileName + ".pdf] 成功!\n"; m_delesPDF.Refresh(dp);
return true;
}
else
{
DelegatePara dp = new DelegatePara();
dp.strLog = "生成 [" + fileName + ".pdf] 失败!\n";
m_delesPDF.Refresh(dp);
return false;
}
}
else
{
DelegatePara dp = new DelegatePara();
dp.strLog = "生成 [" + fileName + ".pdf] 成功!\n";
m_delesPDF.Refresh(dp);
return true;
}
}
上面代码段中,红色文字的部分是核心所在,这里简单解释一下:
ProcessStartInfo pinfo = new ProcessStartInfo(file_flvbind); 上面代码中构造函数中的参数很重要,指定了正确的要运行进程所在的文件路径;
pinfo.WorkingDirectory = strHtmlSavedPath;
上面这句代码指定的我们要生成pdf文件的原材料(也即html文件和全部图片所在文件路径);
pinfo.Arguments保存的是进程wkhtmltopdf.exe需要的执行参数,拿刚才所举出的例子来说就是
wkhtmltopdf.exe www.cnblogs.com cnblogs.pdf
“--footer-center \"powered by 际为软件事务所(http://www.cnblogs.com/ice-river)\" 是传递给wkhtmltopdf.exe进程的一个附加参数,用来在生成的pdf文档中添加页脚,如下图所示:

pinfo.Arguments = sb.ToString();这句就是提供给进程的参数; Process p = Process.Start(pinfo);这句是启动wkhtmltopdf.exe进程;
p.WaitForExit();这句是等待wkhtmltopdf.exe进程结束,
if (p.ExitCode == 0)
如果进程的结束码是0,进程执行成功,否则说明进程执行失败。
代码就解释到这里,具体更详细的代码大家可以自行下载学习。
需要指出的是,这段运行另外一个进程的代码具有通用性,您完全可以用它来在自己的程序中运行其他的进程,实现进程间通信。
三 下节预告
使用C#语言如何将html网页转换成txt(html2txt)。
出处:http://www.cnblogs.com/ice-river/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
网络采集软件核心技术剖析系列(4)---使用C#语言如何将html网页转换成pdf(html2pdf)的更多相关文章
- 网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)
一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...
- 网络采集软件核心技术剖析系列(6)---将任意博主的全部博文下载到SQLite数据库中并通过Webbrower显示(将之前的内容综合到一起)
一 本系列随笔目录及本节代码下载 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软 ...
- 网络采集软件核心技术剖析系列(5)---将任意博主的全部博文下载到内存中并通过Webbrower显示(将之前的内容综合到一起)
一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...
- 网络采集软件核心技术剖析系列(3)---如何使用C#语言下载博文中的全部图片到本地并可以离线浏览
一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第三篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受 ...
- 网络采集软件核心技术剖析系列(2)---如何使用C#语言获得任意站点博文的正文及标题
一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第二篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受 ...
- Linux不用使用软件把纯文本文档转换成PDF文件的方法
当你有一大堆文本文件要维护的时候,把它们转换成PDF文档会好一些.比如,PDF更适合打印,因为PDF文档有预定义布局.除此之外,还可以减少文档被意外修改的风险. 要将文本文件转换成PDF格式,你要按照 ...
- Office系列(1)---将Office文件(Word、PPT、Excel)转换为PDF文件
需求: 将Office文件作为文章并在网页上预览,主要为(Word.PPT.Excel)3种类型文件. 研究了一下,找到了两种解决方案 直接调用微软的在线预览功能实现(预览前提:预览资源必须可以直接通 ...
- 《SDN核心技术剖析和实战指南》第一章小结
第一章主要是概况.新技术有一个特点是,每家都有不同的说法.这里我只说说我比较认同的部分. SDN的核心概念大概有两个:转发面与控制面分离.开发可编程化.书里还说逻辑上集中控制,其实这个就可以从转发与控 ...
- WorldWind源码剖析系列:星球球体的加载与渲染
WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...
随机推荐
- flume高级组件及各种报错
1,one source two channel 创建conf文件,内容如下: #定义agent名, source.channel.sink的名称 access.sources = r1 access ...
- 【CF1027F】Session in BSU(dsu,基环树)
题意:给出n场考试,每场考试有2天可以通过(第ai与bi天).每天最多参加一场考试,现在要求所有考试全部通过的最小天数 n<=1e6,1<=a[i]<b[i]<1e9 思路:F ...
- Extjs3.4 合并单元格
Ext3.4合并单元格 表格上添加grid-row-span样式
- Swift, Playgrounds, and XCPlayground
http://www.codeschool.com/blog/2014/12/12/swift-playgrounds-xcplayground/ Swift, Playgrounds, and XC ...
- ZOJ 3598 Spherical Triangle球面几何公式应用
#include <map> #include <set> #include <list> #include <cmath> #include < ...
- css3带你实现酷炫效果
css3 私有前缀 -webkit- chrome/safari等webkit内核浏览器 -moz- firfox -o- opera -ms- IE css3 盒子模型 box-sizing 值co ...
- spring boot jar 进程自动停止,自动终止,不能后台持续运行
第一次部署spring boot 到linux上,用命令java -jar **.jar,发现应用自动退出,进程停止了.后来发现要不挂断的执行命令,忽略所有的挂断信号,用以下命令解决 nohup ja ...
- 【SQL】多个表的查询
1.元组变量 SELECT * FROM a AS x, a AS y; 结果是显示自己和自己的笛卡尔乘积. 如果查询中对于某一个关系使用了多次,为了区别他们的属性,需要对关系定义别名,然后用 别名. ...
- 《Java编程思想》笔记 第十二章 通过异常处理错误
1.异常也是对象 标准异常类都有两个构造器,一个默认,一个接受字符串. 抛异常与方法返回类型不同,但有相似效果使当前方法退出并返回,抛异常可以看作是一种不同的返回机制.(异同点不必深究) Throwa ...
- docker从零开始 存储(五)存储驱动介绍
关于存储驱动程序 要有效地使用存储驱动程序,了解Docker如何构建和存储镜像以及容器如何使用这些镜像非常重要.您可以使用此信息做出明智的选择,以确定从应用程序中保留数据的最佳方法,并避免在此过程中出 ...