利用C#将HTM转换为PDF的几个步骤

开发 后端
最近工作中遇到一个将HTM转换为PDF的任务,这是一个有很有用的功能块,然而很遗憾,网上没有现成可行(包括开源/免费、易用和可维护性的考虑)方案。既然没有现成的解决方案就自己着手解决吧。

将HTM转换为PDF大概可以分两步实现

第一步,解析HTM,就是将HTM源文件中那一对文本转换为浏览器最终呈现给我们那种图文并茂的结果。这是一个不可完成的任务,因为目前为止业界的软件巨头也没有谁把HTM解析做得很好的。对比ID、Firefox等浏览器的显示结果便可想而知。既然业界难题,我也就不去钻牛角尖做技术攻关了,先跳过这步,考虑下一步的事情。

第二步,绘制PDF,这个简单,网上有很多资料,有兴趣的朋友可以研究PDF的文件格式,安装二进制组装PDF。我有兴趣,然而没有时间,我觉得软件从业者时刻都应该关注最有价值的事情。软件从业者要提高效率的第一法门便是重用,网上有一个叫itextsharp的东西是用来绘制PDF的,可以免费使用而且开源。

下载itextsharp,试着用itextsharp绘制HTM看看效果,如您所料,绘制出的是HTM的源代码。因为第一步的事情我们还没有解决,下面来解决第一步的事情。

记得很久以前见过一个.NET写的网页snap工具,大概思路是利用webbrowser的DrawToBitmap方法将ie的显示结果输出到Sytem.Drawing.Bitmap对象。大概代码如下:

//WebBrowser wb=null;  
 System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(w, h);  
 wb.DrawToBitmap(bmp, new System.Drawing.Rectangle(0,0, w, h)); 
  • 1.
  • 2.
  • 3.

ok,HTM可以解析了,现在重组刚才的代码,HTM转换为PDF思路如下:

使用webbrowser将HTM解析并转换为图片,使用itextsharp将刚才的图片绘制成PDF。

有用是给公司开发的功能,暂时不便公开源码,提供我编译后的工具供下载使用,您也可以根据上面的思路定制:

使用方法,

1.将单个url转换为PDF:PageToPDF.exe "http://www.g.cn/" "google.jpg"

2.将多个url转换为PDF:pagetoPDF.exe task.txt "C:\PDFdir\"

 task.txt是任务里表,里面提供多行url,每个url以#文件名为后缀,如:http://www.baidu.com/#b表示将http://www.baidu.com/转换为PDF文件名为b(扩展名系统自己会追加)

在ASP.NET环境下使用

将pagetoPDF上传至网站中,设定好目录权限,示例代码:    

public static bool CreatePPDF(string url,string path)  
       {  
           try  
           {  
               if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(path))  
                   return false;  
               Process p = new Process();  
               string str = System.Web.HttpContext.Current.Server.MapPath("~/afafafasf/PageToPDF.exe ");  
               if (!System.IO.File.Exists(str))  
                   return false;  
               p.StartInfo.FileName = str;  
               p.StartInfo.Arguments = " \"" + url + "\" " + path;  
               p.StartInfo.UseShellExecute = false;  
               p.StartInfo.RedirectStandardInput = true;  
               p.StartInfo.RedirectStandardOutput = true;  
               p.StartInfo.RedirectStandardError = true;  
               p.StartInfo.CreateNoWindow = true;  
               p.Start();  
               System.Threading.Thread.Sleep(500);  
               return true;  
           }  
           catch(Exception ex)  
           {  
               Sys.Log.error("PDF create err.",ex);  
           }  
           return false;  
       } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

HTM转换为PDF特性

在使用任务形式工作时,系统会启动多个进程,即任务管理器中会有多个pagetoPDF.exe的进程,这是系统调度程序自己启动的,为了加个任务处理速度。进程数由调度程序自己控制,最多不会超过十个。

【编辑推荐】

  1. 在Visual Studio 2010中使用C# 4.0的动态类型
  2. C#3.0中Lambda表达式详解
  3. 浅谈C#泛型的用处
  4. 浅谈C#如何实现多继承
  5. C#实用基础教程
责任编辑:彭凡 来源: cnblogs
相关推荐

2009-07-31 14:09:41

c#时间格式转换

2009-09-24 15:10:54

C#调用COM组件

2023-08-26 16:06:10

COBOLJava数据

2024-09-18 08:00:05

C#编程

2021-10-29 15:13:21

LinuxPDF文件

2022-10-12 08:00:00

语音识别Node.js音频质量

2009-08-31 13:41:24

C#创建PDF文件

2009-11-02 17:15:42

C#转换为VB.NET

2021-05-05 10:06:09

React应用程序微前端

2009-08-19 16:50:32

Visual C#C#语言特性

2009-08-11 15:46:15

C#日历控件

2009-08-28 15:52:23

C#利用sharpzi

2023-08-25 14:47:56

TransFLACFLAC

2009-08-24 09:55:26

C#接口转换

2023-05-05 00:19:22

2009-08-25 17:13:57

C#串口编程

2009-08-13 17:15:44

C#屏幕保护程序

2021-04-13 05:36:18

C#null 可控

2009-07-31 16:48:44

C#位运算

2009-07-30 16:23:07

C#日期格式化
点赞
收藏

51CTO技术栈公众号