我有 WPF 窗口,我想在 **4 英寸 x 6 英寸** 的纸张尺寸上打印
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19019699/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
I have WPF window that i want to Print on paper size **4inch by 6inch**
提问by Avinash patil
I have WPF window that i want to Print on paper size 4inch by 6inch.
我有 WPF 窗口,我想在4 英寸 x 6 英寸的纸张上打印。
i dont understand where to set this size??
i am using window size to print but window size its not working.
my printer is not fixed paper size.
this is my print code:
我不明白在哪里设置这个尺寸??我正在使用窗口大小进行打印,但窗口大小不起作用。我的打印机不是固定的纸张尺寸。
这是我的打印代码:
private void _print()
{
PrintDialog printDlg = new System.Windows.Controls.PrintDialog();
//printDlg.ShowDialog();
//get selected printer capabilities
System.Printing.PrintCapabilities capabilities = printDlg.PrintQueue.GetPrintCapabilities(printDlg.PrintTicket);
//get scale of the print wrt to screen of WPF visual
double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / this.ActualWidth, capabilities.PageImageableArea.ExtentHeight /
this.ActualHeight);
//Transform the Visual to scale
this.LayoutTransform = new ScaleTransform(scale, scale);
//get the size of the printer page
Size sz = new Size(this.ActualWidth, this.ActualHeight);
//update the layout of the visual to the printer page size.
this.Measure(sz);
this.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));
//now print the visual to printer to fit on the one page.
printDlg.PrintVisual(this, "Print Page");
}
采纳答案by Nitin
In WPF 1 unit = 1/96 of inch, so you can calculate your size in inches using this formula
在 WPF 中1 unit = 1/96 of inch,您可以使用此公式以英寸为单位计算尺寸
you can set printDlg.PrintTicket.PageMediaSizeto the size of the Paper and then transform your window to print in that area as below:
您可以设置printDlg.PrintTicket.PageMediaSize为纸张的大小,然后将窗口转换为在该区域打印,如下所示:
private void _print()
{
PrintDialog printDlg = new System.Windows.Controls.PrintDialog();
PrintTicket pt = printDlg.PrintTicket;
Double printableWidth = pt.PageMediaSize.Width.Value;
Double printableHeight = pt.PageMediaSize.Height.Value;
Double xScale = (printableWidth - xMargin * 2) / printableWidth;
Double yScale = (printableHeight - yMargin * 2) / printableHeight;
this.Transform = new MatrixTransform(xScale, 0, 0, yScale, xMargin, yMargin);
//now print the visual to printer to fit on the one page.
printDlg.PrintVisual(this, "Print Page");
}
回答by ogantopkaya
You can also adjust the Visual with respect to the paper size. This code adjusts the image to 4x6 inch paper.
您还可以根据纸张尺寸调整视觉效果。此代码将图像调整为 4x6 英寸的纸张。
var photo = new BitmapImage();
photo.BeginInit();
photo.CacheOption = BitmapCacheOption.OnLoad;
photo.UriSource = new Uri(photoPath);
photo.EndInit();
bool isPortrait = photo.Width < photo.Height;
if (isPortrait)
{
var transformedPhoto = new BitmapImage();
transformedPhoto.BeginInit();
transformedPhoto.CacheOption = BitmapCacheOption.OnLoad;
transformedPhoto.UriSource = new Uri(photoPath);
transformedPhoto.Rotation = Rotation.Rotate270;
transformedPhoto.EndInit();
photo = transformedPhoto;
}
int width = 6;
int height = 4;
double photoScale = Math.Max(photo.Width / (96 * width), photo.Height / (96 * height));
var vis = new DrawingVisual();
var dc = vis.RenderOpen();
dc.DrawImage(photo, new Rect
{
Width = photo.Width / photoScale,
Height = photo.Height / photoScale
});
dc.Close();
var pdialog = new PrintDialog();
pdialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
pdialog.PrintTicket.PageBorderless = PageBorderless.Borderless;
pdialog.PrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.NorthAmerica4x6);
pdialog.PrintTicket.Duplexing = Duplexing.OneSided;
pdialog.PrintTicket.CopyCount = 1;
pdialog.PrintTicket.OutputQuality = OutputQuality.Photographic;
pdialog.PrintTicket.PageMediaType = PageMediaType.Photographic;
pdialog.PrintQueue = new PrintQueue(new PrintServer(), PrinterName);
pdialog.PrintVisual(vis, "My Visual");

