/// <summary>
        /// Gets the serialized page settings for printer
        /// </summary>
        /// <param name="pageSettingsOfPrinter">The page settings that will send to printer</param>
        /// <returns>Returns the serialized page string</returns>
        private string GetSerializedPageSettingsOfPrinter(PageSettings pageSettingsOfPrinter)
        {
            string pageSettingsStringForPrinter = PageSettingsHelper.SerializePageSettings(pageSettingsOfPrinter);

            if (string.IsNullOrEmpty(pageSettingsStringForPrinter))
            {
                throw new ArgumentNullException(Resources.NoPageSettings);
            }

            return(pageSettingsStringForPrinter);
        }
        private string GetPrinterPath(IDocumentContract document, DocumentContractType documentContractType)
        {
            switch (documentContractType)
            {
            case DocumentContractType.Metafile:
                return(PageSettingsHelper.PrinterNameFromPageSettings(document.Settings));

            case DocumentContractType.Pdf:
                return(PageSettingsHelper.PrinterNameFromPageSettings(document.Settings));

            case DocumentContractType.Zebra:
                return(document.Settings);

            default:
                throw new ArgumentException("Unsupported value", nameof(documentContractType));
            }
        }
        /// <summary>
        /// Gets the default page settings object if there is any exception condition
        /// </summary>
        /// <param name="pageSettingString">The page settings string object</param>
        /// <returns>Returns the page settings object</returns>
        private PageSettings GetDefaultPageSettings(string pageSettingString)
        {
            // this should not be the case ever, still puttinga  safety net, so that printing doesn't stop and it prints to
            // default printer.
            if (string.IsNullOrEmpty(pageSettingString))
            {
                throw new ArgumentNullException(Resources.PageSettingsNotNull);
            }

            PageSettings pageSettingsOfPrinter = null;

            // Xml Document holding the page settings user has set
            var textReader = new StringReader(pageSettingString);

            var readerSettings = new XmlReaderSettings
            {
                DtdProcessing = DtdProcessing.Prohibit,
                XmlResolver   = null
            };

            using (XmlReader xmlReader = XmlReader.Create(textReader, readerSettings))
            {
                var pageSettingSetByUser = new XmlDocument
                {
                    XmlResolver = null
                };

                pageSettingSetByUser.Load(xmlReader);
                var pageSettingsRootNode = pageSettingSetByUser.DocumentElement;

                pageSettingsOfPrinter = new PageSettings();
                var printerName = PageSettingsHelper.GetPrinterNameFromPageSettings(pageSettingsRootNode);

                if (string.IsNullOrEmpty(printerName))
                {
                    throw new ArgumentException(Resources.PrinterNameMustNotBeNull);
                }

                pageSettingsOfPrinter.PrinterSettings.PrinterName = printerName;
                this.SetDefaultPageSettings(pageSettingsOfPrinter, pageSettingsRootNode);
            }

            return(pageSettingsOfPrinter);
        }
Example #4
0
        /// <summary>
        /// Prints the specified document.
        /// </summary>
        /// <param name="document">The document.</param>
        /// <returns>True if document was printed successfully.</returns>
        public bool Print(IDocumentContract document)
        {
            var documentContract = document as PdfDocumentContract ?? throw new ArgumentException("Invalid type", nameof(document));

            // Validate the document contract
            if (documentContract == null)
            {
                throw new ArgumentNullException(nameof(documentContract));
            }

            if (documentContract.Contents == null || documentContract.Contents.Length == 0)
            {
                throw new ArgumentNullException("documentContract.Contents");
            }

            if (string.IsNullOrWhiteSpace(documentContract.Settings))
            {
                throw new ArgumentNullException("documentContract.Settings");
            }

            // Get the printer from the settings
            var printer = PageSettingsHelper.PrinterNameFromPageSettings(documentContract.Settings);

            if (string.IsNullOrWhiteSpace(printer))
            {
                throw new ArgumentNullException("PageSettings.PrinterName");
            }

            // Get the pdf file to send to the printer
            var pdfFilePath = this.DocumentContractToTempFile(documentContract);

            try
            {
                this.AdobeReaderPrint(pdfFilePath, printer);
                return(true);
            }
            catch (Exception)
            {
                // TODO Error Log
                return(false);
            }
        }
        internal static string PrinterNameFromPageSettings(string pageSettings)
        {
            if (string.IsNullOrWhiteSpace(pageSettings))
            {
                return(null);
            }

            var value = string.Empty;

            TextReader textReader = null;

            try
            {
                textReader = new StringReader(pageSettings);
                var readerSettings = new XmlReaderSettings()
                {
                    DtdProcessing = DtdProcessing.Prohibit,
                    XmlResolver   = null
                };

                using (var xmlReader = XmlReader.Create(textReader, readerSettings))
                {
                    var doc = new XmlDocument
                    {
                        XmlResolver = null
                    };

                    doc.Load(xmlReader);

                    value = PageSettingsHelper.GetPrinterNameFromPageSettings(doc.DocumentElement);
                }
            }
            finally
            {
                if (textReader != null)
                {
                    textReader.Dispose();
                }
            }

            return(value);
        }
        /// <summary>
        /// Prints the specified document.
        /// </summary>
        /// <param name="document">The document.</param>
        public bool Print(IDocumentContract document)
        {
            var documentContract = document as MetafileDocumentContract ?? throw new ArgumentException("Invalide type", nameof(document));

            if (documentContract.PageSizes == null || documentContract.PageSizes.Count() == 0)
            {
                throw new ArgumentNullException(Resources.NoPageSizes);
            }

            var pageSizesList = documentContract.PageSizes.ToList();

            this.emfImages = MetafileHelper.GetEmfImagesToPePrinted(pageSizesList, documentContract.Contents);
            if (this.emfImages == null || this.emfImages.Count == 0)
            {
                // Issue an instrumentation error and return as there is nothing to print
                throw new ArgumentException(Resources.NoMetafilesToPrint);
            }

            // Now determine the printer settings necessary
            PageSettings pageSettingsOfPrinter = null;
            var          pageSettingsHelper    = new PageSettingsHelper();

            if (!string.IsNullOrWhiteSpace(documentContract.Settings))
            {
                pageSettingsHelper.IsLandscapeSetOnReportDesign = this.emfImages[0].Height < this.emfImages[0].Width;

                try
                {
                    pageSettingsOfPrinter = pageSettingsHelper.ProcessPageSettings(documentContract.Settings);
                }
                catch (Exception)
                {
                    // TODO Error log Resources.UnableToInitializePrinterSettings
                    return(false);
                }
            }

            // PageSettings returned after processing should not be null. Throw if it is.
            if (pageSettingsOfPrinter == null)
            {
                throw new ArgumentNullException(Resources.NoPageSettings);
            }

            // Send the print job to printer with the pagesettings obtained
            int retryCount = 1;

            try
            {
                while (retryCount <= Constants.MaximumRetry)
                {
                    try
                    {
                        this.currentPageNumber = 0;
                        using (var printDocument = new PrintDocument())
                        {
                            printDocument.DocumentName = documentContract.Name;

                            printDocument.DefaultPageSettings = pageSettingsOfPrinter;
                            printDocument.PrinterSettings     = pageSettingsOfPrinter.PrinterSettings;
                            printDocument.PrintPage          += this.PrintEachPage;

                            // use standard print controller instead of print controller with status dialog.
                            printDocument.PrintController = new StandardPrintController();
                            printDocument.Print();
                        }

                        break;
                    }
                    catch (InvalidPrinterException)
                    {
                        if (retryCount < Constants.MaximumRetry)
                        {
                            retryCount++;
                        }
                        else
                        {
                            string message = string.Format(CultureInfo.InvariantCulture, Resources.InvalidPrinter, pageSettingsOfPrinter.PrinterSettings.PrinterName);
                            //TODO Error log
                            return(false);
                        }
                    }
                }
            }
            finally
            {
                if (this.emfImages != null && this.emfImages.Count > 0)
                {
                    foreach (var page in this.emfImages)
                    {
                        if (page != null)
                        {
                            page.Dispose();
                        }
                    }
                }
            }

            return(true);
        }
        private PageSettings ProcessPageSettingsInternal(string pageSettingString)
        {
            if (string.IsNullOrEmpty(pageSettingString))
            {
                throw new ArgumentNullException("PageSettings set by user cannot be empty");
            }

            PageSettings pageSettingsOfPrinter = null;
            TextReader   textReader            = null;

            try
            {
                // Xml Document holding the page settings user has set
                textReader = new StringReader(pageSettingString);

                var readerSettings = new XmlReaderSettings
                {
                    DtdProcessing = DtdProcessing.Prohibit,
                    XmlResolver   = null
                };

                using (var xmlReader = XmlReader.Create(textReader, readerSettings))
                {
                    XmlDocument pageSettingSetByUser = new XmlDocument
                    {
                        XmlResolver = null
                    };

                    pageSettingSetByUser.Load(xmlReader);

                    var pageSettingsRootNode = pageSettingSetByUser.DocumentElement;

                    // Gets the non empty nodes, i.e. nodes which actually user has set a value
                    var nonEmptyNodes = this.GetNonEmptyNodes(pageSettingsRootNode);

                    // Gets the printer name from the same xml. If printer name is not set or not valid , no need to go further
                    var printerName = PageSettingsHelper.GetPrinterNameFromPageSettings(pageSettingsRootNode);

                    if (string.IsNullOrWhiteSpace(printerName))
                    {
                        throw new ArgumentNullException(Resources.NoPrinterName);
                    }

                    // Get the default page settings of the printer and sets the printer name and orientation
                    pageSettingsOfPrinter = new PageSettings();
                    pageSettingsOfPrinter.PrinterSettings.PrintFileName = Constants.Empty;
                    pageSettingsOfPrinter.PrinterSettings.PrinterName   = printerName;
                    pageSettingsOfPrinter.Landscape = this.IsLandscape(pageSettingsRootNode);

                    // serialize the pagesettings
                    var pageSettingsStringForPrinter = this.GetSerializedPageSettingsOfPrinter(pageSettingsOfPrinter);

                    if (string.IsNullOrEmpty(pageSettingsStringForPrinter))
                    {
                        throw new ArgumentNullException("PageSettings set by user cannot be empty");
                    }

                    // Copy the pageSettings from user set to one sent to printer
                    var pageSettingsTobeSet = this.TransferPageSettingsSetByUserToPrinter(pageSettingsStringForPrinter, nonEmptyNodes);

                    // finally deserialize it and give it back
                    pageSettingsOfPrinter = (PageSettings)XmlHelper.XmlDeserialize(typeof(PageSettings), pageSettingsTobeSet, string.Empty);
                    if (pageSettingsOfPrinter == null)
                    {
                        throw new ArgumentNullException(Resources.NoPageSettings);
                    }
                }
            }
            finally
            {
                if (textReader != null)
                {
                    textReader.Dispose();
                }
            }

            return(pageSettingsOfPrinter);
        }