.net 打印頁面

在.net環境下開發MIS(管理信息系統)時,最終的結果往往需要通過打印機將數據打印出來。有時我們希望能夠隨心所欲地打印,這就需要針對自己的 系統開發適用的打印模塊。事實上,.net框架提供了強大的打印支持,無論是用VB.net還是C#,都能寫出自己滿意的打印代碼。本文將以VB.net 作爲示例代碼,介紹如何開發打印模塊,重點是如何對打印的紙張頁面進行設置,包括這樣幾個方面的問題:紙張類型、頁邊距、打印方向。

一、實現原理

FrameWork中有關打印的類都放在System.Drawing.Printing 命名空間中,因此我們必須要聲明這個空間:Imports System.Drawing.Printing,C#中用Using關鍵字,這樣就可以利用裏面的類來編寫自己的打印代碼。

  首先需要創建一個PrintDocument類的新實例,Private WithEvents pap As New PrintDocument,我們可以這樣理解:pap是一張可以重複利用的紙張對象,將需要打印的內容放到該紙張上,然後調用 Print 方法來實際打印文檔。

二、利用PageSetupDialog對話框設置頁面

  PageSetupDialog類表示一個對話框,它允許用戶設置紙張類型、頁邊距和打印方向等屬性,類似於Office中的“頁面設置”對話框,如圖所示。

  要打開PageSetupDialog對話框,首先要定義一個PageSetupDialog類的實例:

Private psd As New PageSetupDialog,這裏psd就是對話框的實例。利用PageSetupDialog對話框,用戶可以自由地設置紙張的類型和頁邊距,還可 以設置打印的方向是縱向打印還是橫向打印。並且利用PageSetupDialog對話框對頁面的設置,實現起來也非常容易,只需要在頁面設置的模塊內加 入幾句代碼:

  Private psd As New PageSetupDialog

With psd

  .Document = pap

'對話框要設置的對象是上面定義的PrintDocumnet類的實例pap,也就是我們要打印的紙張對象

  .PageSettings = pap.DefaultPageSettings

'將pap對象原先的頁面信息賦值到psd對話框對象中

  End With

If psd.ShowDialog = DialogResult.OK Then

  pap.DefaultPageSettings = psd.PageSettings

End If

  Psd.ShowDialog的作用就是打開頁面設置對話框,在對話框中按下“確定”按鈕,將返回一個DialogResult.OK的枚舉 值,如果按下的是“取消”按鈕,返回的枚舉值將是DialogResult.Cancel。上面代碼段的作用是:當打開頁面設置對話框,對頁面進行設置且 按下“確定”按鈕後,將對話框中所設置的頁面信息賦值到pap對象的DefaultPageSettings屬性中,包括紙張的類型、紙張寬度和高度、頁 邊距大小、打印方向等信息,當然如果按下的是“取消”按鈕,則不修改任何信息。

三、公制與英制單位的換算問題

  利用PageSetupDialog對話框設置紙張的類型、頁邊距等信息後,再次進入頁面設置的對話框,發現裏面的頁邊距全部改變了,再進入又改變了,這是爲什麼呢?

其實原因很簡單,單位的不同造成了這個現象。我們可以再看看上圖中“頁邊距”一項明確的註明了單位採用的是“毫米”,說明在頁面設置對話框中使用的是 公制長度計量單位,而在.net中採用的是英制的計量單位。英制中長度的基本計量單位是英寸,公制中長度的基本計量單位是釐米,打印時默認的長度單位爲 1/100英寸。因此假設我們在頁面設置對話框中設置上部邊距爲10mm,但.net把它轉換成了英制單位,數值是1/2.54 * 100=39個1/100英寸,(1英寸約等於2.54釐米,1釐米=10毫米)所以,這時上部頁邊距的數值變成了39,當你再次打開頁面設置對話框時, 系統將認爲上部頁邊距是39個1/100釐米,也就是3.9毫米,按下“確定”按鈕後,.net將再次對頁邊距進行轉換,這時上部邊距就約爲15個 1/100英寸,這樣結果當然與我們設置的相差甚遠。

  知道了原因,解決問題就很好辦了。其實微軟也考慮到了這個問題,提供了一個用於單位轉換的類PrinterUnitConvert,如下所示:

If (System.Globalization.RegionInfo.CurrentRegion.IsMetric) Then

  '如果使用的是公制單位

'將英制單位的數據轉換成公制單位的數據

  psd.PageSettings.Margins = PrinterUnitConvert.Convert (psd.PageSettings.Margins, PrinterUnit.Display, PrinterUnit.TenthsOfAMillimeter)

End If

  pap.DefaultPageSettings = psd.PageSettings

Margins屬性中保存的頁面的上(Top)、下(Bottom)、左(Left)、右(Right)的頁邊距數值,利用 PrinterUnitConvert的Convert方法都可以轉換,在上例中,PrinterUnit.Display是指1/100英寸的單位, PrinterUnit.TenthsOfAMillimeter是指1/100毫米的單位,這樣就可以將英制單位轉換爲公制單位。

  當然我們也可以自己編寫代碼進行轉換,但請注意,轉換時英制的單位是1/100英寸,轉換後要以毫米爲單位。

注意:轉換時只須對紙張的頁邊距進行轉換,紙張本身的寬度和高度在你選擇一種紙張類型的時候,它已經自動幫你轉換成英制單位了,千萬不要畫蛇添足。  以上我們介紹瞭如何利用PageSetupDialog對話框設置頁面、公制與英制單位的換算,已經爲打印程序的編寫建立了一個良好的基礎。接下來,我們就來介紹如何實現具體的特殊打印功能。

四、橫向打印問題

如果在“頁面設置”對話框中設置了橫向打印,那麼 pap.DefaultPageSettings.Landscape屬性值將爲True,這時需要考慮的是紙張的寬度和高度,一般情況下,大家習慣使用 pap.DefaultPageSettings.PaperSize屬性來獲取紙張的寬度和高度,PaperSize.Width表示寬度, PaperSize.Height表示高度,但是請注意:Paper Size屬性是不考慮紙張的打印方向的,儘管你設置打印方向爲橫向,Paperize中的寬度和高度仍然是縱向的,因此,如果打印中可能會涉及到橫向打印 的時候,我們儘量使用DefaultPageSettings.Bounds屬性,.Bounds.Width表示紙張寬度,. Bounds.Height表示高度,重要的是,它們是考慮了打印方向後的紙張寬度和高度,那麼在本例中,要獲取紙張寬度可以用 pap.DefaultPageSettings.Bounds.Width,高度也一樣。

  當然,如果你非要用PaperSize屬性表示紙張寬度和高度。可以定義一個結構來保存PaperSize中的寬度和高度,然後通過修改結構中變量的數值來改變寬度和高度。

Private Structure PrintArea

  Dim AreaWidth As Integer ‘保存紙張的寬度

Dim AreaHeight As Integer ‘保存紙張的高度

  End Structure

Public sctPageSizeArea as New PrintArea ‘定義一個PrintAr

  ea結構的實例

sctpagesizeArea.AreaWidth=pap.DefaultPageSettings.PaperSize.Width

  sctpagesizeArea.AreaHeight=pap.DefaultPageSettings.PaperSize.height

這樣,我們用sctPageSizeArea.AreadWidth表示紙張寬度,用sctPageSizeArea.AreaHeight表示紙張高度,利用如下代碼就可以對紙張的寬度和高度進行調整:

  If pap.DefaultPageSettings.Landscape Then

'如果是橫向打印,交換打印區域的寬度和高度

  Dim ls As Int32

ls = sctPageSizeArea.AreaWidth

  sctPageSizeArea.AreaWidth = sctPageSizeArea.AreaHeigh

sctPageSizeArea.AreaHeigh = ls

  End If

五、自定義頁面設置

  利用“頁面設置”對話框對頁面進行設置雖然方便、簡單,但它也存在自身的弱點:

1.每次打印都需要用戶的干預。如果一個文檔經常打印,而格式是固定的,這就顯得很麻煩;

  2.頁面設置對話框中可供選擇的紙張類型非常少,經常不符合我們的打印要求;

3.頁面設置對話框中沒有提供自定義紙張大小的功能,不能滿足我們的特殊要求。

  基於以上原因,我們在有些時候必須繞開頁面設置對話框,對紙張類型直接進行設置。

.net默認的紙張類型爲A4,我們可以直接將紙 張設置爲一個已知或自定義的紙張類型,如A3等,再直接通過打印或打印預覽方法將結果輸出,這樣就不必通過頁面設置對話框。下面我們來自定義一個16開 (16開在Office的頁面設置對話框中存在,但在.net的頁面設置對話框中不支持)的紙張類型,演示如何設置一個自定義的頁面。

  Dim ps As New PageSettings '定義一個頁面設置類的實例

Dim myPaperSize As PaperSize ‘定義一個紙張類型的實例

  For Each myPaperSize In ps.PrinterSettings.PaperSizes

'循環遍歷當前打印機中所有支持的紙張類型

  If myPaperSize.Kind = PaperKind.16開 Then ‘是否有16開的紙張類型

Exit For ‘如果有16開的紙張類型,則退出循環

  End If

Next

  If myPaperSize.Kind <> PaperKind.16開 Then

'如果當前打印機不支持16開的紙張類型,那麼自定義16開的紙張類型

  '當前打印機有16開的紙張類型,那麼就使用系統定義的16開紙張類型

myPaperSize = New System.Drawing.Printing.PaperSize("16開", 724, 1024)

  End If

ps.PaperSize = myPaperSize '設置爲指定的紙張類型

  ps.Landscape = False '打印方向爲縱向

Ps.Margins.Top = 50 ‘設置頂部頁邊距

  Ps.Margins.Left = 50 ‘設置左部頁邊距

pap.DefaultPageSettings = ps ‘當前打印頁面爲上面設置的打印頁面

  在設置紙張的大小時,特別要注意,一定要使用英制單位,也就是以1/100英寸作爲寬度和高度的單位,如16開紙張的寬度是18.4cm,那麼就要轉換成1/100英寸,18.4/2.54*100後取整數,得到724,在設置高度和頁邊距大小時都需要這樣轉換。

  編後:通過本文,大家可以看出,編寫打印程序並不是調用系統函數那麼簡單,掌握文中技巧,才能真正隨心所欲地操縱打印頁面。

 

轉自:http://hi.baidu.com/gengxiaoguo/blog/item/2cb307de039ae25c95ee3765.html

 

發佈了38 篇原創文章 · 獲贊 2 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章