2011-09-12 32 views
0

好吧,最簡單的HTML表格數據移植到可讀的文件的方式

過去6個月,我一直在struggeling建立一個系統,使大性感的文字區域的形式,用戶輸入(與表支持負載,列表等)。幾乎可以讓用戶輸入數據,就好像它是單詞一樣。然而想要導出所有這些數據我一直沒能找到工作的解決方案......當

我的第一步是,試圖找到從數據源做支持原始的HTML報告軟件,並使其作爲正常的HTML,完美地工作除了保持在一起的功能是可怕的,無論是數據中,我不想一半(表格,列表等)分開。或者報告總是跳到下一頁以避免這種情況,最終文檔中有15個以上的空白頁面。

所以進出口尋找某種提示/指示的情況下這將是我的數據導出到一個可讀的文件(PDF或字PREF)的最佳解決方案。

我得到了如下的數據細分,其中的數據往往是原始的HTML。

-period

--unit

---集團

----問題

-----數據

什麼是最好的選擇?試圖將html呈現爲pdf或rtf?我需要提示:(

而且有時也該數據是2-3頁長,混合表列表和純文本。

回答

2

我建議你儘量保持這個瀏覽器,並添加print stylesheet到在HTML,使其呈現在屏幕上的一種方法和another way on paper添加打印樣式表到你的HTML是因爲這容易:

<link rel="stylesheet" media="print" href="print.css"> 

您應該能夠的東西來解析輸入像Html Agility Pack並將其轉換(即與XSLT)到任何你想要的輸出格式。

另一種方法是將HTML寫入瀏覽器,但將Content-Type設置爲特定於Microsoft Word的變體(有幾種可供選擇的版本,具體取決於您定位的Word的版本)應使瀏覽器詢問是否用戶想用Microsoft Word打開頁面。與Word 2007和更新,你也可以寫Office Open XML Word直接,因爲它是基於XML的。

可以使用的內容類型有:

application/msword 

對於二進制Microsoft Word文件,也應該適用於HTML。

application/vnd.openxmlformats-officedocument.wordprocessingml.document 

對於較新的「Office Open XML」格式的Word 2007及更新版本。

+0

我使用TinyMCE,它不是輸入多數民衆贊成在問題壽。我在導出數據時會對數據進行適當的佈局。由於它的原始HTML我不能手動添加頁面翻譯等渲染方法內(或者我可以?)。它是這樣的說我有60%的原始文本和40%的表格(裏面的文本)的數據。數據的總長度是3頁。如何(在渲染過程中)可以使數據顯示,以便表格不會在分頁符處切斷。這就是我所要求的。將標題傳遞給單詞不是真正的問題,這個單詞在它的佈局中必須是可以接受的! – Anders

+0

聽起來像你問的是「我該如何編寫Office Open XML或二進制Word文檔?」,閱讀MSDN上的文檔將有助於回答。無論哪種方式,使用Html Agility Pack解析輸入將爲您提供一個很好的文檔對象模型(DOM),您可以將它轉換爲任何您想要的東西,無論是PDF文檔,另一個HTML表示,Microsoft Word或其他。請參閱我更新的答案重新打印樣式表,我認爲這就是你要做的。 –

+0

謝謝你我會研究這個。 – Anders

1

它的一個一般性的問題,但兩件事情浮現在腦海中的訪問者模式和更改的MIME類型。

訪客模式 您可以有兩種獨立的呈現技術。這將取決於您的實施。

MIME類型 當請求時寫入日期出響應等

HttpContext.Current.Response.Clear(); 
HttpContext.Current.Response.Charset = "utf-16"; 
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250"); 
HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.doc", filename)); 
HttpContext.Current.Response.ContentType = "application/msword"; 
HttpContext.Current.Response.Write("-Period"); 
HttpContext.Current.Response.Write("/n"); 
HttpContext.Current.Response.Write("--Unit"); 
HttpContext.Current.Response.Write("/n"); 
HttpContext.Current.Response.Write("---Group"); 
HttpContext.Current.Response.Write("/n"); 
HttpContext.Current.Response.Write("----Question"); 
HttpContext.Current.Response.Write("/n"); 
HttpContext.Current.Response.Write("-----Data"); 
HttpContext.Current.Response.Write("/n"); 
HttpContext.Current.Response.End(); 
+0

如果數據是3頁,我將無法控制何時何地執行分頁。 IE我不希望表格,列表等在分頁符中被剪切。 (所以我想要有邏輯來檢查數據是否適合剩餘的空間,否則做一個分頁符)。 – Anders

+0

就我所知,您將面臨各種各樣的問題。你不能用別的東西來渲染信息等等Reporting Services? HTML確實被設計爲在Web瀏覽器中顯示。 – Jonathan

+0

我試圖使用Devexpress(是唯一支持HTML的報告軟件)。我們需要使用html,因爲用戶必須能夠爲他們的答案創建表格和列表。這是什麼讓它如此複雜... – Anders

1

這裏是另一種選擇,使用打印屏幕(雖然它不照顧滾動的,我想你應該是能夠建立這個)。這個例子可以擴展以滿足您的業務需求,儘管這是一種黑客行爲。您將它傳遞給它生成圖像的URL。

這樣調用

protected void Page_Load(object sender, EventArgs e) 
      { 
       int screenWidth = Convert.ToInt32(Request["ScreenWidth"]); 
       int screenHeight = Convert.ToInt32(Request["ScreenHeight"]); 
       string url =  Request["Url"].ToString(); 
       string bitmapName = Request["BitmapName"].ToString(); 


      WebURLToImage webUrlToImage = new WebURLToImage() 
      { 
       Url = url, 
       BrowserHeight = screenHeight, 
       BrowserWidth = screenWidth, 
       ImageHeight = 0, 
       ImageWidth = 0 
      }; 

     webUrlToImage.GenerateBitmapForUrl(); 
     webUrlToImage.GeneratedImage.Save(Server.MapPath("~") + @"Images\" +bitmapName + ".bmp"); 
    } 

生成網頁的圖像。

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Threading; 
using System.IO; 

public class WebURLToImage 
{ 
    public string Url { get; set; } 
    public Bitmap GeneratedImage { get; private set; } 
    public int ImageWidth { get; set; } 
    public int ImageHeight { get; set; } 
    public int BrowserWidth { get; set; } 
    public int BrowserHeight { get; set; } 

    public Bitmap GenerateBitmapForUrl() 
    { 
     ThreadStart threadStart = new ThreadStart(ImageGenerator); 
     Thread thread = new Thread(threadStart); 

     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
     thread.Join(); 
     return GeneratedImage; 
    } 

    private void ImageGenerator() 
    { 
     WebBrowser webBrowser = new WebBrowser(); 
     webBrowser.ScrollBarsEnabled = false; 
     webBrowser.Navigate(Url); 

     webBrowser.DocumentCompleted += new 
WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted); 

     while (webBrowser.ReadyState != WebBrowserReadyState.Complete) 
      Application.DoEvents(); 
     webBrowser.Dispose(); 
    } 

    void webBrowser_DocumentCompleted(object sender, 
WebBrowserDocumentCompletedEventArgs e) 
    { 
     WebBrowser webBrowser = (WebBrowser)sender; 
     webBrowser.ClientSize = new Size(BrowserWidth, this.BrowserHeight); 
     webBrowser.ScrollBarsEnabled = false; 
     GeneratedImage = new Bitmap(webBrowser.Bounds.Width, webBrowser.Bounds.Height); 
     webBrowser.BringToFront(); 

     webBrowser.DrawToBitmap(GeneratedImage, webBrowser.Bounds); 

     if (ImageHeight != 0 && ImageWidth != 0) 
      GeneratedImage = 
(Bitmap)GeneratedImage.GetThumbnailImage(ImageWidth, ImageHeight, 
null, IntPtr.Zero); 
    } 
} 
2

你可以使用一個解決方案是運行使用的System.Diagnostics.Process,將轉換該網站,並將其保存爲PDF文件在服務器上的應用程序。

您可以使用wkhtmltopdf這是一個開源的控制檯程序,可以從HTML轉換爲PDF或圖像。

窗口的安裝程序可從wkhtmltox-0.10.0_rc2 Windows Installer (i368)獲取。

安裝wkhtmltopdf後,您可以複製解決方案中安裝文件夾中的文件。您可以在解決方案中使用的設置是這樣的:

轉換的PDF文件將被保存到PDF文件夾。

這裏是做轉換代碼:

var wkhtmltopdfLocation = Server.MapPath("~/wkhtmltopdf/") + "wkhtmltopdf.exe"; 
var htmlUrl = @"http://stackoverflow.com/q/7384558/750216"; 
var pdfSaveLocation = "\"" + Server.MapPath("~/wkhtmltopdf/pdf/") + "question.pdf\""; 

var process = new Process(); 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.CreateNoWindow = true; 
process.StartInfo.FileName = wkhtmltopdfLocation; 
process.StartInfo.Arguments = htmlUrl + " " + pdfSaveLocation; 
process.Start(); 
process.WaitForExit(); 

的HTMLURL是你需要轉換爲PDF頁面的位置。它被設置到這個stackoverflow頁面。 :)

+0

我將對此進行測試。 – Anders

+0

IM試圖測試UR解決方案,它會爲我有很大的幫助,如果它works..im不知道我fullt理解,但我想我的.aspx轉換爲圖像不是一個網址,是否有可能以同樣的方式?我也加入烏爾服務器端代碼到我的.ashx的,但它似乎它不承認新工藝()!是它的方式?它應該工作 – Armance

+0

@astrocybernaute:代碼工作,我發帖的原因我是古董,如果有可能之前測試過它不承認過程()可能是因爲你還沒有導入System.Diagnostics程序,使其工作增加「使用系統。診斷;」 –

相關問題