日常開頭水一下,看了下上次博客,一年零八天了,嘖嘖,奢侈。
最近這個工作挺滿意的,是我想要的發展方向,后續要做機器學習,現在得先把公司之前堆積的問題解決了。
談人生到此結束,還是說正題吧。(感覺這標題吸引不了人啊)
打印:PrintDocument
環境:WPF and Winform
要求:排版並打印圖片
之前一直不明白很多參數的問題,現在想清楚了,隨手記錄一下。
WPF暫放一邊,把winform先解決了,跟百度爛大街的一樣是 PrintPage事件Graphics繪制來打印的。其它部分參考
首先用Graphics繪制一直不明白的是該怎么繪制,紙張的大小是多少,怎么樣才能按照指定尺寸打印。
//我們先聊聊紙張大小,看紙張大小可以在開始文件打印
PrintDocument.Print();
並選好打印機后,在 PrintPage事件里繪制要打印的數據
private void pdControl_PrintPage(object sender, PrintPageEventArgs e) {
var printDocument = (PrintDocument)sender;
//紙張的高和寬
var paper_h = printDocument.DefaultPageSettings.PaperSize.Height;
var paper_w = printDocument.DefaultPageSettings.PaperSize.Width;
}
然而知道高和寬但不知道單位啊,這高和寬到底是像素還是英寸還是其它的什么鬼。
在實例化new PaperSize就看得到注釋:
百分之一英寸為單位
這樣第一個問題就解決了,紙張的大小是 printDocument.DefaultPageSettings.PaperSize,並且單位是百分之一英寸。
不過不要太相信這個,比如我要打印的圖片是6寸的(特地量了),但給出是尺寸寬多了0.15In,高多了0.13In。好歹win自帶的PDF打印A4紙也就相差0.002以下好吧。這個為什么有誤差待大神解釋。
那么第二個問題(第三個):該怎么繪制才能按照指定尺寸打印
既然我們知道了打印的范圍也就避免了繪制超出紙張。那么我們就要繪制內容了,咱這只講圖片,其它的也差不多。
我做的是根據圖片的大小鋪滿整個打印紙。
//我們先建個類,來記錄要圖片大小及紙張大小
//這個類只是方便調試轉換度量單位,實際應用只選一種計算單位就行了 class PrintUnit {
//圖片大小,這里圖片其實是一寸的照片 public int unit_w = 259; public int unit_h = 377;
//紙張大小300dpi 6*300 4*300 public PaperSize paperSize = new PaperSize("A6", 1800, 1200);
//度量單位 private GraphicsUnit unit = GraphicsUnit.Pixel; public GraphicsUnit Unit { get => unit; set { unit = value;
//如果度量單位為毫米 if (unit == GraphicsUnit.Millimeter) {
//具體換算為 1200/300*25.4 約等於 102
paperSize.Height = 102; paperSize.Width = 152 ;
unit_w = 22; unit_h = 32; } } } }
然后在 PrintPage事件里得到計算打印紙可以鋪滿多少圖片
PrintUnit printUnit = new PrintUnit();
g.PageUnit = printUnit.Unit;
column = printUnit.paperSize.Width / printUnit.unit_w; row = printUnit.paperSize.Height / printUnit.unit_h; for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { //g.DrawImage( // Resources._1, // new Rectangle(j * printUnit.unit_w, i * printUnit.unit_h, printUnit.unit_w, printUnit.unit_h), // new Rectangle(0, 0, Resources._1.Width, Resources._1.Height), // g.PageUnit); g.DrawImage(Resources._1, j * printUnit.unit_w, i * printUnit.unit_h, printUnit.unit_w, printUnit.unit_h); } }
有趣的是在DrawImage(Image image, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit);的重載方法里圖片有誤差,原因不明。
有點亂了,來強行解釋一波。
在打印事件里PrintPageEventArgs.PageUnit 是設置度量單位,就是你要繪制的單位是按照像素還是毫米或其它,默認是百分之一英寸。
//比如你要打印A4紙210mm×297mm ,打印PrintPage事件里設置度量單位為Millimeter
g.PageUnit=GraphicsUnit.Millimeter;
//鋪滿整個A4紙
g.DrawImage(image, 0, 0, 210, 297);
就是這么簡單,不過不建議用毫米為單位,因為這樣圖片容易誤差,這是因為繪制時會將毫米轉換成像素。
很明顯用毫米來繪制時會有間隙
懶得排版,事多,溜了溜了。
前方高能提醒,代碼很亂,不用謝。
https://files.cnblogs.com/files/zlyxm/DemoPrint_zlyxm.rar