C#生转换网页为pdf
2023-06-13 09:14:11 时间
从htm生成pdf大概可以分两步实现,第一步,解析htm,就是将htm源文件中那一对文本转换为浏览器最终呈现给我们那种图文并茂的结果。这是一个不可完成的任务,因为目前为止业界的软件巨头也没有谁把htm解析做得很好的。对比ie、firefox等浏览器的显示结果便可想而知。既然业界难题,我也就不去钻牛角尖做技术攻关了,先跳过这步,考虑下一步的事情。
第二步,绘制pdf,这个简单,网上有很多资料,有兴趣的朋友可以研究pdf的文件格式,安装二进制组装pdf。我有兴趣,然而没有时间,我觉得软件从业者时刻都应该关注最有价值的事情。软件从业者要提高效率的第一法门便是重用,网上有一个叫itextsharp的东西是用来绘制pdf的,可以免费使用而且开源。
下载itextsharp,试着用itextsharp绘制htm看看效果,如您所料,绘制出的是htm的源代码。因为第一步的事情我们还没有解决,下面来解决第一步的事情。
记得很久以前见过一个.net写的网页snap工具,大概思路是利用webbrowser的DrawToBitmap方法将ie的显示结果输出到Sytem.Drawing.Bitmap对象。大概代码如下:
//WebBrowserwb=null;
System.Drawing.Bitmapbmp=newSystem.Drawing.Bitmap(w,h);
wb.DrawToBitmap(bmp,newSystem.Drawing.Rectangle(0,0,w,h));
ok,htm可以解析了,现在重组刚才的代码,思路如下:
使用webbrowser将htm解析并转换为图片,使用itextsharp将刚才的图片绘制成pdf。
有用是给公司开发的功能,暂时不便公开源码,提供我编译后的工具供下载使用,您也可以根据上面的思路定制:
使用方法,
1.将单个url转换为pdf:PageToPDF.exe"http://www.g.cn/""google.jpg"
2.将多个url转换为pdf:pagetopdf.exetask.txt"C:\pdfdir\"
task.txt是任务里表,里面提供多行url,每个url以#文件名为后缀,如:http://www.baidu.com/#b表示将http://www.baidu.com/转换为pdf文件名为b(扩展名系统自己会追加)
在asp.net环境下使用
将pagetopdf上传至网站中,设定好目录权限,示例代码:
复制代码代码如下:
第二步,绘制pdf,这个简单,网上有很多资料,有兴趣的朋友可以研究pdf的文件格式,安装二进制组装pdf。我有兴趣,然而没有时间,我觉得软件从业者时刻都应该关注最有价值的事情。软件从业者要提高效率的第一法门便是重用,网上有一个叫itextsharp的东西是用来绘制pdf的,可以免费使用而且开源。
下载itextsharp,试着用itextsharp绘制htm看看效果,如您所料,绘制出的是htm的源代码。因为第一步的事情我们还没有解决,下面来解决第一步的事情。
记得很久以前见过一个.net写的网页snap工具,大概思路是利用webbrowser的DrawToBitmap方法将ie的显示结果输出到Sytem.Drawing.Bitmap对象。大概代码如下:
//WebBrowserwb=null;
System.Drawing.Bitmapbmp=newSystem.Drawing.Bitmap(w,h);
wb.DrawToBitmap(bmp,newSystem.Drawing.Rectangle(0,0,w,h));
ok,htm可以解析了,现在重组刚才的代码,思路如下:
使用webbrowser将htm解析并转换为图片,使用itextsharp将刚才的图片绘制成pdf。
有用是给公司开发的功能,暂时不便公开源码,提供我编译后的工具供下载使用,您也可以根据上面的思路定制:
使用方法,
1.将单个url转换为pdf:PageToPDF.exe"http://www.g.cn/""google.jpg"
2.将多个url转换为pdf:pagetopdf.exetask.txt"C:\pdfdir\"
task.txt是任务里表,里面提供多行url,每个url以#文件名为后缀,如:http://www.baidu.com/#b表示将http://www.baidu.com/转换为pdf文件名为b(扩展名系统自己会追加)
在asp.net环境下使用
将pagetopdf上传至网站中,设定好目录权限,示例代码:
publicstaticboolCreatePPDF(stringurl,stringpath)
{
try
{
if(string.IsNullOrEmpty(url)||string.IsNullOrEmpty(path))
returnfalse;
Processp=newProcess();
stringstr=System.Web.HttpContext.Current.Server.MapPath("~/afafafasf/PageToPDF.exe");
if(!System.IO.File.Exists(str))
returnfalse;
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);
returntrue;
}
catch(Exceptionex)
{
Sys.Log.error("Pdfcreateerr.",ex);
}
returnfalse;
}
特性
在使用任务形式工作时,系统会启动多个进程,即任务管理器中会有多个pagetopdf.exe的进程,这是系统调度程序自己启动的,为了加个任务处理速度。进程数由调度程序自己控制,最多不会超过十个。
相关文章
- Excel与XML相互转换 – C# 简单实现方案[通俗易懂]
- c#数组赋初值_C#数组初始化
- C#抓取网络图片保存到本地详解编程语言
- C#/.NET BCL:基础类库
- 用C#把文件转换为XML的代码
- c#static的全部用法收集整理
- 使用c#构造date数据类型
- asp.net(c#)下各种进制间的轻松转换(2进制、8进制、10进制、16进制)
- C#操作符之三元操作符浅析
- C#汉字转换拼音技术详解(高性能)
- C#VB实现10进制16进制之间互相转换
- C#打印出正等腰三角形实例代码
- C#中怎么将一个List转换为只读的
- C#中把字符串String转换为整型Int的小例子
- C#中把英文字母转换为大写或小写的方法
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- C#实现移除字符串末尾指定字符的方法
- 基于私钥加密公钥解密的RSA算法C#实现方法