欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點晴永久免費OA]C#如何實現(xiàn)Winform打印web頁面html插件

admin
2022年12月22日 11:13 本文熱度 1713

最近,客戶有個需求過來,Web端無預(yù)覽打印,美其名曰:快捷打印。

當(dāng)時第一反應(yīng)就是找插件,拿來主義永遠不過時。找了一圈發(fā)現(xiàn),免費的有限制,沒限制的需要收費(LODOP真的好用)。說來就是一個簡單的無預(yù)覽打印,收費的諸多功能都無用武之地,總的來說性價比很低,所以就打算自己琢磨著寫一個算了。剛開始總是糾結(jié)在Web端去實現(xiàn)直接打印,打印是實現(xiàn)了,結(jié)果是服務(wù)端的,客戶端只能一臉懵。

后來(準(zhǔn)備妥協(xié)了),安裝了一些收費的插件發(fā)現(xiàn),都需要先安裝一個客戶端程序,靈光乍現(xiàn),解決方案這不就出來了。

思路:Web端調(diào)用客戶端程序,讓客戶端程序去實現(xiàn)打印。

實現(xiàn):Web端通過WebSocket將Html發(fā)送給客戶端,客戶端(Winform)監(jiān)聽消息,接收處理后再打印。

客戶端(Winform)打印實現(xiàn)方式:

1、Html轉(zhuǎn)PDF,然后打印PDF(暫時需要用到三方包)

2、Html轉(zhuǎn)圖片,然后通過PrintDocument打印圖片

3、通過WebBrowser實現(xiàn)打印

按照上面的思路再去寫代碼,就會簡單很多。

Web端的代碼就不多說了,一個簡單的WebSocket通信。

客戶端程序(Winform)

1、監(jiān)聽Web端的WebSocket消息,這里有用到三方包:Fleck,開箱即用,非常方便。

///

/// ConnAndListen

///

public static void ConnAndListen()

{ // 監(jiān)聽本地 45000端口

var server = new WebSocketServer($"ws://127.0.0.1:45000");

server.Start(socket =>

{

socket.OnOpen = () =>

{

// 連接成功

socket.Send("socket通訊已連接");

};

socket.OnClose = () =>

{

// 關(guān)閉連接

socket.Send("socket通訊已關(guān)閉連接");

socket.Close();

};

socket.OnMessage = message =>

{

// TODO...

};

});

}

2、處理Html,將Html轉(zhuǎn)換為圖片:

///

/// GetBitmap

///

///

public Bitmap GetBitmap()

{

WebPageBitmap Shot = new WebPageBitmap("html", "頁面寬度", "頁面高度");

Shot.GetIt();

Bitmap Pic = Shot.DrawBitmap("圖片高度", "圖片寬度");

// 設(shè)置圖片分辨率

Pic.SetResolution(203.0F, 203.0F);

return Pic;

}

3、打印圖片

///

/// 圖片打印

///

public class PrintDirectClass

{

private PaperSize paperSize = null;

// 多頁打印

private int printNum = 0;

// 單個圖片文件

private string imageFile = ".....";

// 多個圖片文件

private ArrayList imageList = new ArrayList();

///

/// 打印預(yù)覽

///

public void PrintPreview()

{

// 打印機對象

PrintDocument imgToPrint = new PrintDocument();

#region 打印機相關(guān)設(shè)置

var pageSize = imgToPrint.PrinterSettings.PaperSizes;

paperSize = pageSize[pageSize.Count - 1];

// 打印方向設(shè)置

//imgToPrint.DefaultPageSettings.Landscape = false;

// 打印紙張大小設(shè)置

//imgToPrint.DefaultPageSettings.PaperSize = paperSize;

// 打印分辨率設(shè)置

//imgToPrint.DefaultPageSettings.PrinterResolution.Kind = PrinterResolutionKind.High;

// 打印邊距設(shè)置

//imgToPrint.DefaultPageSettings.Margins = new Margins(40, 40, 40, 40);

// 打印開始事件

imgToPrint.BeginPrint += new PrintEventHandler(this.imgToPrint_BeginPrint);

// 打印結(jié)束事件

imgToPrint.EndPrint += new PrintEventHandler(this.imgToPrint_EndPrint);

// 打印內(nèi)容設(shè)置

imgToPrint.PrintPage += new PrintPageEventHandler(this.imgToPrint_PrintPage);

#endregion

// 直接打印

//imgToPrint.Print();

// 打印彈框確認

//PrintDialog printDialog = new PrintDialog();

//printDialog.AllowSomePages = true;

//printDialog.ShowHelp = true;

//printDialog.Document = imgToPrint;

//if (printDialog.ShowDialog() == DialogResult.OK)

//{

// imgToPrint.Print();

//}

// 預(yù)覽打印

//PrintPreviewDialog pvDialog = new PrintPreviewDialog();

//pvDialog.Document = imgToPrint;

//pvDialog.ShowDialog();

}

///

/// 打印開始事件

///

///

///

private void imgToPrint_BeginPrint(object sender, PrintEventArgs e)

{

if (imageList.Count == 0)

imageList.Add(imageFile);

}

///

/// 打印結(jié)束事件

///

///

///

private void imgToPrint_EndPrint(object sender, PrintEventArgs e)

{

}

///

/// 設(shè)置打印內(nèi)容

///

///

///

private void imgToPrint_PrintPage(object sender, PrintPageEventArgs e)

{

// 圖片文本質(zhì)量

e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

// 圖片插值質(zhì)量

e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

// 圖片合成質(zhì)量

e.Graphics.CompositingQuality = CompositingQuality.HighQuality;

// 圖片抗鋸齒

e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

// 設(shè)置縮放比例

e.Graphics.PageScale = 0.3F;

using (Stream fs = new FileStream(imageList[printNum].ToString().Trim(), FileMode.Open, FileAccess.Read))

{

System.Drawing.Image image = System.Drawing.Image.fromStream(fs);

int w = image.Width;

int h = image.Height;

// 繪制Image

e.Graphics.DrawImage(image, 40, 40, 410, 600);

if (printNum < imageList.Count - 1)

{

printNum++;

// HasMorePages為true則再次運行PrintPage事件

e.HasMorePages = true;

return;

}

e.HasMorePages = false;

}

// 設(shè)置打印內(nèi)容的邊距

//e.PageSettings.Margins = new Margins(40, 40, 40, 40);

// 設(shè)置是否橫向打印

e.PageSettings.Landscape = false;

// 設(shè)置紙張大小

e.PageSettings.PaperSize = paperSize;

// 設(shè)置打印分辨率

e.PageSettings.PrinterResolution.Kind = PrinterResolutionKind.High;

}

}

以上就是 Html轉(zhuǎn)圖片,然后通過PrintDocument打印圖片 的實現(xiàn)代碼了。其它兩種方式大家有興趣可以去試試。

WebBrowser 比較簡單,但是對打印機控制不是特別友好(也可能是我沒有發(fā)現(xiàn),研究不深)

WebBrowser wb = new WebBrowser();

// 直接打印

wb.Print();

// 確認打印

wb.ShowPrintDialog();

// 預(yù)覽打印

wb.ShowPrintPreviewDialog();

Html轉(zhuǎn)PDF,然后打印PDF原理于Html轉(zhuǎn)圖片,然后通過PrintDocument打印圖片一樣,不同的是轉(zhuǎn)PDF可能需要用到第三方的包,目前這方便的包還是比較齊全的,NUGET搜索pdf幾乎全是。


需求總是來得特別突然,下次再有新特別需求時再來和大家分享。

其他的實現(xiàn)思路

第一種

安裝一個打印客戶端 用grid++實現(xiàn)打印模板

本地起一個 WebSocketServer 客戶端接收信息然后 組裝模板打印即可。

第二種

通過webBrowser實現(xiàn)打印功能,只適用于文本

//轉(zhuǎn)到某個網(wǎng)址

webBrowser.Navigate("");

//直接打印

webBrowser.Print();

//預(yù)覽

webBrowser.ShowPrintPreviewDialog();

//打印

webBrowser.ShowPrintDialog();

以上就是c# 如何實現(xiàn)web打印插件的詳細內(nèi)容。


該文章在 2022/12/22 11:13:37 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved