說一下我的處理方法吧,樓主可以參考。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了沙河口免費(fèi)建站歡迎大家使用!
先在打印機(jī)的服務(wù)器屬性中設(shè)定一個(gè)符合打印標(biāo)準(zhǔn)的紙張尺寸。這樣使你的打印紙尺寸固定,不需要你每次打印的時(shí)候都重新指定打印尺寸,避免計(jì)算誤差。
然后在你要打印的內(nèi)容外面嵌套一套一個(gè)table,設(shè)定一個(gè)初始的Style的margin-top值。多張的票據(jù)內(nèi)容是通過循環(huán)計(jì)算產(chǎn)生。在調(diào)整過程中,計(jì)算下一張與上一張的相對(duì)margin-top值,多次計(jì)算后你就能找到每次打印時(shí)的上下偏移值,然后做一個(gè)算法計(jì)算兩張之間的margin-top值,就OK了。
我們做套打發(fā)票都是這么做的,這是一個(gè)重復(fù)性很強(qiáng)的工作,要有耐心。另外,一定要要求所有的用戶使用同一款打印機(jī),不同的打印機(jī)的偏移值是不一樣的。
vb 里有printer對(duì)象,打印很簡單。
vb.net 升級(jí)為
Microsoft.VisualBasic.PowerPacks.Printing.Compatibility.VB6 .Printer
這個(gè)沒用過,你研究下
比如:
Private Sub Document_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
e.Graphics.DrawString(str0, New Font("Arial", 14, FontStyle.Regular), Brushes.Black, 50, 50)
e.Graphics.DrawString(A1, New Font("Arial", 10, FontStyle.Regular), Brushes.Black,50, 100)
e.Graphics.DrawString(A2, New Font("Arial", 10, FontStyle.Regular), Brushes.Black, 300,100)
e.Graphics.DrawString(A3, New Font("Arial", 10, FontStyle.Regular), Brushes.Black, 800,100)
也就是分次用不同坐標(biāo)和不同的字體來打印各變量。畫線用:
e.Graphics.DrawLine(BlackPen, x1, y1, x2, y2)。
具體坐標(biāo)數(shù)值自己用尺量出,再換算。
有個(gè)PrintDocument控件,可以實(shí)現(xiàn)打印。。。
MSDN原話:
使用 PrintDocument 組件
涉及 PrintDocument 組件的兩種主要情況是:
簡單的打印作業(yè),如打印單個(gè)文本文件。在這種情況下,應(yīng)將 PrintDocument 組件添加到 Windows 窗體,然后在 PrintPage 事件處理程序中添加打印文件的編程邏輯。 該編程邏輯應(yīng)以使用 Print 方法打印文檔結(jié)束。
此方法向打印機(jī)發(fā)送一個(gè) Graphics 對(duì)象,該對(duì)象包含在 PrintPageEventArgs 類的 Graphics 屬性中。
有關(guān)如何使用 PrintDocument 組件打印文本文檔的示例,請(qǐng)參見
如何:打印 Windows 窗體中的多頁文本文件。
更為復(fù)雜的打印作業(yè),如想要重新使用已編寫的打印邏輯的情況。
在這種情況下,應(yīng)從 PrintDocument 組件派生一個(gè)新組件,并重寫
(請(qǐng)參見 Visual Basic 的 重寫或 C# 的 重寫) PrintPage 事件。
將 PrintDocument 組件添加到窗體后,它出現(xiàn)在 Windows 窗體設(shè)計(jì)器底部的欄中
我?guī)湍惆炎詈笠徊糠值恼Z句順序調(diào)換一下。你試一試
sub button1_click() '---執(zhí)行打印
Dim pd As PrintDocument = New PrintDocument
pd.PrinterSettings = PrintDialog1.PrinterSettings
If _PrintDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
for i=0 to 1 '這樣可以兩次截圖
CaptureScreen() '--執(zhí)行前面自定義函數(shù)截圖
AddHandler pd.PrintPage, AddressOf Document_PrintPage
pd.Print()
Threading.Thread.sleep(100) ‘ 再加上一個(gè)間隔
next
end sub
參考:
把執(zhí)行SQL語句后得到的記錄集逐條(含字段名)顯示在LISTVIEW控件中
'----------------------------------------------------------------
Public Sub ListUpdate(ByRef rs As Recordset, ByRef lv As ListView)
Dim head As ColumnHeader, Item As ListItem
Dim i As Integer, j As Integer
Dim lvWidth As Integer
lvWidth = lv.Width
'初始化LISTVIEW的某些屬性
lv.View = lvwReport
lv.GridLines = True
lv.FullRowSelect = True
lv.ListItems.Clear
lv.ColumnHeaders.Clear
For i = 0 To rs.Fields.Count - 1
Set head = lv.ColumnHeaders.Add
head.Text = rs.Fields(i).Name
head.Width = lvWidth / rs.Fields.Count
Next
For j = 1 To PERPAGE
If rs.EOF Then Exit For
Set Item = lv.ListItems.Add
Item.Text = "" rs.Fields(0).Value
For i = 1 To rs.Fields.Count - 1
Item.SubItems(i) = "" rs.Fields(i).Value
Next
rs.MoveNext
Next
End Sub
' 打印
Public Sub PrintRecordset(ByRef recRecordset As Recordset, ByVal strType As String)
Dim LeftMargin As Integer
Dim HeadTopPosition As Integer
Dim FieldNum As Integer
Dim PageCounter As Integer
Dim MyRecordset As ADODB.Recordset
Const FooterTopPosition = 24
Set MyRecordset = recRecordset
PageCounter = 1
' 設(shè) 置Printer 對(duì) 象 坐 標(biāo) 的 度 量 單 位 為 厘 米
Printer.ScaleMode = vbCentimeters
LeftMargin = 1.5
HeadTopPosition = 2
' 定 義 打 印 頁 左 上 角 的X 坐 標(biāo) 和Y 坐 標(biāo), 通 過 改 變ScaleLeft 和ScaleTop 的 值, 可 改 變 打 印 頁 的 左 邊 距 和 上 邊 距
Printer.ScaleLeft = -LeftMargin
Printer.ScaleTop = -HeadTopPosition
Printer.Font.Name = "Times New Roman"
Printer.Font.Size = 12
Printer.Print "音像店顧客管理系統(tǒng)"
Printer.Print strType
Printer.Print ""
If MyRecordset.EOF And MyRecordset.BOF Then
MsgBox "No Record At Presend!", vbCritical And vbOKOnly, "Print Error"
Exit Sub
End If
MyRecordset.MoveFirst
Do Until Printer.CurrentY FooterTopPosition
'Print the fields of the recordset in sequence
For FieldNum = 0 To MyRecordset.Fields.Count - 1
Printer.Print MyRecordset.Fields(FieldNum).Name _
": " _
MyRecordset.Fields(FieldNum).Value
If Printer.CurrentY FooterTopPosition Then
Printer.CurrentX = 8
Printer.Print "Page: " PageCounter
' 創(chuàng) 建 多 頁 文 檔
Printer.NewPage
PageCounter = PageCounter + 1
End If
Next FieldNum
MyRecordset.MoveNext
If MyRecordset.EOF Then Exit Do
' 在 記 錄 之 間 空 一 行
Printer.Print ""
Loop
'Print the Page number as a footer
Printer.CurrentX = 8
Printer.CurrentY = FooterTopPosition
Printer.Print "Page: " PageCounter
' 將 輸 出 送 到 打 印 機(jī)
Printer.EndDoc
End Sub