2018年6月12日 星期二

PDF 隱藏工具列

現今一般瀏覽器要檢視PDF已經不是問題,最直覺的方式就是塞在iframe。

<iframe id = "iframe1" runat="server" src="MyFile.pdf">
</iframe>

那有沒有可能進一步做到控制工具列顯示或隱藏呢?

找了一下資料發現了這個:Parameters of Opening PDF Files



上述的連結,我已經在結尾加入了 #page=7
有沒有發現打開不是在第一頁? :D

也就是說最開頭的iframe部分,我們可以改寫為:

<iframe id = "iframe1" runat="server" src="MyFile.pdf#toolbar=0">
</iframe>

開啟PDF時就不會看到工具列了,我測試IE與Chrome有效。

補充說明:

  • 參數可能因瀏覽器或Acrobat版本不同出現差異。
  • 也可使用一些JS套件,避免上述問題,例如 pdf.jsPdfObject

DevExpress 處理 Word 轉圖檔 (以及PDF、HTML)

最近的需求要實作「Word轉圖檔」,研究一些相關技術後,還是使用元件方便。公司剛好有買DevExpress,剛好拿來練習....

網路上找到的範例:

直接複製不能用,可能是版本不同,修改結果如下:

string pathSource = Server.MapPath("~/Files/Sample.docx");
            string pathTarget = Server.MapPath("~/Export/Image/Sample.png");

            RichEditDocumentServer sourceServer = new RichEditDocumentServer();
            sourceServer.LoadDocument(pathSource);

            PrintingSystemBase ps = new PrintingSystemBase();
            PrintableComponentLinkBase pLink = new PrintableComponentLinkBase(ps);
            pLink.Component = sourceServer;
            pLink.CreateDocument(true);

            ImageExportOptions options = new ImageExportOptions();
            options.Format = ImageFormat.Png; // 可輸出為不同圖檔格式
            options.Resolution = 300;
            options.ExportMode = ImageExportMode.DifferentFiles; //可選擇輸出單圖或多圖

            pLink.ExportToImage(pathTarget, options);

DevExpress要參考的dll不少,Web.config可能也需要組態設定,可以直接開DevExpress專案開發,或者新開一個專案參考內容再回頭修改原本專案。

開啟DX專案會自動引用:


using部分


補充:

2018年6月11日 星期一

使用 Regex.Replace 快速取代字串

這次需求是需要取出地址前兩個字,但資料各種組成都有,例如:

(799)臺南市仁德區保安路9段99號~90
799臺南市仁德區保安里99鄰保安路9段99號~90
799-00臺南市仁德區保安里99鄰保安路9段99號~90
(79988)臺南市仁德區保安里99鄰保安路9段99號~90@!?+=-\|%$^#*&{}[]

使用 Regex.Replace先將數字與特殊字元取代(主要處理郵遞區號部分)

string address = @"(79988)臺南市仁德區保安里99鄰保安路9段99號~90@!?+=-\|%$^#*&{}[]";
string pattern = @"[\d\W_]";
string replacement = "";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(address, replacement);


結果:

臺南市仁德區保安里鄰保安路段號

PhotoUtils.cs 找不到

引用DevExpress範例時遇到的問題,路徑可參考這篇:

https://www.devexpress.com/Support/Center/Question/Details/Q535762/the-devexpress-web-demos-photoutils-class-is-missing

官方說法在:
c:\Users\Public\Documents\DXperience 13.1 Demos\ASP.NET\CS\ASPxEditorsDemos\App_Code\PhotoUtils.cs

版本不同可能有差異,我的是在這裡找到:
C:\Users\Public\Documents\DevExpress Demos 16.2\Components\ASP.NET\CS\ASPxEditorsDemos\App_Code



加入後記得引用:
using DevExpress.Web.Demos;

2018年6月6日 星期三

錯誤 CS2001 \Properties\AssemblyInfo.cs could not be found.

開啟專案後 Properties/AssemblyInfo.cs 顯示問號

建置顯示錯誤
Source file 'D:\SampleCode\MsWordToImage\MsWordToImage\Properties\AssemblyInfo.cs' could not be found.




參考
https://stackoverflow.com/questions/6494691/source-file-properties-assemblyinfo-cs-could-not-be-found

屬性 > 應用程式 > 組件資訊 (即AssemblyInfo)




打開應該會是一片空白,請(至少)填入標題 (Title),按下確定。

這時問號就會消失(組件資訊已經產生),其他資訊系統會自動寫入,結果如下圖。


2018年6月5日 星期二

WITH (NOLOCK) 實作與驗證

建了一個USER資料表,包含ID與金額欄位




撰寫一個簡單的TRANSACTION,更新ID=3的USER金額




Transaction有正常begin與commit,所以再次select時,資料正確。




再來我故意將commit拿掉,此時Transaction執行後將無法結束(也就是TABLE會被LOCK)
從參數 @@TRANCOUNT知道此TRAN已經執行了(一次),但因為沒有commit,資料都還沒真的寫入。




這時候在回頭執行SELECT時,會撈不出資料




但是!
如果此時加入 WITH (NOLOCK),就可以撈出來了!!
可以看到值也已經更改,因為UPDATE有執行到 (請記得資料還沒COMMIT)




這時候回頭加入rollback,再執行一次transaction,
資料會復原,TABLE也會解除LOCK




此時一般的SELECT就可以執行了,不會再TIMEOUT
而數值會恢復到執行前的狀態(因為資料rollback了)




所以如果某個系統程序執行了一段冗長耗時的TRANSACTION
所有相關的TABLE在執行期間都會LOCK,此時某人要撈資料就必須下WITH (NOLOCK)

以上例子:
  • 金額amount會在Transaction內異動,不適合搭配NOLOCK撈取。
  • ID或姓名name,可使用NOLOCK,避免Transaction執行間無法撈取。


附帶一提,如果剛好要撈的資料欄位必須等TRANSACTION結束(不能用NOLOCK),
又不想讓USER看到逾時的話,可以改用NOWAIT判斷,然後提示USER,如下:




關於 NOWAIT 的實作範例可 參考這裡