在 Windows 8.1 下,打印的 wpf 视觉效果在横向模式下被裁剪

Printed wpf visual is clipped in landscape mode under Windows 8.1

我有一个简单的 wpf 桌面应用程序,它以横向模式打印位图。 在 Windows 8/8.1 下,打印输出被剪裁在页面底部,而在 Windows 7 下,打印输出正确。 代码非常简单:加载位图,将其放入Image对象,测量可打印区域,排列图像并打印。

 void printButton_Click(object sender, RoutedEventArgs e)
    {
        var pd = new PrintDialog();

        if (!pd.ShowDialog().Value)
        {
            return;
        }

        pd.PrintTicket.PageOrientation = PageOrientation.Landscape;
        pd.PrintTicket.PageBorderless = PageBorderless.None;

        var printingCapabilities = pd.PrintQueue.GetPrintCapabilities(pd.PrintTicket);

        var bitmapImage = new BitmapImage();
        bitmapImage.BeginInit();
        bitmapImage.UriSource = new Uri("D:\printTest.bmp");
        bitmapImage.EndInit();

        var imageuiElement = new Image { Source = bitmapImage };

        var desiredSize = new Size(printingCapabilities.PageImageableArea.ExtentWidth, printingCapabilities.PageImageableArea.ExtentHeight);
        imageuiElement.Measure(desiredSize);
        imageuiElement.Arrange(new Rect(new Point(printingCapabilities.PageImageableArea.OriginWidth, printingCapabilities.PageImageableArea.OriginHeight), imageuiElement.DesiredSize));

        pd.PrintVisual(imageuiElement, "MyImage");
    }

位图大小为 1518 x 1092 像素,96 DPI,即 40.2 x 28.9 厘米。

我找到问题了Cannot print a document with landscape orientation under Windows 8 (WPF, .NET 4.0) 但对我的问题没有很好的回应(此外,我对打印为风景本身没有任何问题)。 我已经用不同供应商的不同打印机对其进行了测试,所有打印输出都被裁剪了。软件 CutePDF writer 可以将其正确打印为 PDF。 任何帮助表示赞赏。

似乎 Windows 8 没有在其容器边界之外绘制 ui 元素。这就是打印输出在底部被剪裁的原因。 无论如何,我最终得到了这样的代码,它能够在横向页面上打印居中的位图:

printDialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
            printDialog.PrintTicket.PageBorderless = PageBorderless.None;

            var printingCapabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
            if (printingCapabilities.PageImageableArea == null)
            {
                return;
            }

            var document = new FixedDocument();
            document.DocumentPaginator.PageSize = new Size(printingCapabilities.PageImageableArea.ExtentWidth, printingCapabilities.PageImageableArea.ExtentHeight);

            foreach (var imageStream in imageStreams)
            {
                document.Pages.Add(GeneratePageContent(imageStream, printingCapabilities, printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight));
            }

            try
            {
                printDialog.PrintDocument(document.DocumentPaginator, GlobalConstants.SoftwareName);
            }

private PageContent GeneratePageContent(Stream imageStream, PrintCapabilities printingCapabilities, double paperWidth, double paperHeight)
    {
        imageStream.Seek(0, SeekOrigin.Begin);

        var bmp = new BitmapImage();
        bmp.BeginInit();
        bmp.StreamSource = imageStream;
        bmp.EndInit();

        var margin = new Thickness();
        var pageSize = new Size();

        if (printingCapabilities.PageImageableArea != null)
        {
            margin = new Thickness(
                printingCapabilities.PageImageableArea.OriginWidth,
                printingCapabilities.PageImageableArea.OriginHeight,
                printingCapabilities.PageImageableArea.OriginWidth,
                printingCapabilities.PageImageableArea.OriginHeight);

            pageSize = new Size(printingCapabilities.PageImageableArea.ExtentWidth, printingCapabilities.PageImageableArea.ExtentHeight);
        }

        var imageUiElement = new Image
        {
            Source = bmp,
            Margin = margin
        };

        var canvas = new Grid { Width = paperWidth, Height = paperHeight };
        canvas.Children.Add(imageUiElement);

        var fixedPage = new FixedPage
        {
            Width = paperWidth,
            Height = paperHeight
        };

        fixedPage.Children.Add(canvas);

        var pageContent = new PageContent();
        ((IAddChild)pageContent).AddChild(fixedPage);

        pageContent.Measure(pageSize);
        pageContent.Arrange(new Rect(new Point(), pageSize));
        pageContent.UpdateLayout();

        return pageContent;
    }