C# 生轉(zhuǎn)換網(wǎng)頁為pdf
更新時間:2009年07月30日 21:58:55 作者:
最近工作中遇到一個將htm轉(zhuǎn)換為pdf的任務(wù),這是一個有很有用的功能塊,然而很遺憾,網(wǎng)上沒有現(xiàn)成可行(包括開源/免費、易用和可維護性的考慮)方案。既然沒有現(xiàn)成的解決方案就自己著手解決吧。
從htm生成pdf大概可以分兩步實現(xiàn),第一步,解析htm,就是將htm源文件中那一對文本轉(zhuǎn)換為瀏覽器最終呈現(xiàn)給我們那種圖文并茂的結(jié)果。這是一個不可完成的任務(wù),因為目前為止業(yè)界的軟件巨頭也沒有誰把htm解析做得很好的。對比ie、firefox等瀏覽器的顯示結(jié)果便可想而知。既然業(yè)界難題,我也就不去鉆牛角尖做技術(shù)攻關(guān)了,先跳過這步,考慮下一步的事情。
第二步,繪制pdf,這個簡單,網(wǎng)上有很多資料,有興趣的朋友可以研究 pdf的文件格式,安裝二進制組裝pdf。我有興趣,然而沒有時間,我覺得軟件從業(yè)者時刻都應(yīng)該關(guān)注最有價值的事情。軟件從業(yè)者要提高效率的第一法門便是重用,網(wǎng)上有一個叫itextsharp的東西是用來繪制pdf的,可以免費使用而且開源。
下載itextsharp,試著用itextsharp繪制htm看看效果,如您所料,繪制出的是htm的源代碼。因為第一步的事情我們還沒有解決,下面來解決第一步的事情。
記得很久以前見過一個.net寫的網(wǎng)頁snap工具,大概思路是利用webbrowser的DrawToBitmap方法將ie的顯示結(jié)果輸出到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));
ok,htm可以解析了,現(xiàn)在重組剛才的代碼,思路如下:
使用webbrowser將htm解析并轉(zhuǎn)換為圖片,使用itextsharp將剛才的圖片繪制成pdf。
有用是給公司開發(fā)的功能,暫時不便公開源碼,提供我編譯后的工具供下載使用,您也可以根據(jù)上面的思路定制:
使用方法,
1.將單個url轉(zhuǎn)換為pdf:PageToPDF.exe "http://www.g.cn/" "google.jpg"
2.將多個url轉(zhuǎn)換為pdf:pagetopdf.exe task.txt "C:\pdfdir\"
task.txt是任務(wù)里表,里面提供多行url,每個url以#文件名為后綴,如:http://www.baidu.com/#b表示將http://www.baidu.com/轉(zhuǎn)換為pdf文件名為b(擴展名系統(tǒng)自己會追加)
在asp.net環(huán)境下使用
將pagetopdf上傳至網(wǎng)站中,設(shè)定好目錄權(quán)限,示例代碼:
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;
}
特性
在使用任務(wù)形式工作時,系統(tǒng)會啟動多個進程,即任務(wù)管理器中會有多個pagetopdf.exe的進程,這是系統(tǒng)調(diào)度程序自己啟動的,為了加個任務(wù)處理速度。進程數(shù)由調(diào)度程序自己控制,最多不會超過十個。
第二步,繪制pdf,這個簡單,網(wǎng)上有很多資料,有興趣的朋友可以研究 pdf的文件格式,安裝二進制組裝pdf。我有興趣,然而沒有時間,我覺得軟件從業(yè)者時刻都應(yīng)該關(guān)注最有價值的事情。軟件從業(yè)者要提高效率的第一法門便是重用,網(wǎng)上有一個叫itextsharp的東西是用來繪制pdf的,可以免費使用而且開源。
下載itextsharp,試著用itextsharp繪制htm看看效果,如您所料,繪制出的是htm的源代碼。因為第一步的事情我們還沒有解決,下面來解決第一步的事情。
記得很久以前見過一個.net寫的網(wǎng)頁snap工具,大概思路是利用webbrowser的DrawToBitmap方法將ie的顯示結(jié)果輸出到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));
ok,htm可以解析了,現(xiàn)在重組剛才的代碼,思路如下:
使用webbrowser將htm解析并轉(zhuǎn)換為圖片,使用itextsharp將剛才的圖片繪制成pdf。
有用是給公司開發(fā)的功能,暫時不便公開源碼,提供我編譯后的工具供下載使用,您也可以根據(jù)上面的思路定制:
使用方法,
1.將單個url轉(zhuǎn)換為pdf:PageToPDF.exe "http://www.g.cn/" "google.jpg"
2.將多個url轉(zhuǎn)換為pdf:pagetopdf.exe task.txt "C:\pdfdir\"
task.txt是任務(wù)里表,里面提供多行url,每個url以#文件名為后綴,如:http://www.baidu.com/#b表示將http://www.baidu.com/轉(zhuǎn)換為pdf文件名為b(擴展名系統(tǒng)自己會追加)
在asp.net環(huán)境下使用
將pagetopdf上傳至網(wǎng)站中,設(shè)定好目錄權(quán)限,示例代碼:
復(fù)制代碼 代碼如下:
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;
}
特性
在使用任務(wù)形式工作時,系統(tǒng)會啟動多個進程,即任務(wù)管理器中會有多個pagetopdf.exe的進程,這是系統(tǒng)調(diào)度程序自己啟動的,為了加個任務(wù)處理速度。進程數(shù)由調(diào)度程序自己控制,最多不會超過十個。
相關(guān)文章
asp.net 利用NPOI導(dǎo)出Excel通用類的方法
本篇文章主要介紹了asp.net 利用NPOI導(dǎo)出Excel通用類的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06asp.net下數(shù)據(jù)庫操作優(yōu)化一例
數(shù)據(jù)庫升級,需要對幾個表進行一些數(shù)據(jù)轉(zhuǎn)換,具體是這樣:針對每一個 Item,從 orders 表里查出 Shop_Id,并把此 Id 賦值給 items 和 skus 中的 Shop_Id。2010-11-11asp.net?web?api2設(shè)置默認(rèn)啟動登錄頁面的方法
這篇文章主要介紹了asp.net?web?api2設(shè)置默認(rèn)啟動登錄頁面的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09VS2015在升級到Update2之后運行Cordova項目異常的解決方案
這篇文章主要介紹了VS2015在升級到Update2之后運行Cordova項目異常的解決方案的相關(guān)資料,需要的朋友可以參考下2016-07-07asp.net關(guān)于Cookie跨域(域名)的問題
Cookie是一個偉大的發(fā)明,它允許Web開發(fā)者保留他們的用戶的登錄狀態(tài)。但是當(dāng)你的站點有一個以上的域名時就會出現(xiàn)問題了。在Cookie規(guī)范上說,一個cookie只能用于一個域名,不能夠發(fā)給其它的域名。因此,如果在瀏覽器中對一個域名設(shè)置了一個cookie,這個cookie對于其它的域名將無效。如果你想讓你的用戶從你的站點中的其中一個進行登錄,同時也可以在其它域名上進行登錄,這可真是一個大難題。2012-12-12asp.net下Oracle,SQL Server,Access萬能數(shù)據(jù)庫通用類
Oracle,SQL Server,Access萬能數(shù)據(jù)庫通用類!,使用asp.net開發(fā)多數(shù)據(jù)庫系統(tǒng)的朋友可以參考下。2010-10-10