使用Xps和Xps.Packaging的PrintPreview-错误的页面大小输出

时间:2019-03-07 07:24:33

标签: c# wpf xps documentpaginator documentpage

我的打印预览对话框中的输出纸张尺寸有问题。它应该是A4,但始终将我的PrintPreview显示为Letter Size。 我使用DocumentPaginator类作为多页输出的基础。 PageCount是正确的。我找到了this解决方案,但对我来说它不起作用,最终效果还是一样。抱歉,很长的代码,但是我不知道错误/忽略在哪里。任何想法都很感激

private void BtnPrint_Click(object sender, RoutedEventArgs e)
        {
            PrintDialog dialog = new PrintDialog();
            PageMediaSize pageSize = new PageMediaSize(PageMediaSizeName.ISOA4);
            dialog.PrintTicket.PageMediaSize = pageSize;

            var paginator = new RowPaginator(SomeData)
            { PageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight) };

            using (XpsDocument xpsDocument = new XpsDocument(someFileName, FileAccess.ReadWrite))
            {
                XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
                writer.Write(paginator);

                PrintPreview previewWindow = new PrintPreview
                {
                    Owner = this,
                    Document = xpsDocument.GetFixedDocumentSequence()
                };
                previewWindow.ShowDialog();
            }
        }

派生文档分页器类:

public class RowPaginator : DocumentPaginator
    {
        Data data;
        public RowPaginator(Data data)
        {
            this.data = data;
        }

        public override DocumentPage GetPage(int pageNumber)
        {
            var page = new PageElementRenderer(pageNumber, this.data)
            {
                Width = PageSize.Width,
                Height = PageSize.Height,
            };
            page.Measure(PageSize);
            page.Arrange(new Rect(new Point(0, 0), PageSize));
            page.UpdateLayout();

            return new DocumentPage(page);
        }
        public override bool IsPageCountValid { get { return true; } }
        public override int PageCount { get { return someInteger; } }
        public override Size PageSize
        {
            get { return this.pageSize; }
            set { this.pageSize = value; }
        }
        public override IDocumentPaginatorSource Source { get { return null; } }
    }

简单的打印预览窗口:

public partial class PrintPreview : Window
    {
        public PrintPreview()
        {
            InitializeComponent();
        }

        public IDocumentPaginatorSource Document
        {
            get { return viewer.Document; }
            set { viewer.Document = value; }
        }
    }

0 个答案:

没有答案