2008-07-26

用 JavaScript 複製網頁上的圖片到剪貼簿

在 IE 中很簡單就能辦到, 至於其他的瀏覽器......目前還沒這個需求, 先擱著~~~~~

var img = document.getElementsByTagName("IMG")[0];
var rng = document.body.createControlRange();
rng.add(img);
rng.execCommand('Copy');
真是簡單到不行! 可以看出 Microsoft 當初那群規劃設計 IE 的人實在是太厲害了!!
Keywords: clipboard, ie, copy image, javascript

變更 ChartFX 7.0 的輸出路徑

ChartFX 是一個很強大的圖表軟體, 特別是到了 2005 的版本之後, 運用了 DHTML 和 AJAX 的技術, 讓原先要透過安裝 ActiveX 才能達到的效果, 也可以直接在網頁上呈現, 而且互動性也像 ActiveX 一樣的好, 但是代價就是要多付出一些 server 和 client 之間資料的來回傳送!

在實際使用 ChartFX 7.0 開發 Web App 的時候,  發現了一個現象, 就是如果透過 Visual Studio 內建的 WebDev.WebServer.exe 啟動的話, ChartFX 的暫存檔會輸出到 ~/chartfx70/temp/ 底下, 可是當佈署到 IIS 之後, 它會在 WebSite 的根目錄下建立一個 /chartfx70 虛擬目錄, 這時候如果透過 ISA 將內部網站發佈出去的話, 除了要開放該 Web 應用程式的路徑之外, 就還要再多開放一個 /chartfx70 的路徑, 外部的人才可以順利的取得 chart 的內容, 雖然動作不難, 但是還要動到 ISA 的設定也是有點不方便, 所以才想找個方法讓 chartfx 的輸出路徑改變一下!

在 google 上找了很久, 其實沒有找到答案, 但是有找到一點點看起來不太像的線索, 最後還是透過 Reflector 才搞定了這個問題!!

image

正確的步驟就是在 ~/bin 資料夾 ChartFX.WebForms.dll 的所在位置建立一個名為 ChartFX.WebForms.config 檔案, 然後填入以下內容, 並視需要修改其中 Relative 和 Absolute 的值就行了, 至於這兩個節點的內容應該很容易了解, 分別是相對路徑和實體路徑!!

<chartfx>
    <DefaultHandler>ChartFX.WebForms.Internal.OutputFileHandler,ChartFX.WebForms</DefaultHandler>
    <FileOutput>
        <Relative>/Web1/chartfx70</Relative>
        <Absolute>D:\Web1\chartfx70</Absolute>
    </FileOutput>
</chartfx>

/CCITTFaxDecode /ASCII85Decode /DCTDecode

為了要擷取出內嵌在 PDF 檔中的影像, 稍微研究了一下 PDF 的規格, 一開始的目的是要解出其中的 TIFF 檔, 看起來好像挺簡單的, 因為從 PDF 中可以很容易的就把 TIFF 的 stream 取出來 (找到 /Filter /CCITTFaxDecode 的區段, 後續出現被包在 stream.....endstream 中的就是了), 但是結果當然並不是把那段 stream 存檔這麼簡單就行了, 因為 TIFF 本身還有一些檔頭和檔尾資訊必須處理, 所以又得再花精神去研究 TIFF 的規格(TIFF 6.0 Specification).....然後依據 pdf object 的描述自行寫入相關的檔頭和檔尾就可以了(看起來還滿簡單的吧)!

檔頭的部分很簡單, 因為只有 8 個 bytes, 很容易理解, 麻煩的是後面檔尾部分的 IFD (Image File Directory), 那是和 TIFF 內容相關的一些描述, 必須正確的寫入才能看到完整的 TIFF 呈現出來, 細節說來話長, 就先跳過吧, 附上一張簡單的示意圖(擷取自 TIFF 6.0 Specification)!

image 

第一個需求完成之後, 很快的就產生了第二個需求, 因為在 PDF 中除了有 TIFF 之外, 還有 JPG 格式的影像在裡面, 擷取 PDF 影像的功能算只完成了一半, 已經不能回頭了, 只能再繼續前進! 這次遇到的 /Filter 是 [ /ASCII85Decode /DCTDecode ], 這表示該 stream 要經由兩次解碼才能得到原來的影像, 分別是 ASCII85Decode 和 DCTDecode.

什麼是 ASCII85 咧? Wikipedia 上有很詳細的解釋(示意圖如下), 而且還有附上 C# Souce code 的網址, 所以很簡單就完成了第一部分的解碼任務, 至於第二個 /DCTDecode, 其實就是 JPG 的編碼方式, 所以可以直接把第一次解碼後的 stream 直接存成 jpg 檔之後就可以得到原來的影像了!

image

目前還沒有看到第三種格式的影像檔出現在要處理的 PDF 中, 所以就先研究到這兒!

keywords: pdf, tiff, jpg, ascii85 decode, dctdecode

2008-07-25

Failed to initialize the Common Language Runtime (CLR) v2.0.50727 with HRESULT 0x8007000e

奇怪的 SQL Server 問題, 在 Google 上找了很久, 好不容易找到一個看起來好像是解決辦法: http://forums.asp.net/t/1098345.aspx

"Finally found out the solution for it. When you installed SQL server, the installation does not automatically allocate memory to CLR. You need to explicitly allocate atlease 500 MB ram for it."

可是它沒有教說要怎麼 "allocate atlease 500 MB", 真是令人失望!

最後終於在 Microsoft Connect 網站找到答案: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=344001

操作步驟: 打開[服務], 停止 SQL Server 服務, 在服務的啟動參數輸入 -g 512, 再啟動 SQL Server 服務就可以了!

後記: 在安裝完 SQL 2005 SP2 之後, 發現原先設定在服務中的參數消失了, 可是問題也消失了, 不知道是不是 SP2 有解決掉這個問題!