Пример #1
0
        private void printersCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (!IsLoaded)
            {
                return;
            }

            if (e.AddedItems.Count == 0)
            {
                return;
            }

            PrintQueue printer = (PrintQueue)((FrameworkElement)e.AddedItems[0]).Tag;

            if (printer == null)
            {
                return;
            }

            if (selectedPrinter != null)
            {
                if (selectedPrinter.Description == printer.Description)
                {
                    return;
                }
            }

            selectedPrinter = printer;

            PrintCapabilities capabilities = printer.GetPrintCapabilities();

            UpdateDuplexUI(printer, capabilities);
        }
Пример #2
0
        internal static void PrintFlowDocument(PrintQueue pq, FlowDocument flowDocument)
        {
            if (pq == null)
            {
                throw new InvalidOperationException("Invalid Printer");
            }
            // Create a XpsDocumentWriter object, open a Windows common print dialog.
            // This methods returns a ref parameter that represents information about the dimensions of the printer media.
            XpsDocumentWriter docWriter = PrintQueue.CreateXpsDocumentWriter(pq);
            PageImageableArea ia        = pq.GetPrintCapabilities().PageImageableArea;
            PrintTicket       pt        = pq.UserPrintTicket;

            if (ia != null)
            {
                DocumentPaginator paginator = ((IDocumentPaginatorSource)flowDocument).DocumentPaginator;
                // Change the PageSize and PagePadding for the document to match the CanvasSize for the printer device.
                paginator.PageSize = new Size((double)pt.PageMediaSize.Width, (double)pt.PageMediaSize.Height);
                Thickness pagePadding = flowDocument.PagePadding;
                flowDocument.PagePadding = new Thickness(
                    Math.Max(ia.OriginWidth, pagePadding.Left),
                    Math.Max(ia.OriginHeight, pagePadding.Top),
                    Math.Max((double)pt.PageMediaSize.Width - (ia.OriginWidth + ia.ExtentWidth), pagePadding.Right),
                    Math.Max((double)pt.PageMediaSize.Height - (ia.OriginHeight + ia.ExtentHeight), pagePadding.Bottom));
                flowDocument.ColumnWidth = double.PositiveInfinity;
                flowDocument.FontFamily  = new System.Windows.Media.FontFamily(LocalSettings.PrintFontFamily);
                // Send DocumentPaginator to the printer.
                docWriter.Write(paginator);
            }
        }
        private void printOutMain()
        {
            PageImageableArea area;
            Canvas            canvas;
            FixedPage         page;
            PageContent       cont;
            FixedDocument     doc;
            PrintDialog       dPrt;

            // 210 × 297 ミリ(約 8.27 × 約 11.69 インチ)=794 × 1123 pixel
            area     = m_queueCrt.GetPrintCapabilities().PageImageableArea;
            m_dXTime = 794.0 / 210.0;
            m_dYTime = 1123.0 / 297.0;
            m_dAddX  = 0;
            m_dAddY  = 0;
            doc      = new FixedDocument();

            canvas        = new Canvas();
            canvas.Width  = area.OriginWidth + area.ExtentWidth;
            canvas.Height = area.OriginHeight + area.ExtentHeight;

            drawCanvas(canvas);

            page = new FixedPage();
            page.Children.Add(canvas);
            cont       = new PageContent();
            cont.Child = page;
            doc.Pages.Add(cont);

            dPrt            = new PrintDialog();
            dPrt.PrintQueue = m_queueCrt;
            dPrt.PrintDocument(doc.DocumentPaginator, "請求書");
        }
Пример #4
0
        internal static void PrintFlowDocument(PrintQueue pq, FlowDocument flowDocument)
        {
            if (pq == null) return;
            // Create a XpsDocumentWriter object, open a Windows common print dialog.
            // This methods returns a ref parameter that represents information about the dimensions of the printer media. 
            XpsDocumentWriter docWriter = PrintQueue.CreateXpsDocumentWriter(pq);
            PageImageableArea ia = pq.GetPrintCapabilities().PageImageableArea;
            PrintTicket pt = pq.UserPrintTicket;

            if (ia != null)
            {
                DocumentPaginator paginator = ((IDocumentPaginatorSource)flowDocument).DocumentPaginator;
                // Change the PageSize and PagePadding for the document to match the CanvasSize for the printer device.
                paginator.PageSize = new Size((double)pt.PageMediaSize.Width, (double)pt.PageMediaSize.Height);
                Thickness pagePadding = flowDocument.PagePadding;
                flowDocument.PagePadding = new Thickness(
                        Math.Max(ia.OriginWidth, pagePadding.Left),
                        Math.Max(ia.OriginHeight, pagePadding.Top),
                        Math.Max((double)pt.PageMediaSize.Width - (ia.OriginWidth + ia.ExtentWidth), pagePadding.Right),
                        Math.Max((double)pt.PageMediaSize.Height - (ia.OriginHeight + ia.ExtentHeight), pagePadding.Bottom));
                flowDocument.ColumnWidth = double.PositiveInfinity;
                // Send DocumentPaginator to the printer.
                docWriter.Write(paginator);
            }
        }
Пример #5
0
        private static Rect GetImageableRect(PrintDialog dialog)
        {
            Rect empty = Rect.Empty;

            Invariant.Assert(dialog != null, "Dialog should not be null.");
            PrintCapabilities    printCapabilities    = null;
            CodeAccessPermission codeAccessPermission = SystemDrawingHelper.NewDefaultPrintingPermission();

            codeAccessPermission.Assert();
            try
            {
                PrintQueue printQueue = dialog.PrintQueue;
                if (printQueue != null)
                {
                    printCapabilities = printQueue.GetPrintCapabilities();
                }
            }
            finally
            {
                CodeAccessPermission.RevertAssert();
            }
            if (printCapabilities != null)
            {
                PageImageableArea pageImageableArea = printCapabilities.PageImageableArea;
                if (pageImageableArea != null)
                {
                    empty = new Rect(pageImageableArea.OriginWidth, pageImageableArea.OriginHeight, pageImageableArea.ExtentWidth, pageImageableArea.ExtentHeight);
                }
            }
            if (empty == Rect.Empty)
            {
                empty = new Rect(15.0, 15.0, dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);
            }
            return(empty);
        }
Пример #6
0
        /// <summary>
        /// コンストラクタ
        /// 出来高を取得、印刷関連オブジェクトの設定をする
        /// </summary>
        /// <param name="Dekidaka">出来高データ</param>
        public PrintingTelop(Dekidaka_Data orgDekidaka)
        {
            Dekidaka = orgDekidaka; //出来高データの保持


            //プリンタの印刷範囲を取得する為に関連オブジェクトを作成する
            pq = null;
            Pt = null;

            //Settings.PrintDlg = new PrintDialog();

            //ローカルプリントサーバーから設定内容のプリンタキューと印刷設定チケットを取得する
            IsPrintSetting = GetPrinterSetting(ps, ref pq, ref Pt);


            //印刷可能範囲を計算して保持する
            PageImageableArea Pa = pq.GetPrintCapabilities().PageImageableArea;

            //double PageWidtha = Pa.OriginWidth +  Pa.ExtentWidth;
            //double PageHeighta = Pa.OriginHeight + Pa.ExtentHeight;
            PageWidth  = (double)Pt.PageMediaSize.Width - Pa.OriginWidth;
            PageHeight = (double)Pt.PageMediaSize.Height - Pa.OriginHeight;

            //MessageBox.Show("1 Width:" + PageWidth.ToString() + "  Height:" + PageHeight.ToString() +
            //                "\n2 Width:" + PageWidtha.ToString() + " Height:" + PageHeighta.ToString() +
            //                "\nO Width:" + Pa.OriginWidth.ToString() + " Height:" + Pa.OriginHeight.ToString() +
            //                "\nE Width:" + Pa.ExtentWidth.ToString() + " Height:" + Pa.ExtentHeight.ToString() +
            //                "\nP Width:" + Pt.PageMediaSize.Width.ToString() + " Height:" + Pt.PageMediaSize.Height.ToString());
        }
Пример #7
0
        // </GetPrintQueues>

        // <GetPrintTicket>
        /// <summary>
        /// Returns a print ticket, which is a set of instructions telling a printer how
        /// to set its various features, such as duplexing, collating, and stapling.
        /// </summary>
        /// <param name="printQueue">The print queue to print to.</param>
        /// <returns>A print ticket.</returns>
        public static PrintTicket GetPrintTicket(PrintQueue printQueue)
        {
            PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();

            // Get a default print ticket from printer.
            PrintTicket printTicket = printQueue.DefaultPrintTicket;

            // Modify the print ticket.
            if (printCapabilites.CollationCapability.Contains(Collation.Collated))
            {
                printTicket.Collation = Collation.Collated;
            }
            if (printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge))
            {
                printTicket.Duplexing = Duplexing.TwoSidedLongEdge;
            }
            if (printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft))
            {
                printTicket.Stapling = Stapling.StapleDualLeft;
            }

            // Returns a print ticket, which is a set of instructions telling a printer how
            // to set its various features, such as duplexing, collating, and stapling.
            return(printTicket);
        }
        //****************************************************************************************
        // Construction
        //****************************************************************************************
        /// <summary>
        /// Constructor for printing
        /// </summary>
        /// <param name="printQueue"></param>
        /// <param name="printTicket"></param>
        public WpfPrint(PrintQueue printQueue, PrintTicket printTicket)
        {
            PrintCapabilities capabilities = printQueue.GetPrintCapabilities(printTicket);
            Size sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);

            _fixedDocument = new FixedDocument();
            _fixedDocument.DocumentPaginator.PageSize = sz;
            StartPage();
        }
Пример #9
0
        UpdatePrintableAreaSize(
            )
        {
            PrintQueue  printQueue  = null;
            PrintTicket printTicket = null;

            PickCorrectPrintingEnvironment(ref printQueue, ref printTicket);

            PrintCapabilities printCap = null;

            if (printQueue != null)
            {
                printCap = printQueue.GetPrintCapabilities(printTicket);
            }

            // PrintCapabilities OrientedPageMediaWidth/Height are Nullable
            if ((printCap != null) &&
                (printCap.OrientedPageMediaWidth != null) &&
                (printCap.OrientedPageMediaHeight != null))
            {
                _printableAreaWidth  = (double)printCap.OrientedPageMediaWidth;
                _printableAreaHeight = (double)printCap.OrientedPageMediaHeight;
            }
            else
            {
                // Initialize page size to portrait Letter size.
                // This is our fallback if PrintTicket doesn't specify the page size.
                _printableAreaWidth  = 816;
                _printableAreaHeight = 1056;

                // PrintTicket's PageMediaSize could be null and PageMediaSize Width/Height are Nullable

                if ((printTicket.PageMediaSize != null) &&
                    (printTicket.PageMediaSize.Width != null) &&
                    (printTicket.PageMediaSize.Height != null))
                {
                    _printableAreaWidth  = (double)printTicket.PageMediaSize.Width;
                    _printableAreaHeight = (double)printTicket.PageMediaSize.Height;
                }

                // If we are using PrintTicket's PageMediaSize dimensions to populate the widht/height values,
                // we need to adjust them based on current orientation. PrintTicket's PageOrientation is Nullable.
                if (printTicket.PageOrientation != null)
                {
                    PageOrientation orientation = (PageOrientation)printTicket.PageOrientation;

                    // need to swap width/height in landscape orientation
                    if ((orientation == PageOrientation.Landscape) ||
                        (orientation == PageOrientation.ReverseLandscape))
                    {
                        double t = _printableAreaWidth;
                        _printableAreaWidth  = _printableAreaHeight;
                        _printableAreaHeight = t;
                    }
                }
            }
        }
Пример #10
0
        private PrintTicket GetPrintTicketFromPrinter(Report_Template printerSettings)
        {
            PrintQueue printQueue = null;

            LocalPrintServer localPrintServer = new LocalPrintServer();

            // Retrieving collection of local printer on user machine
            PrintQueueCollection localPrinterCollection =
                localPrintServer.GetPrintQueues();

            System.Collections.IEnumerator localPrinterEnumerator =
                localPrinterCollection.GetEnumerator();

            if (localPrinterEnumerator.MoveNext())
            {
                // Get PrintQueue from first available printer
                printQueue = (PrintQueue)localPrinterEnumerator.Current;
                MessageBox.Show(printQueue.Name);
            }
            else
            {
                // No printer exist, return null PrintTicket
                return(null);
            }

            // Get default PrintTicket from printer
            PrintTicket printTicket = printQueue.DefaultPrintTicket;

            PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();

            // Modify PrintTicket
            if (printCapabilites.CollationCapability.Contains(Collation.Collated))
            {
                printTicket.Collation = Collation.Collated;
            }

            if (printCapabilites.DuplexingCapability.Contains(
                    Duplexing.TwoSidedLongEdge))
            {
                printTicket.Duplexing = Duplexing.TwoSidedLongEdge;
            }

            if (printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft))
            {
                printTicket.Stapling = Stapling.StapleDualLeft;
            }
            printTicket.PageMediaSize   = new PageMediaSize(PageMediaSizeName.JISB4);
            printTicket.PageOrientation = PageOrientation.Unknown;
            printTicket.Duplexing       = Duplexing.TwoSidedShortEdge;
            printTicket.PageResolution  = new PageResolution(PageQualitativeResolution.Draft);
            return(printTicket);
        }// end:GetPrintTicketFromPrinter()
        private void OnPrint(object sender, RoutedEventArgs e)
        {
            var dlg = new PrintDialog();

            if (dlg.ShowDialog() == true)
            {
                dlg.PrintVisual(canvas1, "Print Demo");
            }


            // PrintServer printServer = new PrintServer(@"\\treslunas\laserjet");
            var printServer = new LocalPrintServer();

            PrintQueue queue = printServer.DefaultPrintQueue;


            PrintTicket       ticket       = queue.DefaultPrintTicket;
            PrintCapabilities capabilities = queue.GetPrintCapabilities(ticket);

            if (capabilities.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge))
            {
                ticket.Duplexing = Duplexing.TwoSidedLongEdge;
            }
            if (capabilities.InputBinCapability.Contains(InputBin.AutoSelect))
            {
                ticket.InputBin = InputBin.AutoSelect;
            }
            if (capabilities.MaxCopyCount > 3)
            {
                ticket.CopyCount = 3;
            }
            if (capabilities.PageOrientationCapability.Contains(PageOrientation.Landscape))
            {
                ticket.PageOrientation = PageOrientation.Landscape;
            }
            if (capabilities.PagesPerSheetCapability.Contains(2))
            {
                ticket.PagesPerSheet = 2;
            }
            if (capabilities.StaplingCapability.Contains(Stapling.StapleBottomLeft))
            {
                ticket.Stapling = Stapling.StapleBottomLeft;
            }

            XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(queue);

            writer.Write(canvas1, ticket);
        }
Пример #12
0
    }// end:AddPageResources()

    //</SnippetXpsCreateAddPageResources>

    //<SnippetPrinterCapabilities>
    // ---------------------- GetPrintTicketFromPrinter -----------------------
    /// <summary>
    ///   Returns a PrintTicket based on the current default printer.</summary>
    /// <returns>
    ///   A PrintTicket for the current local default printer.</returns>
    private PrintTicket GetPrintTicketFromPrinter()
    {
        PrintQueue printQueue = null;

        LocalPrintServer localPrintServer = new LocalPrintServer();

        // Retrieving collection of local printer on user machine
        PrintQueueCollection localPrinterCollection =
            localPrintServer.GetPrintQueues();

        System.Collections.IEnumerator localPrinterEnumerator =
            localPrinterCollection.GetEnumerator();

        if (localPrinterEnumerator.MoveNext())
        {
            // Get PrintQueue from first available printer
            printQueue = (PrintQueue)localPrinterEnumerator.Current;
        }
        else
        {
            // No printer exist, return null PrintTicket
            return(null);
        }

        // Get default PrintTicket from printer
        PrintTicket printTicket = printQueue.DefaultPrintTicket;

        PrintCapabilities printCapabilities = printQueue.GetPrintCapabilities();

        // Modify PrintTicket
        if (printCapabilities.CollationCapability.Contains(Collation.Collated))
        {
            printTicket.Collation = Collation.Collated;
        }

        if (printCapabilities.DuplexingCapability.Contains(
                Duplexing.TwoSidedLongEdge))
        {
            printTicket.Duplexing = Duplexing.TwoSidedLongEdge;
        }

        if (printCapabilities.StaplingCapability.Contains(Stapling.StapleDualLeft))
        {
            printTicket.Stapling = Stapling.StapleDualLeft;
        }

        return(printTicket);
    }// end:GetPrintTicketFromPrinter()
Пример #13
0
        public static void Print(FixedPage page)//, string pageName
        {
            //page.UpdateLayout();
            PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();

            //FixedPage若直接打印,则打印出来的内容为空白,因为height为0
            //推测原因:没有render
            //但先保存为文件,或加载到FixedDocument中就能打印,奇怪
            #region
            System.Printing.PrintCapabilities capabilities = defaultPrintQueue.GetPrintCapabilities();
            FixedDocument document = new FixedDocument();
            document.DocumentPaginator.PageSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
            PageContent content = new PageContent();
            ((IAddChild)content).AddChild(page);
            document.Pages.Add(content);
            #endregion

            #region 根据打印机打印区域缩放page大小
            //System.Printing.PrintCapabilities capabilities = defaultPrintQueue.GetPrintCapabilities();
            ////get scale of the print wrt to screen of WPF visual
            //double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / page.ActualWidth, capabilities.PageImageableArea.ExtentHeight / page.ActualHeight);
            ////Transform the Visual to scale
            //page.LayoutTransform = new ScaleTransform(scale, scale);

            ////get the size of the printer page
            //Size sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
            ////update the layout of the visual to the printer page size.
            //page.Measure(sz);
            //page.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));
            #endregion

            try
            {
                //string path = SaveXPS(page, pageName);
                //PrintSystemJobInfo xpsPringtJob = defaultPrintQueue.AddJob(pageName + ".xps", path, true);
                XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(defaultPrintQueue);//如此会自动帮我们判定上面AddJob方法的第三个参数
                xpsdw.Write(document);
            }
            catch (Exception e)
            {
                MessageBox.Show("打印失败,失败原因:" + e.Message);
            }
            finally
            {
                defaultPrintQueue.Dispose();
            }
        }
Пример #14
0
        private void btnSelectPrinter_Click(object sender, RoutedEventArgs e)
        {
            //Set the state of the options controls
            printQueue = GetPrintQueue();

            if (printQueue == null)
            {
                return;
            }

            // Get default PrintTicket from printer
            printTicket = printQueue.UserPrintTicket;

            PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();

            SetControlStates(printCapabilites, printTicket);
        }
Пример #15
0
        private void printOutMain()
        {
            PageImageableArea area;
            Canvas            canvas;
            double            cx, cy;
            FixedPage         page;
            PageContent       cont;
            FixedDocument     doc;
            PrintDialog       dPrt;

            dPrt            = new PrintDialog();
            dPrt.PrintQueue = m_queueCrt;
            if (dPrt.ShowDialog() == false)
            {
                return;
            }
            m_queueCrt = dPrt.PrintQueue;
            // 210 × 297 ミリ(約 8.27 × 約 11.69 インチ)=794 × 1123 pixel
            area     = m_queueCrt.GetPrintCapabilities().PageImageableArea;
            m_dXTime = 794.0 / 210.0;
            m_dYTime = 1123.0 / 297.0;
            m_dAddX  = 0;
            m_dAddY  = 0;
            doc      = new FixedDocument();

            canvas        = new Canvas();
            canvas.Width  = trnsLen(120.0);
            canvas.Height = trnsLen(235.0);

            drawCanvas(canvas);
            cx = canvas.Width / 2.0;
            cy = canvas.Height / 2.0;
            canvas.RenderTransform = new RotateTransform(180.0, cx, cy);
            page = new FixedPage();
            page.Children.Add(canvas);
            cont       = new PageContent();
            cont.Child = page;
            doc.Pages.Add(cont);

            dPrt            = new PrintDialog();
            dPrt.PrintQueue = m_queueCrt;
            dPrt.PrintDocument(doc.DocumentPaginator, "封筒");
        }
Пример #16
0
        public Print(ghostnet_wpf_example.MainWindow main_in, int num_pages)
        {
            InitializeComponent();

            m_ps = new PrinterSettings();
            main = main_in;

            this.Closing += new System.ComponentModel.CancelEventHandler(FakeWindowClosing);
            InitializeComponent();
            m_printServer     = new LocalPrintServer();
            m_selectedPrinter = LocalPrintServer.GetDefaultPrintQueue();
            m_ps.PrinterName  = m_selectedPrinter.FullName;
            m_pagedetails     = m_ps.DefaultPageSettings;


            xaml_rbAll.IsChecked = true;
            m_pages_setting      = PrintPages_t.ALL;

            xaml_autofit.IsChecked = false;

            m_numpages = num_pages;

            m_printcap = m_selectedPrinter.GetPrintCapabilities();

            m_trans_pap = new TranslateTransform(0, 0);
            m_trans_doc = new TranslateTransform(0, 0);
            m_isrotated = false;

            /* Data range case */
            m_range_pages = new PrintRanges(m_numpages);
            m_page_scale  = 1.0;

            m_numcopies = 1;

            m_invalidTo   = true;
            m_invalidFrom = true;
            m_from        = -1;
            m_to          = -1;

            InitPrinterList();
        }
Пример #17
0
        private void CalculateSize(FixedPage fixedPage)
        {
            PrintQueue        printQueue   = LocalPrintServer.GetDefaultPrintQueue();
            PrintCapabilities capabilities = printQueue.GetPrintCapabilities();

            //get scale of the print wrt to screen of WPF visual
            double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / fixedPage.ActualWidth, capabilities.PageImageableArea.ExtentHeight / fixedPage.ActualHeight);

            //Transform the Visual to scale
            fixedPage.LayoutTransform = new ScaleTransform(scale, scale);

            //get the size of the printer page
            var sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);

            //update the layout of the visual to the printer page size.
            fixedPage.Measure(sz);
            double x = capabilities.PageImageableArea.OriginWidth;
            double y = capabilities.PageImageableArea.OriginHeight;

            fixedPage.Arrange(new Rect(new Point(x, y), sz));
            fixedPage.UpdateLayout();
        }
Пример #18
0
        public void load(string nomeStampante)
        {
            //http://stackoverflow.com/questions/1018001/is-there-a-net-way-to-enumerate-all-available-network-printers
            var match = Regex.Match(nomeStampante, @"(?<machine>\\\\.*?)\\(?<queue>.*)");

            if (match.Success)
            {
                _printQueue = new PrintServer(match.Groups["machine"].Value).GetPrintQueue(match.Groups["queue"].Value);
            }
            else
            {
                _printQueue = _printServer.GetPrintQueue(nomeStampante);
            }

            try {
                _printCapabilities = _printQueue.GetPrintCapabilities();
            } catch (Exception) {
                // Le stampanti shinko in rete non supportano questa operazione
            }

            _printDialog            = new PrintDialog();
            _printDialog.PrintQueue = _printQueue;
        }
Пример #19
0
        /// <summary>
        /// Captures settings from complete PrintTickets.
        /// </summary>
        /// <param name="ticket"></param>
        /// <param name="ticketXMLString">If you wish to read/write to the cache,
        /// this must be set to the result of ticket.ToXmlString().
        /// This an optional performance enhancement.</param>
        /// <remarks>
        /// PrintTicket changes are communicated through StartDocument and StartPage, which receive
        /// complete tickets (the merge of tickets at all levels). Lack of change is indicated by
        /// null. Here we capture settings from PrintTicket for use in flattening and by GDIExporter.
        /// </remarks>
        private void CaptureTicketSettings(PrintTicket ticket, String ticketXMLString)
        {
            if (ticket == null)
            {
                Debug.Assert(ticketXMLString == null);

                // ticket has not changed since last capture; keep existing settings
            }
            else
            {
                m_OutputQuality = ticket.OutputQuality;

                if (ticketXMLString != null && m_printTicketCache.TryGetPageSize(ticketXMLString, out m_PageWidth, out m_PageHeight))
                {
                }
                // 100ms slowpath.
                else
                {
                    //
                    // Fix bug: 1396328, 1394678: Incorrect page dimensions used for clipping.
                    //
                    // PrintTicket contains the application-requested page dimensions. The printer
                    // may print to a page of different dimensions; that information is returned in
                    // PrintCapabilities, and is what we need to use for clipping.
                    //
                    PrintCapabilities capabilities = m_PrintQueue.GetPrintCapabilities(ticket);

                    m_PageWidth  = capabilities.OrientedPageMediaWidth.GetValueOrDefault(816);
                    m_PageHeight = capabilities.OrientedPageMediaHeight.GetValueOrDefault(1056);

                    if (ticketXMLString != null)
                    {
                        m_printTicketCache.CachePageSize(ticketXMLString, m_PageWidth, m_PageHeight);
                    }
                }
            }
        }
Пример #20
0
        private void UpdatePrintableAreaSize()
        {
            PrintQueue  printQueue  = null;
            PrintTicket printTicket = null;

            this.PickCorrectPrintingEnvironment(ref printQueue, ref printTicket);
            PrintCapabilities printCapabilities = null;

            if (printQueue != null)
            {
                printCapabilities = printQueue.GetPrintCapabilities(printTicket);
            }
            if (printCapabilities != null && printCapabilities.OrientedPageMediaWidth != null && printCapabilities.OrientedPageMediaHeight != null)
            {
                this._printableAreaWidth  = printCapabilities.OrientedPageMediaWidth.Value;
                this._printableAreaHeight = printCapabilities.OrientedPageMediaHeight.Value;
                return;
            }
            this._printableAreaWidth  = 816.0;
            this._printableAreaHeight = 1056.0;
            if (printTicket.PageMediaSize != null && printTicket.PageMediaSize.Width != null && printTicket.PageMediaSize.Height != null)
            {
                this._printableAreaWidth  = printTicket.PageMediaSize.Width.Value;
                this._printableAreaHeight = printTicket.PageMediaSize.Height.Value;
            }
            if (printTicket.PageOrientation != null)
            {
                PageOrientation value = printTicket.PageOrientation.Value;
                if (value == PageOrientation.Landscape || value == PageOrientation.ReverseLandscape)
                {
                    double printableAreaWidth = this._printableAreaWidth;
                    this._printableAreaWidth  = this._printableAreaHeight;
                    this._printableAreaHeight = printableAreaWidth;
                }
            }
        }
Пример #21
0
        /**
         * Attenzione:
         * questo metodo deve ritornare l'esito della stampa, quindi non deve essere asincrono.
         * Deve essere sicronizzato
         */
        public EsitoStampa esegui(LavoroDiStampa lavoroDiStampa)
        {
            LavoroDiStampaFoto _lavoroDiStampa = lavoroDiStampa as LavoroDiStampaFoto;

            _giornale.Debug("Sto per avviare il lavoro di stampa: " + lavoroDiStampa.ToString());

            _conta++;

            try {
                string nomeFileFoto = AiutanteFoto.idrataImmagineDaStampare(_lavoroDiStampa.fotografia);

                // Ricavo l'immagine da stampare
                IImmagine immagine = _lavoroDiStampa.fotografia.imgRisultante != null ? _lavoroDiStampa.fotografia.imgRisultante : _lavoroDiStampa.fotografia.imgOrig;

                // Gestisco una eccezione specifica, in questo modo ho un messaggio chiaro di cosa è andato storto.
                if (immagine == null)
                {
                    throw new FileNotFoundException("fotografia = " + _lavoroDiStampa.fotografia, _lavoroDiStampa.fotografia.nomeFile);
                }

                // Devo clonare l'immagine perché negli atri thread potrebbero eseguire delle dispose che me la svuotano
                using (IImmagine immagineDaStampare = (IImmagine)immagine.Clone()) {
                    // TODO BLUCA provo a duplicare l'immagine per evitare l'errore che è di proprietà del thread chiamante.
                    // BitmapSource bmp = new WriteableBitmap( ((ImmagineWic)immagineDaStampare).bitmapSource );
                    // bmp.Freeze();

                    BitmapSource bmp = ((ImmagineWic)immagineDaStampare).bitmapSource;

                    var         match = Regex.Match(lavoroDiStampa.param.nomeStampante, @"(?<machine>\\\\.*?)\\(?<queue>.*)");
                    PrintServer ps1   = null;
                    if (match.Success)
                    {
                        // Come print-server uso il server di rete
                        ps1 = new PrintServer(match.Groups["machine"].Value);
                    }
                    else
                    {
                        // Come print-server uso me stesso
                        ps1 = new PrintServer();
                    }
                    using ( ps1 ) {
                        PrintQueue coda = null;
                        if (match.Success)
                        {
                            coda = ps1.GetPrintQueue(match.Groups["queue"].Value);
                        }
                        else
                        {
                            coda = ps1.GetPrintQueue(lavoroDiStampa.param.nomeStampante);
                        }

                        // Ricavo la coda di stampa (cioè la stampante) e le sue capacità.
                        using ( coda ) {
                            PrintCapabilities capabilities = null;
                            try {
                                capabilities = coda.GetPrintCapabilities();
                            } catch (Exception) {
                                // Le stampanti shinko non supportano
                            }

                            // Imposto la stampante (così che mi carica le impostazioni)
                            PrintDialog dialog = new PrintDialog();
                            dialog.PrintQueue = coda;

                            Size areaStampabile = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);

                            // Imposto qualche attributo della stampa
                            bool piuRealistaDelRe = false;
                            if (piuRealistaDelRe)                                // Meglio non essere più realisti del re.
                            {
                                dialog.PrintTicket.OutputQuality       = OutputQuality.Photographic;
                                dialog.PrintTicket.PhotoPrintingIntent = PhotoPrintingIntent.PhotoBest;
                            }

                            // Compongo il titolo della stampa che comparirà nella descrizione della riga nello spooler di windows
                            StringBuilder titolo = new StringBuilder();
                            titolo.AppendFormat("foto N.{0} Oper={1} gg={2}",
                                                _lavoroDiStampa.fotografia.etichetta,
                                                _lavoroDiStampa.fotografia.fotografo.iniziali,
                                                String.Format("{0:dd-MMM}", _lavoroDiStampa.fotografia.dataOraAcquisizione));
#if DEBUG
                            titolo.Append(" #");
                            titolo.Append(DateTime.Now.ToString("mmssss"));                                  // Uso un numero univoco per evitare doppioni per il doPdf altrimenti mi chiede sempre di sovrascrivere
#endif
                            // Eventuale rotazione dell'orientamento dell'area di stampa
                            // Devo decidere in anticipo se la stampante va girata. Dopo che ho chiamato Print non si può più fare !!!
                            bool _ruotareStampante = false;
                            if (_lavoroDiStampa.param.autoRuota)
                            {
                                if (!ProiettoreArea.isStessoOrientamento(areaStampabile, immagineDaStampare))
                                {
                                    _ruotareStampante = true;
                                }
                            }

                            if (_ruotareStampante)
                            {
                                if (capabilities != null && capabilities.PageOrientationCapability.Contains(PageOrientation.Landscape) && capabilities.PageOrientationCapability.Contains(PageOrientation.Portrait))
                                {
                                    // tutto ok
                                    dialog.PrintTicket.PageOrientation = (dialog.PrintTicket.PageOrientation == PageOrientation.Landscape ? PageOrientation.Portrait : PageOrientation.Landscape);
                                }
                                else
                                {
                                    _giornale.Debug("La stampante " + lavoroDiStampa.param.nomeStampante + " non accetta cambio orientamento landscape/portrait");
                                }

                                // Quando giro la stampante, non mi si girano anche le dimensioni. Ci penso da solo.
                                areaStampabile = ProiettoreArea.ruota(areaStampabile);
                            }

                            //
                            // ----- gestisco il numero di copie
                            //
                            int cicliStampa = 1;
                            if (lavoroDiStampa.param.numCopie > 1)
                            {
                                // Se la stampante gestisce le copie multiple, faccio un invio solo.
                                if (capabilities != null && capabilities.MaxCopyCount >= lavoroDiStampa.param.numCopie)
                                {
                                    dialog.PrintTicket.CopyCount = lavoroDiStampa.param.numCopie;
                                }
                                else
                                {
                                    cicliStampa = lavoroDiStampa.param.numCopie;
                                }
                            }

                            //
                            // ----- Preparo la realizzazione grafica da mandare in output
                            //

                            // Ora creo il documento che andrò a stampare.
                            // L'uso di un FixedDocument, mi permetterà di interagire con misure, dimensioni e margini
                            FixedDocument document = new FixedDocument();
                            document.DocumentPaginator.PageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);


                            // Creo una pagina della grandezza massima
                            FixedPage page1 = new FixedPage();
                            page1.Width               = document.DocumentPaginator.PageSize.Width;
                            page1.Height              = document.DocumentPaginator.PageSize.Height;
                            page1.VerticalAlignment   = VerticalAlignment.Center;
                            page1.HorizontalAlignment = HorizontalAlignment.Center;


                            // Per fare in modo che l'immagine venga centrata bene automaticamente, e non venga tagliata solo da una parte ma nel centro,
                            // non devo mettere le dimensioni al componente Image, ma devo creare
                            // una Grid più esterna con le dimensioni precise.
                            Grid grid = new Grid();
                            grid.Height = page1.Height;
                            grid.Width  = page1.Width;


                            // Creo una immagine che contiene la bitmap da stampare
                            Image image = new Image();
                            //						image.BeginInit();
                            image.VerticalAlignment   = VerticalAlignment.Center;
                            image.HorizontalAlignment = HorizontalAlignment.Center;

                            //						BitmapSource clone = bmp.Clone();
                            //						clone.Freeze();
                            image.Source = bmp;

                            if (_lavoroDiStampa.param.autoZoomNoBordiBianchi)
                            {
                                image.Stretch = Stretch.UniformToFill;
                            }
                            else
                            {
                                image.Stretch = Stretch.Uniform;
                            }
                            image.StretchDirection = StretchDirection.Both;

                            //						image.EndInit();

                            grid.Children.Add(image);
                            page1.Children.Add(grid);

                            //
                            eventualiStampigli(page1, _lavoroDiStampa);


                            // add the page to the document
                            PageContent page1Content = new PageContent();
                            page1Content.Child = page1;
                            document.Pages.Add(page1Content);

                            //
                            // ----- STAMPA per davvero
                            //
                            for (int ciclo = 0; ciclo < cicliStampa; ciclo++)
                            {
                                dialog.PrintDocument(document.DocumentPaginator, titolo.ToString());

                                _esito = EsitoStampa.Ok;
                            }
                            _giornale.Debug("Stampa completata");

                            // Per cercare di liberare memoria più possibile svuoto le pagine  forzatamente a mano.
                            // Pare che il GC non riesce a pulire.
                            foreach (var fixedPage in document.Pages.Select(pageContent => pageContent.Child))
                            {
                                fixedPage.Children.Clear();
                            }
                        }         // using printqueue
                    }             // using printserver
                }                 // using iimagine
            } catch (Exception ee) {
                _esito = EsitoStampa.Errore;
                _giornale.Error("Stampa fallita", ee);
            } finally {
                // Rilascio le immagini idratate altrimenti in loop vado in outOfMemory
                AiutanteFoto.disposeImmagini(_lavoroDiStampa.fotografia, IdrataTarget.Risultante);
                AiutanteFoto.disposeImmagini(_lavoroDiStampa.fotografia, IdrataTarget.Originale);

                CoreUtil.abraCadabra();                   //   :-)
            }


            _giornale.Info("Completato lavoro di stampa. Esito = " + _esito + " lavoro = " + lavoroDiStampa.ToString());
            return(_esito);
        }
Пример #22
0
        public void Print()
        {
            if (!(Document is FlowDocument))
            {
                throw new Exception("Document is not a FlowDocument");
            }
            FlowDocument flow    = (FlowDocument)Document;
            PrintDialog  pDialog = new PrintDialog();

            pDialog.PageRangeSelection   = PageRangeSelection.AllPages;
            pDialog.UserPageRangeEnabled = true;
            PrintQueue pq = printService.GetPrintQueue();

            if (pq != null)
            {
                // forget if this does anything useful, other than select the chosen printer. Duplex doesn't work.
                PrintTicket       ticket  = pq.DefaultPrintTicket;
                PrintCapabilities capable = pq.GetPrintCapabilities();
                if (capable.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge))
                {
                    ticket.Duplexing = Duplexing.TwoSidedLongEdge;
                }
                ticket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
                if (Settings != null)
                {
                    if (Settings.ToString().Contains("landscape"))
                    {
                        ticket.PageOrientation = PageOrientation.Landscape;
                    }
                }
                if (Settings is PimpedPaginator.Definition)
                {
                    if (((PimpedPaginator.Definition)Settings).Landscape)
                    {
                        ticket.PageOrientation = PageOrientation.Landscape;
                    }
                }

                pDialog.PrintQueue  = pq;
                pDialog.PrintTicket = ticket;
            }
            // Display the dialog. This returns true if the user presses the Print button.
            Nullable <Boolean> print = pDialog.ShowDialog();

            if (print == true)
            {
                //DocumentPaginator paginator = ((IDocumentPaginatorSource)flow).DocumentPaginator;
                //paginator.PageSize = new Size(1122, 794);
                //paginator.PageSize = new Size(794, 1122);

                PimpedPaginator.Definition def = new PimpedPaginator.Definition();
                if (Settings is PimpedPaginator.Definition)
                {
                    def = (PimpedPaginator.Definition)Settings;
                }
                if (pDialog.PrintTicket.PageOrientation == PageOrientation.Landscape)
                {
                    def.PageSize = new Size(pDialog.PrintTicket.PageMediaSize.Height.Value, pDialog.PrintTicket.PageMediaSize.Width.Value);
                }
                else
                {
                    def.PageSize = new Size(pDialog.PrintTicket.PageMediaSize.Width.Value, pDialog.PrintTicket.PageMediaSize.Height.Value);
                }

                PimpedPaginator paginator = new PimpedPaginator(flow, def);

                pDialog.PrintDocument(paginator, flow.Name);
            }

            /*
             * System.Windows.Xps.XpsDocumentWriter docWriter = System.Printing.PrintQueue.CreateXpsDocumentWriter(pq);
             * System.Printing.PrintTicket ticket = pq.DefaultPrintTicket;
             * PrintCapabilities capable = pq.GetPrintCapabilities();
             * if (capable.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge))
             *  ticket.Duplexing = Duplexing.TwoSidedLongEdge;
             * ticket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
             * if (Settings != null)
             * {
             *  if (Settings.ToString().Contains("landscape")) { ticket.PageOrientation = PageOrientation.Landscape; }
             * }
             *
             * if (docWriter != null)
             * {
             *  DocumentPaginator paginator = ((IDocumentPaginatorSource)flow).DocumentPaginator;
             *  // Change the PageSize and PagePadding for the document to match the CanvasSize for the printer device.
             *  //paginator.PageSize = new Size(1122, 794);
             *  //paginator.PageSize = new Size(794, 1122);
             *  Thickness t = new Thickness(32, 30, 10, 10);  // copy.PagePadding;
             *  flow.PagePadding = new Thickness(t.Left,t.Top,t.Right,t.Bottom);
             *  flow.ColumnWidth = double.PositiveInfinity;
             *  //copy.PageWidth = 528; // allow the page to be the natural with of the output device
             *
             *  // Send content to the printer.
             *  docWriter.Write(paginator, ticket);
             *  dialog.ShowTaskDialog("Printing complete", "Printed to " + pq.Name, "");
             * }
             */
        }
Пример #23
0
        public MokaPrinter GetPrinterCapabilities(string PrinterName)
        {
            MokaPrinter       thisPrinter     = new MokaPrinter();
            PrintServer       thisPrintServer = new PrintServer();
            PrintQueue        thisPrintQueue  = new PrintQueue(thisPrintServer, PrinterName);
            PrintCapabilities theCapabilities = thisPrintQueue.GetPrintCapabilities();
            StringBuilder     Caps            = new StringBuilder();

            thisPrinter.Name = PrinterName;

            Caps.Clear();
            foreach (PageOrientation cap in theCapabilities.PageOrientationCapability)
            {
                Caps.AppendFormat("{0}={1};", (int)cap, Enum.GetName(typeof(PageOrientation), cap));
            }
            thisPrinter.OrientationCapabilities = Caps.ToString();

            Caps.Clear();
            foreach (Collation cap in theCapabilities.CollationCapability)
            {
                Caps.AppendFormat("{0}={1};", (int)cap, Enum.GetName(typeof(Collation), cap));
            }
            thisPrinter.CollationCapabilities = Caps.ToString();

            Caps.Clear();
            foreach (Duplexing cap in theCapabilities.DuplexingCapability)
            {
                Caps.AppendFormat("{0}={1};", (int)cap, Enum.GetName(typeof(Duplexing), cap));
            }
            thisPrinter.DuplexingCapabilities = Caps.ToString();

            Caps.Clear();
            foreach (InputBin cap in theCapabilities.InputBinCapability)
            {
                Caps.AppendFormat("{0}={1};", (int)cap, Enum.GetName(typeof(InputBin), cap));
            }
            thisPrinter.InputBinCapabilities = Caps.ToString();

            Caps.Clear();
            foreach (OutputColor cap in theCapabilities.OutputColorCapability)
            {
                Caps.AppendFormat("{0}={1};", (int)cap, Enum.GetName(typeof(OutputColor), cap));
            }
            thisPrinter.OutputColorCapabilities = Caps.ToString();

            Caps.Clear();
            foreach (OutputQuality cap in theCapabilities.OutputQualityCapability)
            {
                Caps.AppendFormat("{0}={1};", (int)cap, Enum.GetName(typeof(OutputQuality), cap));
            }
            thisPrinter.OutputQualityCapabilities = Caps.ToString();

            Caps.Clear();
            foreach (Stapling cap in theCapabilities.StaplingCapability)
            {
                Caps.AppendFormat("{0}={1};", (int)cap, Enum.GetName(typeof(Stapling), cap));
            }
            thisPrinter.StaplingCapabilities = Caps.ToString();

            thisPrintQueue.Dispose();
            return(thisPrinter);
        }
Пример #24
0
        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            DocumentDescription doc = DocsList.SelectedItem as DocumentDescription;

            if (doc == null)
            {
                return;
            }
            if (DataGroups == null)
            {
                return;
            }


            PrintDialog pd = new PrintDialog();

            if (doc.PrintOrientation.ToLower() == "landscape")
            {
                pd.PrintTicket.PageOrientation = PageOrientation.Landscape;
            }
            else
            {
                pd.PrintTicket.PageOrientation = PageOrientation.Portrait;
            }
            pd.PrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
            if (pd.ShowDialog() ?? false)
            {
                if (doc.PrintOrientation.ToLower() == "landscape")
                {
                    pd.PrintTicket.PageOrientation = PageOrientation.Landscape;
                }
                else
                {
                    pd.PrintTicket.PageOrientation = PageOrientation.Portrait;
                }
                pd.PrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
                MessageBox.Show("Kérem helyezze be a nyomtatványt " + doc.PrintOrientation + " tájolással. \nHa kész, nyomja meg az OK gombot.", "Dokumentum tájolás", MessageBoxButton.OK, MessageBoxImage.Information);
                PrintQueue        pq  = pd.PrintQueue;
                PrintCapabilities pc  = pq.GetPrintCapabilities();
                DrawingVisual     vis = new DrawingVisual();
                DrawingContext    dc  = vis.RenderOpen();
                string            prn = pq.Name;
                PrinterSettings   ps;
                if (Printers.ContainsKey(prn))
                {
                    ps = Printers[prn];
                }
                else
                {
                    ps = Printers["Default"];
                }

                double stx  = ps.XOffset + (pc.OrientedPageMediaWidth ?? 870) / 2;
                double dsty = ps.YOffset + pc.PageImageableArea.OriginHeight;

                double defaultFontSize = 14;
                double mmphi           = 0.254;

                foreach (KeyValuePair <string, DataGroup> kvp in DataGroups)
                {
                    StringDataGroup sdg = kvp.Value as StringDataGroup;
                    if (sdg != null)
                    {
                        string        s   = sdg.TbString ?? "";
                        FormattedText ft  = new FormattedText(s, System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface(sdg.FontName), defaultFontSize * sdg.FontScale, new SolidColorBrush(Colors.Black));
                        double        sty = dsty - ft.Baseline;
                        dc.DrawText(ft, new Point(stx + sdg.PrintPosition.X / mmphi, sty + sdg.PrintPosition.Y / mmphi));//*/
                    }
                    CheckDataGroup cdg = kvp.Value as CheckDataGroup;
                    if (cdg != null)
                    {
                        if (cdg.Checked)
                        {
                            string        s   = cdg.CheckString ?? "X";
                            FormattedText ft  = new FormattedText(s, System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface(cdg.FontName), defaultFontSize * cdg.FontScale, new SolidColorBrush(Colors.Black));
                            double        sty = dsty - ft.Baseline;
                            dc.DrawText(ft, new Point(stx + cdg.PrintPosition.X / mmphi, sty + cdg.PrintPosition.Y / mmphi));//*/
                        }
                    }
                }


                dc.Close();

                pd.PrintVisual(vis, doc.Name);
            }
        }
Пример #25
0
        }// end:GetPrintTicketFromPrinter()

        public static double GetImagebleHight()
        {
            PrintCapabilities printCapabilites = pq.GetPrintCapabilities();

            return(printCapabilites.PageImageableArea.ExtentHeight);
        }
Пример #26
0
        //<SnippetUsingMergeAndValidate>
        /// <summary>
        /// Changes the user-default PrintTicket setting of the specified print queue.
        /// </summary>
        /// <param name="queue">the printer whose user-default PrintTicket setting needs to be changed</param>
        static private void ChangePrintTicketSetting(PrintQueue queue)
        {
            //
            // Obtain the printer's PrintCapabilities so we can determine whether or not
            // duplexing printing is supported by the printer.
            //
            PrintCapabilities printcap = queue.GetPrintCapabilities();

            //
            // The printer's duplexing capability is returned as a read-only collection of duplexing options
            // that can be supported by the printer. If the collection returned contains the duplexing
            // option we want to set, it means the duplexing option we want to set is supported by the printer,
            // so we can make the user-default PrintTicket setting change.
            //
            if (printcap.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge))
            {
                //
                // To change the user-default PrintTicket, we can first create a delta PrintTicket with
                // the new duplexing setting.
                //
                PrintTicket deltaTicket = new PrintTicket();
                deltaTicket.Duplexing = Duplexing.TwoSidedLongEdge;

                //
                // Then merge the delta PrintTicket onto the printer's current user-default PrintTicket,
                // and validate the merged PrintTicket to get the new PrintTicket we want to set as the
                // printer's new user-default PrintTicket.
                //
                ValidationResult result = queue.MergeAndValidatePrintTicket(queue.UserPrintTicket, deltaTicket);

                //
                // The duplexing option we want to set could be constrained by other PrintTicket settings
                // or device settings. We can check the validated merged PrintTicket to see whether the
                // the validation process has kept the duplexing option we want to set unchanged.
                //
                if (result.ValidatedPrintTicket.Duplexing == Duplexing.TwoSidedLongEdge)
                {
                    //
                    // Set the printer's user-default PrintTicket and commit the set operation.
                    //
                    queue.UserPrintTicket = result.ValidatedPrintTicket;
                    queue.Commit();
                    Console.WriteLine("PrintTicket new duplexing setting is set on '{0}'.", queue.FullName);
                }
                else
                {
                    //
                    // The duplexing option we want to set has been changed by the validation process
                    // when it was resolving setting constraints.
                    //
                    Console.WriteLine("PrintTicket new duplexing setting is constrained on '{0}'.", queue.FullName);
                }
            }
            else
            {
                //
                // If the printer doesn't support the duplexing option we want to set, skip it.
                //
                Console.WriteLine("PrintTicket new duplexing setting is not supported on '{0}'.", queue.FullName);
            }
        }
Пример #27
0
        private void printImage(FileInfo source, PrintQueue queue, PrintTicket ticket, System.Windows.Controls.PrintDialog dialog)
        {
            if (source == null || queue == null || ticket == null || dialog == null)
            {
                return;
            }

            // Code below is adapted from https://stackoverflow.com/questions/5314369/photo-printing-in-c-sharp

            // Pasted code below.
            PrintCapabilities capabilities = queue.GetPrintCapabilities();
            Size pageSize            = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
            Size printableSize       = new Size();
            var  imageableArea       = ticket.PageMediaSize;
            var  borderlessSupported = ticket.PageBorderless;
            var  dpi = ticket.PageResolution;
            // For iX6820 set to borderless 4x6 photo preset,
            // imageableArea = ~8x10.5 @ 96 DPI
            // borderlessSupported = None
            // dpi = 600x600
            // Huh???

            // Question: do I simply need to draw a 4x6 at proper resolution and it'll print it correctly? I think that's possible.


            // Console.WriteLine();

            /*
             * e.Graphics.DrawImage(nextImage, e.PageSettings.PrintableArea.X - e.PageSettings.HardMarginX, e.PageSettings.PrintableArea.Y - e.PageSettings.HardMarginY, e.PageSettings.Landscape ? e.PageSettings.PrintableArea.Height : e.PageSettings.PrintableArea.Width, e.PageSettings.Landscape ? e.PageSettings.PrintableArea.Width : e.PageSettings.PrintableArea.Height);
             *
             * DrawingVisual drawVisual = new DrawingVisual();
             * ImageBrush imageBrush = new ImageBrush();
             * imageBrush.ImageSource = new BitmapImage(aUri);
             * imageBrush.Stretch = Stretch.Fill;
             * imageBrush.TileMode = TileMode.None;
             * imageBrush.AlignmentX = AlignmentX.Center;
             * imageBrush.AlignmentY = AlignmentY.Center;
             * if (imageBrush.ImageSource.Width > imageBrush.ImageSource.Height)
             *  printableSize = new Size(768, 576); //8x6
             * else printableSize = new Size(576, 768); //6x8
             * double xcor = 0; double ycor = 0;
             * if (imageBrush.ImageSource.Width > imageBrush.ImageSource.Height)
             * {
             *  if ((pageSize.Width - printableSize.Height) > 0)
             *      xcor = (pageSize.Width - printableSize.Height) / 2;
             *  if ((pageSize.Height - printableSize.Width) > 0)
             *      ycor = (pageSize.Height - printableSize.Width) / 2;
             * }
             * else
             * {
             *  if ((pageSize.Width - printableSize.Width) > 0)
             *      xcor = (pageSize.Width - printableSize.Width) / 2;
             *  if ((pageSize.Height - printableSize.Height) > 0)
             *      ycor = (pageSize.Height - printableSize.Height) / 2;
             * }
             * using (DrawingContext drawingContext = drawVisual.RenderOpen())
             * {
             *  if (imageBrush.ImageSource.Width > imageBrush.ImageSource.Height)
             *  {
             *      drawingContext.PushTransform(new RotateTransform(90, printableSize.Width / 2, printableSize.Height / 2));
             *  }
             *  drawingContext.DrawRectangle(imageBrush, null, new Rect(xcor, ycor, printableSize.Width, printableSize.Height));
             * }
             * SelectedPrinter.PrintVisual(drawVisual, "Print");
             */
        }
Пример #28
0
        /**
         * Attenzione:
         * questo metodo deve ritornare l'esito della stampa, quindi non deve essere asincrono.
         * Deve essere sicronizzato
         */
        public EsitoStampa esegui(LavoroDiStampa lavoroDiStampa)
        {
            LavoroDiStampaTessera _lavoroDiStampa = lavoroDiStampa as LavoroDiStampaTessera;

            _giornale.Debug("Sto per avviare il lavoro di stampa: " + lavoroDiStampa.ToString());

            _conta++;

            try {
                var         match = Regex.Match(lavoroDiStampa.param.nomeStampante, @"(?<machine>\\\\.*?)\\(?<queue>.*)");
                PrintServer ps1   = null;
                if (match.Success)
                {
                    // Come print-server uso il server di rete
                    ps1 = new PrintServer(match.Groups["machine"].Value);
                }
                else
                {
                    // Come print-server uso me stesso
                    ps1 = new PrintServer();
                }
                using ( ps1) {
                    PrintQueue coda = null;
                    if (match.Success)
                    {
                        coda = ps1.GetPrintQueue(match.Groups["queue"].Value);
                    }
                    else
                    {
                        coda = ps1.GetPrintQueue(lavoroDiStampa.param.nomeStampante);
                    }

                    // Ricavo la coda di stampa (cioè la stampante) e le sue capacità.
                    using (coda ) {
                        PrintCapabilities capabilities = null;
                        try {
                            capabilities = coda.GetPrintCapabilities();
                        } catch (Exception) {
                            // Le stmpanti shinko non supportano
                        }

                        // Imposto la stampante (così che mi carica le impostazioni)
                        PrintDialog dialog = new PrintDialog();
                        dialog.PrintQueue = coda;

                        Size areaStampabile = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);

                        // Imposto qualche attributo della stampa
                        bool piuRealistaDelRe = true;
                        if (piuRealistaDelRe)                            // Meglio non essere più realisti del re.
                        {
                            dialog.PrintTicket.OutputQuality       = OutputQuality.Photographic;
                            dialog.PrintTicket.PhotoPrintingIntent = PhotoPrintingIntent.PhotoBest;
                        }

                        // Compongo il titolo della stampa che comparirà nella descrizione della riga nello spooler di windows
                        String titolo = "Foto Tessera";


                        // Eventuale rotazione dell'orientamento dell'area di stampa
                        // Devo decidere in anticipo se la stampante va girata. Dopo che ho chiamato Print non si può più fare !!!
                        bool _ruotareStampante = false;

                        if (_ruotareStampante)
                        {
                            if (capabilities != null && capabilities.PageOrientationCapability.Contains(PageOrientation.Landscape) && capabilities.PageOrientationCapability.Contains(PageOrientation.Portrait))
                            {
                                // tutto ok
                                dialog.PrintTicket.PageOrientation = (dialog.PrintTicket.PageOrientation == PageOrientation.Landscape ? PageOrientation.Portrait : PageOrientation.Landscape);
                            }
                            else
                            {
                                _giornale.Warn("La stampante " + lavoroDiStampa.param.nomeStampante + " non accetta cambio orientamento landscape/portrait");
                            }

                            // Quando giro la stampante, non mi si girano anche le dimensioni. Ci penso da solo.
                            areaStampabile = ProiettoreArea.ruota(areaStampabile);
                        }

                        //
                        // ----- gestisco il numero di copie
                        //
                        int cicliStampa = 1;
                        if (lavoroDiStampa.param.numCopie > 1)
                        {
                            // Se la stampante gestisce le copie multiple, faccio un invio solo.
                            if (capabilities != null && capabilities.MaxCopyCount >= lavoroDiStampa.param.numCopie)
                            {
                                dialog.PrintTicket.CopyCount = lavoroDiStampa.param.numCopie;
                            }
                            else
                            {
                                cicliStampa = lavoroDiStampa.param.numCopie;
                            }
                        }


                        // Ora creo il documento che andrò a stampare.
                        using (TesseraDocPaginator documentPaginator = new TesseraDocPaginator(_lavoroDiStampa, areaStampabile)) {
                            //
                            // ----- STAMPA per davvero
                            //
                            for (int ciclo = 0; ciclo < cicliStampa; ciclo++)
                            {
                                dialog.PrintDocument(documentPaginator, titolo);
                                _esito = EsitoStampa.Ok;
                            }

                            _giornale.Debug("Stampa tessera completata");
                        }
                    }
                }
            } catch (Exception ee) {
                _esito = EsitoStampa.Errore;
                _giornale.Error("Stampa tessera fallita", ee);
            }

            _giornale.Info("Completato lavoro di stampa. Esito = " + _esito + " lavoro = " + lavoroDiStampa.ToString());
            return(_esito);
        }