/// <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); }
/// <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); }