我正在将WPF中的视觉效果打印到收据打印机(Star TSP 700II)。 当视觉很小时它很好并打印好。
然而,当视觉效果增长时,它会剪切图像,并在星形打印机的卷筒上打印到一定的尺寸,然后只剪切而不打印图像的其余部分。
PrintDialog.PrintVisual(Grid1, "Test");
我尝试过调整PageMediaSize,但这并没有改变打印输出上的任何内容。
有趣的是,当我打印到Microsoft XPS Document Writer时,保存的文件具有完整的图像。
我还注意到它打印的尺寸总是最大高度= A4页面的高度。 问题是如何让它打印超过A4的高度(当我从打印机首选项打印测试文档时,它能够执行此操作)。
答案 0 :(得分:9)
好的我用下面的课解决了这个问题。基本上我把我想要打印的内容放在一个scrollviewer中并将一个stackpanel放在其中,然后将这个stackpanel传递给我的打印助手,它现在打印时没有剪切:
public static class PrintHelper
{
public static FixedDocument GetFixedDocument(FrameworkElement toPrint, PrintDialog printDialog)
{
var capabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
var pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
var visibleSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
var fixedDoc = new FixedDocument();
//If the toPrint visual is not displayed on screen we neeed to measure and arrange it
toPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
toPrint.Arrange(new Rect(new Point(0, 0), toPrint.DesiredSize));
//
var size = toPrint.DesiredSize;
//Will assume for simplicity the control fits horizontally on the page
double yOffset = 0;
while (yOffset < size.Height)
{
var vb = new VisualBrush(toPrint)
{
Stretch = Stretch.None,
AlignmentX = AlignmentX.Left,
AlignmentY = AlignmentY.Top,
ViewboxUnits = BrushMappingMode.Absolute,
TileMode = TileMode.None,
Viewbox = new Rect(0, yOffset, visibleSize.Width, visibleSize.Height)
};
var pageContent = new PageContent();
var page = new FixedPage();
((IAddChild)pageContent).AddChild(page);
fixedDoc.Pages.Add(pageContent);
page.Width = pageSize.Width;
page.Height = pageSize.Height;
var canvas = new Canvas();
FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight);
canvas.Width = visibleSize.Width;
canvas.Height = visibleSize.Height;
canvas.Background = vb;
page.Children.Add(canvas);
yOffset += visibleSize.Height;
}
return fixedDoc;
}
public static void ShowPrintPreview(FixedDocument fixedDoc)
{
var wnd = new Window();
var viewer = new DocumentViewer();
viewer.Document = fixedDoc;
wnd.Content = viewer;
wnd.ShowDialog();
}
public static void PrintNoPreview(PrintDialog printDialog,FixedDocument fixedDoc)
{
printDialog.PrintDocument(fixedDoc.DocumentPaginator, "Test Print No Preview");
}
}
答案 1 :(得分:1)
最近几天我也遇到了这个问题。
解决方案是将根元素呈现在内存中。
PrintDialog dlg = new PrintDialog();
// Let it meassure to the printer's default width
// and use an infinity height
Grid1.Meassure(new Size(dlg.PrintableAreaWidth, double.PositiveInfinity));
// Let it arrange to the meassured size
Grid1.Arrange(new Rect(Grid1.DesiredSize));
// Update the element
Grid1.UpdateLayout();
然后为打印机创建一个新的纸张大小:
您应该检查打印机的剪切设置(例如使用Receipt
剪切模式)。
// Create a new papersize with the printer's default width, and the Grids height
dlg.PrintTicket.PageMediaSize
= new PageMediaSize(dlg.PrintableAreaWidth, Grid1.ActualHeight);
// Let's print !
dlg.PrintVisual(Grid1, "blah");
这对我来说就像一个魅力,并为我节省了很多代码。
由于收据打印机不需要pagination
,我认为这很容易使用。
请注意,我 NOT 使用此方法呈现在XAML中创建的UIElement
,它都是在代码中以StackPanel
为根元素
答案 2 :(得分:0)
您正在使用PrintDialog.PrintVisual,它只能打印您可以看到的内容。对于多页结果,您需要执行更多操作。
您可以尝试使用DocumentPaginator http://msdn2.microsoft.com/en-us/library/system.windows.documents.documentpaginator.aspx
或
PrintDialog.PrintDocument http://msdn2.microsoft.com/en-us/library/system.windows.controls.printdialog.printdocument.aspx。