示例#1
0
            public override DocumentPage GetPage(int pageNumber)
            {
                // This is called starting at zero, but we are really starting at the given page.
                pageNumber += startingPage;

                if (showProgressDialog)
                {
                    if (outer.controller.UpdateProgressDialog(string.Format(MiscText.PrintingPage, pageNumber + 1, outer.totalPages), (double)pageNumber / (double)outer.totalPages))
                    {
                        throw new Exception(MiscText.CancelledByUser);
                    }
                }

                Margins   margins   = new Margins(this.margins.Left, this.margins.Right, this.margins.Top, this.margins.Bottom);
                bool      landscape = outer.pageSettings.Landscape;
                PaperSize paperSize = outer.pageSettings.PaperSize;
                bool      rotate;

                outer.ChangePageSettings(pageNumber, ref landscape, ref paperSize, margins);
                rotate        = (landscape != outer.pageSettings.Landscape);
                this.pageSize = new System.Windows.Size(HundrethsToPoints(paperSize.Width), HundrethsToPoints(paperSize.Height));
                if (outer.pageSettings.Landscape)
                {
                    this.pageSize = new System.Windows.Size(this.pageSize.Height, this.pageSize.Width);
                }

                // Get margins in terms of normal page orientation, in points.
                double leftMargin   = HundrethsToPoints(rotate ? margins.Bottom : margins.Left);
                double rightMargin  = HundrethsToPoints(rotate ? margins.Top : margins.Right);
                double topMargin    = HundrethsToPoints(rotate ? margins.Left : margins.Top);
                double bottomMargin = HundrethsToPoints(rotate ? margins.Right : margins.Bottom);

                System.Windows.Rect contentRect           = new System.Windows.Rect(leftMargin, topMargin, pageSize.Width - leftMargin - rightMargin, pageSize.Height - topMargin - bottomMargin);
                System.Windows.Rect boundingRect          = new System.Windows.Rect(0, 0, pageSize.Width - leftMargin - rightMargin, pageSize.Height - topMargin - bottomMargin);
                System.Windows.Media.DrawingVisual visual = new System.Windows.Media.DrawingVisual();

                using (System.Windows.Media.DrawingContext dc = visual.RenderOpen()) {
                    if (outer.printingToBitmaps)
                    {
                        // This is kind of hacky way to get the printing to bitmaps white, but much easier than the alternative.
                        dc.DrawRectangle(System.Windows.Media.Brushes.White, null, new System.Windows.Rect(-1, -1, pageSize.Width + 2, pageSize.Height + 2));
                    }

                    // Clip to the bounding rect within margins.
                    dc.PushClip(new System.Windows.Media.RectangleGeometry(boundingRect));

                    if (rotate)
                    {
                        // Rotate and translate to handle landscape mode.
                        dc.PushTransform(new System.Windows.Media.TranslateTransform(0, boundingRect.Height));
                        dc.PushTransform(new System.Windows.Media.RotateTransform(-90));
                    }

                    // Scale to hundreths of an inch instead of points (1/96 of inch).
                    dc.PushTransform(new System.Windows.Media.ScaleTransform(96.0 / 100.0, 96.0 / 100.0));

                    IGraphicsTarget graphicsTarget;
                    if (outer.colorModel == ColorModel.RGB)
                    {
                        graphicsTarget = new WPF_GraphicsTarget(dc);
                    }
                    else if (outer.colorModel == ColorModel.CMYK)
                    {
                        graphicsTarget = new WPF_GraphicsTarget(dc, new WPFSwopColorConverter());
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }

                    using (graphicsTarget) {
                        outer.DrawPage(graphicsTarget, pageNumber, new SizeF((float)contentRect.Width, (float)contentRect.Height), dpi);
                    }
                    graphicsTarget = null;
                }

                return(new DocumentPage(visual, pageSize, contentRect, contentRect));
            }
示例#2
0
            public override DocumentPage GetPage(int pageNumber)
            {
                // This is called starting at zero, but we are really starting at the given page.
                pageNumber += startingPage;

                if (showProgressDialog) {
                    if (outer.controller.UpdateProgressDialog(string.Format(MiscText.PrintingPage, pageNumber + 1, outer.totalPages), (double)pageNumber / (double)outer.totalPages))
                        throw new Exception(MiscText.CancelledByUser);
                }

                Margins margins = new Margins(this.margins.Left, this.margins.Right, this.margins.Top, this.margins.Bottom);
                bool landscape = outer.pageSettings.Landscape;
                PaperSize paperSize = outer.pageSettings.PaperSize;
                bool rotate;
                outer.ChangePageSettings(pageNumber, ref landscape, ref paperSize, margins);
                rotate = (landscape != outer.pageSettings.Landscape);
                this.pageSize = new System.Windows.Size(HundrethsToPoints(paperSize.Width), HundrethsToPoints(paperSize.Height));
                if (outer.pageSettings.Landscape) {
                    this.pageSize = new System.Windows.Size(this.pageSize.Height, this.pageSize.Width);
                }

                // Get margins in terms of normal page orientation, in points.
                double leftMargin = HundrethsToPoints(rotate ? margins.Bottom : margins.Left);
                double rightMargin = HundrethsToPoints(rotate ? margins.Top : margins.Right);
                double topMargin = HundrethsToPoints(rotate ? margins.Left : margins.Top);
                double bottomMargin = HundrethsToPoints(rotate ? margins.Right : margins.Bottom);
                System.Windows.Rect contentRect = new System.Windows.Rect(leftMargin, topMargin, pageSize.Width - leftMargin - rightMargin, pageSize.Height - topMargin - bottomMargin);
                System.Windows.Rect boundingRect = new System.Windows.Rect(0, 0, pageSize.Width - leftMargin - rightMargin, pageSize.Height - topMargin - bottomMargin);
                System.Windows.Media.DrawingVisual visual = new System.Windows.Media.DrawingVisual();

                using (System.Windows.Media.DrawingContext dc = visual.RenderOpen()) {
                    if (outer.printingToBitmaps) {
                        // This is kind of hacky way to get the printing to bitmaps white, but much easier than the alternative.
                        dc.DrawRectangle(System.Windows.Media.Brushes.White, null, new System.Windows.Rect(-1, -1, pageSize.Width + 2, pageSize.Height + 2));
                    }

                    // Clip to the bounding rect within margins.
                    dc.PushClip(new System.Windows.Media.RectangleGeometry(boundingRect));

                    if (rotate) {
                        // Rotate and translate to handle landscape mode.
                        dc.PushTransform(new System.Windows.Media.TranslateTransform(0, boundingRect.Height));
                        dc.PushTransform(new System.Windows.Media.RotateTransform(-90));
                    }

                    // Scale to hundreths of an inch instead of points (1/96 of inch).
                    dc.PushTransform(new System.Windows.Media.ScaleTransform(96.0 / 100.0, 96.0 / 100.0));

                    IGraphicsTarget graphicsTarget;
                    if (outer.colorModel == ColorModel.RGB)
                        graphicsTarget = new WPF_GraphicsTarget(dc);
                    else if (outer.colorModel == ColorModel.CMYK)
                        graphicsTarget = new WPF_GraphicsTarget(dc, new WPFSwopColorConverter());
                    else
                        throw new NotImplementedException();

                    using (graphicsTarget) {
                        outer.DrawPage(graphicsTarget, pageNumber, new SizeF((float)contentRect.Width, (float)contentRect.Height), dpi);
                    }
                    graphicsTarget = null;
                }

                return new DocumentPage(visual, pageSize, contentRect, contentRect);
            }