2009年6月22日 星期一

the pdf toolkit(pdftk)

今天向大家介紹一套免費的PDF工具 pdftk,為什麼會介紹這個軟體,因為它可以做command-line,所以我們可以將它整合在系統的Job或當做外部指令應用,底下是它所提供的功能
  • Merge PDF Documents
  • Split PDF Pages into a New Document
  • Rotate PDF Pages or Documents
  • Decrypt Input as Necessary (Password Required)
  • Encrypt Output as Desired
  • Fill PDF Forms with FDF Data or XFDF Data and/or Flatten Forms
  • Apply a Background Watermark or a Foreground Stamp
  • Report on PDF Metrics such as Metadata, Bookmarks, and Page Labels
  • Update PDF Metadata
  • Attach Files to PDF Pages or the PDF Document
  • Unpack PDF Attachments
  • Burst a PDF Document into Single Pages
  • Uncompress and Re-Compress Page Streams
  • Repair Corrupted PDF (Where Possible)
接下來我僅針對浮水印部份來做Demo說明
參與演出角色
  • pdftk.exe
  • 原稿PDF(取名為 in.pdf)
  • 浮水印PDF(取名為 back.pdf)
  • 產出後PDF(取名為 out.pdf)
首先我們來看原稿內容


浮水印內容


步驟1、我們將 pdftk.exe、in.pdf、back.pdf一併放置在C:\ 底下
步驟2、利用開始-執行鍵入cmd,進入命令提示字元
步驟3、在c:\ 下輸入 pdftk in.pdf background back.pdf output out.pdf


在這裡有關浮水印的參數有background及stamp,二者的差別在background會將浮水印放在合併後文件的下面,而stamp則會像郵票一樣貼在合併後文件的上面,更詳細的內容請點選這裡

2009年6月10日 星期三

Stored Procedure中為流水編號補0

在系統開發中有時需要產生一些流水編號,例如格式為yyyymmnnnn(2009060001),通常在產生新的流水編號前,我們會利用SELECT語法得出某個期間內的最後一個流水編號,以上面的格式來說,如果沒有200906開頭的流水編號,表示流水編號由1開始,相反地如果有則把流水編號加1,在這裡我只針對流水號補0來說明,底下有二段程式片段,第一段是一般寫法,第二段則是比較精簡的寫法
一般寫法
IF (LEN(@num) = 1)
BEGIN
   SET @num = '000' + @num
END
ELSE IF (LEN(@num) = 2)
BEGIN
   SET @num = '00' + @num
END
ELSE IF (LEN(@num) = 3)
BEGIN
   SET @num = '0' + @num
END

精簡寫法
SET @num = RIGHT(('0000' + @num), 4)

上面的寫法只是提供另一個思維,真正在撰寫時可能要考慮更多東西(例如資料型態的轉型)

2009年6月7日 星期日

去除字串最後一個逗號

在一些狀況下,我們可能需要傳送一連串的值給Stored Procedure,所以我們會在程式中串接字串,因為是用for-loop之類的方法,所以字串後面都會多個分隔符號,為了刪除最後一個分隔符號程式設計師大都會用String類別的一些方法去刪除,有些程式設計師會用Substring來處理,在這裡提供比較好的做法。

原本的程式
string mystring = "1,2,3,";
mystring = mystring.Substring(0, mystring.Length-1);

建議
string mystring = "1,2,3,";
mystring = mystring.TrimEnd(new char[]{','});

為什麼說TrimEnd是比較好的做法,因為要用Substring要加更多判斷條件
Substring如果沒有加判斷條件會發生一些狀況
  1. 當mystring = "1"; 時,用Substring則mystring最後值等於"" (理論上是"1");
  2. 當mystring = ""; 時,會發生System.ArgumentOutOfRangeException: 長度不可以小於零。

2009年6月5日 星期五

使用jquery全選/清除CheckBox

過去要在GridView的Header加入CheckBox的全選/清除功能,不外乎有二種做法,第一種是在Server-side做,也就是在.cs檔裡撰寫相關事件程式,第二種則是利用javascript撰寫Client端的程式,先取待Table的id (GridView的ClientID),再利用for-loop逐筆選取或清除。今天介紹一個方法(Client端做法)可以讓程式更簡潔
首先來看MasterPage(因為筆者的程式有引用MasterPage)的程式片段
<script type="text/javascript" src="../js/jquery.js">
<script type="text/javascript">
function SelectAllCheckboxes(chk) {
  <asp:literal id="litCheckAll" runat="server"/>
}

上方程式片段有二個重點
  1. 需嵌入jquery
  2. 要利用Literal控制項(因為Literal在產生Html碼時不會加入Html Tag)
接下來我們來看.aspx檔的程式片段
<HeaderTemplate>
  全選/清除
  <br />
  <asp:CheckBox ID="chkAll"
    onclick="javascript:SelectAllCheckboxes(this);" runat="server" />
</HeaderTemplate>

上方程式主要目的是要為GridView Header裡的全選/清除CheckBox加入onclick的事件

最後來看.cs檔的程式片段
if (!IsPostBack) {
//動態產生全選/清除的javascript function
//在MasterPage中已加入jquery的js檔
  ((Literal)Master.FindControl("litCheckAll")).Text = "$('#" + gvPlanList.ClientID + " >tbody >tr >td >input:checkbox').attr('checked', chk.checked);";
}

參考來源

2009年6月1日 星期一

.Net Reflector

有時候我們承接別人遺留下來的專案,看到密密麻麻的程式,心裡難免會罵一聲暗,如果程式只是一個執行檔(exe)又沒有source code,那絕對會想殺人,這裡介紹一個工具Red Gate's .NET Reflector,這個工具可以檢視.Net所撰寫的組件(dll)或執行檔(exe)的內容,首先底下是source code
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1 {
 class Program {
  static void Main(string[] args) {
   Console.Write("Hello World!");
  }
 }
}
這是一個簡易的主控台應用程式專案,專案輸出類型為類別庫(dll),接下來我們會利用Red Gate's .NET Reflector工具檢梘dll檔案的內容





希望對大家有些幫助