网络采集软件核心技术剖析系列(4)---使用C#语言如何将html网页转换成pdf(html2pdf)

一 本系列随笔概览及产生的背景

本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第四篇,希望大家继续支持,为我继续写作提供动力。

自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱。同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的。

该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者。

本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持。

很多初学者常有此类困惑,“为什么我书也看了,C#相关的各个方面的知识都有所了解,但就是没法写出一个像样的应用呢?”

这其实还是没有学会综合运用所学知识,锻炼出编程思维,建立起学习兴趣,我想该系列文章也许会帮到您,但愿如此。

开发环境:VS2008

本节源码位置:https://github.com/songboriceboy/csharphtml2pdf

源码下载办法:安装SVN客户端(本文最后提供下载地址),然后checkout以下的地址:https://github.com/songboriceboy/csharphtml2pdf

系列文章提纲拟定如下:

1.如何使用C#语言获取博客园某个博主的全部随笔链接及标题;
2.如何使用C#语言获得博文的正文及标题;
3.使用C#语言如何将html网页转换成pdf(html2pdf)
4.如何使用C#语言下载博文中的全部图片到本地并可以离线浏览
5.如何使用C#语言合成多个单个的pdf文件到一个pdf中,并生成目录
6.网易博客的链接如何使用C#语言获取到,网易博客的特殊性;
7.微信公众号文章如何使用C#语言下载;
8.如何获取任意一篇文章的全部图文
9.如何使用C#语言去掉html中的全部标签获取纯文本(html2txt)
10.如何使用C#语言将多个html文件编译成chm(html2chm)
11.如何使用C#语言远程发布文章到新浪博客
12.如何使用C#语言开发静态站点生成器
13.如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)
14.如何使用C#语言实现网页编辑器(Winform)

......

二 第四节主要内容简介(使用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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

时间: 2024-10-09 19:40:40

网络采集软件核心技术剖析系列(4)---使用C#语言如何将html网页转换成pdf(html2pdf)的相关文章

网络采集软件核心技术剖析系列(5)---将任意博主的全部博文下载到内存中并通过Webbrower显示(将之前的内容综合到一起)

一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持. 很多初学者常有此类困惑,“为

网络采集软件核心技术剖析系列(1)---如何使用C#语言获取博客园某个博主的全部随笔链接及标题

一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持. 很多初学者常有此类困惑,“为

网络采集软件核心技术剖析系列(3)---如何使用C#语言下载博文中的全部图片到本地并可以离线浏览

一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第三篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决

网络采集软件核心技术剖析系列(2)---如何使用C#语言获得任意站点博文的正文及标题

一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第二篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决

网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)

一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持. 很多初学者常有此类困惑,“为

网络采集软件核心技术剖析系列(6)---将任意博主的全部博文下载到SQLite数据库中并通过Webbrower显示(将之前的内容综合到一起)

一 本系列随笔目录及本节代码下载 开发环境:VS2008 本节源码位置:https://github.com/songboriceboy/GatherAllStoreInDB 源码下载办法:安装SVN客户端(本文最后提供下载地址),然后checkout以下的地址:https://github.com/songboriceboy/GatherAllStoreInDB 系列文章提纲拟定如下: 1.如何使用C#语言获取博客园某个博主的全部随笔链接及标题:2.如何使用C#语言获得博文的内容:3.使用C#

将excel转换成pdf要用什么软件

小编以前只听说过把word文档转换成pdf,不知道excel和word之间也可以互相转换.Excel作为报表形式的文档该怎么转换成word文字形式的呢?这种专业的事情就交给专业的软件来办. 现在的文档转换工具基本都支持大多数办公文件格式的转换,能够实现对PDF.Word.Excel.PPT.HTML.TXT等文档之间的格式转换.支持转换模式非常多,其中有:文件转Word.文件转Excel.文件转PPT.文件转换HTML.图片转PDF.文件转TXT.文件转IMG.Word转PDF.PPT转PDF.

扫描ppt转换成pdf软件

扫描ppt转换成pdf软件目前,许多信息资料需要转化成电子文档以便于各种应用及管理,但因信息数字化处理的方式落后,不但费时费力,而且资金耗费巨大,造成了大量文档资料的积压,因此急需一种快速高效的软件系统来满足这种海量录入需求.迅捷ppt转换成pdf转换器软件系统正是适用于个人.小型图书馆.小型档案馆.小型企业进行大规模文档输入.图书翻印.大量资料电子化的软件系统. 专业的计算机公司团队为帮助办公人员更好的解决文档格式转换的问题,也是推出了多款软件.其中最有口碑的就是ppt转换成pdf转换器201

怎样将ppt转换成pdf软件

怎样将ppt转换成pdf软件工作或学习中,常常要把PPT转换成PDF文档,或者把PDF转换成PPT或是为了方便浏览,或是为了能够进行二次编辑,当遇到这种情况时,不妨试试以下这款PPT转换成PDF转换器,或许能帮上你的忙. 迅捷PPT转PDF转换器简介:简单方便的快速提取PPT文字的方案,轻松解决PPT文档文字不能复制和乱码问题:即使你的电脑里面没有安装任何的PPT阅读器软件,或者PPT转换器,您也能够轻松的把朋友发来的PPT文档中的文字内容提取出来,并且有不少要写论文的朋友遇到有些文档无法复制里