/// <summary>The internal print.</summary> /// <param name="automaticPrint">if set to <c>true</c> [automatic print].</param> private void InternalPrint(bool automaticPrint) { var data = this.GetData(this.config.PrintUrl); var printTemplateViewModel = JsonConvert.DeserializeObject<PrintTemplateViewModel>(data); if (printTemplateViewModel == null || printTemplateViewModel.EinsatzData == null) { return; } PrintQueue printQueue = null; try { printQueue = LocalPrintServer.GetDefaultPrintQueue(); if (printQueue == null) { // No printer exist, return null PrintTicket Logger.Info("No printer exists"); return; } // Get default PrintTicket from printer var printTicket = printQueue.DefaultPrintTicket; printTicket.CopyCount = automaticPrint ? this.config.NumberOfPagesOnEmergency : this.config.NumberOfPagesPerClick; var printCapabilites = printQueue.GetPrintCapabilities(); // Modify PrintTicket if (printCapabilites.PageMediaSizeCapability.Any(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4))) { printTicket.PageMediaSize = printCapabilites.PageMediaSizeCapability.First(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4)); } if (printCapabilites.PageOrientationCapability.Contains(PageOrientation.Portrait)) { printTicket.PageOrientation = PageOrientation.Portrait; } if (printCapabilites.PageBorderlessCapability.Contains(PageBorderless.Borderless)) { printTicket.PageBorderless = PageBorderless.Borderless; } if (printCapabilites.CollationCapability.Contains(Collation.Collated)) { printTicket.Collation = Collation.Collated; } var doc = new FixedDocument(); foreach (var emergencyData in printTemplateViewModel.EinsatzData) { var item = emergencyData; lock (this.printedMissionsLockObject) { if (automaticPrint && this.printedMissions.Any(x => x.EinsatzID.Equals(item.EinsatzID))) { continue; } var tempItem = this.printedMissions.FirstOrDefault(x => x.EinsatzID.Equals(item.EinsatzID)); if (tempItem != null && tempItem.PublicInstancePropertiesEqual( item, "Dispositionen", "MapUrl", "MapImage", "Area")) { tempItem.Dispositionen = item.Dispositionen; // Always update dispositions because of missing deep value comparison item = tempItem; Logger.DebugFormat( "Using cached version of emergency ID '{0}'", item.EinsatzID); } else { if (tempItem != null) { Logger.DebugFormat( "Removing emergency ID '{0}' from cache", tempItem.EinsatzID); this.printedMissions.Remove(tempItem); } Logger.DebugFormat("Adding emergency ID '{0}' to cache", item.EinsatzID); this.printedMissions.Add(item); } } Logger.DebugFormat( "Printing '{0}', # of copies={1}", item.EinsatzID, printTicket.CopyCount); if (string.IsNullOrWhiteSpace(item.MapUrl)) { var mapData = this.GetData( string.Format( "https://secure.florian10.info/ows/infoscreen/geo/staticmap.ashx?address={0}{1},%20{2}%20{3}", item.Strasse, string.IsNullOrWhiteSpace(item.Nummer1) ? string.Empty : "%20" + item.Nummer1, item.Plz, item.Ort)); if (!string.IsNullOrWhiteSpace(mapData)) { var mapUrl = mapData.Remove(mapData.Length - 2, 2) .Remove(0, 8) .Replace("&size=800x400&", "&size=640x640&scale=2&") .Replace("2.png", ".png") .Replace("&markers=icon:http://", "&markers=scale:2|icon:http://"); item.MapUrl = string.Format("{0}&maptype={1}", mapUrl, this.config.MapType.ToString().ToLowerInvariant()); var latLng = mapData.Split('&') .First(x => x.StartsWith("center=")) .Split(',') .Select(x => x.Replace("center=", string.Empty)) .ToList(); if (latLng.Count() >= 2) { var areaJson = this.GetData( string.Format( "https://secure.florian10.info/ows/infoscreen/geo/umkreis.ashx?lat={0}&lng={1}", latLng[0], latLng[1])); item.Area = JsonConvert.DeserializeObject<Area>(areaJson); } } } var fixedPage = new FixedPage(); var template = new PrintTemplate { DataContext = item }; if (printCapabilites.PageImageableArea != null) { template.Width = printCapabilites.PageImageableArea.ExtentWidth; template.Height = printCapabilites.PageImageableArea.ExtentHeight; FixedPage.SetLeft(template, printCapabilites.PageImageableArea.OriginWidth); FixedPage.SetTop(template, printCapabilites.PageImageableArea.OriginHeight); } fixedPage.Children.Add(template); var pageContent = new PageContent(); ((IAddChild)pageContent).AddChild(fixedPage); doc.Pages.Add(pageContent); } if (doc.Pages.Any()) { Logger.Debug("Printing now"); PrintQueue.CreateXpsDocumentWriter(printQueue).Write(doc, printTicket); } } finally { if (printQueue != null) { printQueue.Dispose(); } } }
/// <summary>The internal print.</summary> /// <param name="automaticPrint">if set to <c>true</c> [automatic print].</param> private void InternalPrint(bool automaticPrint) { var data = this.GetData(this.config.PrintUrl); var printTemplateViewModel = JsonConvert.DeserializeObject<PrintTemplateViewModel>(data); if (printTemplateViewModel?.EinsatzData == null) { return; } PrintQueue printQueue = null; try { printQueue = LocalPrintServer.GetDefaultPrintQueue(); if (printQueue == null) { // No printer exist, return null PrintTicket // ReSharper disable once InconsistentlySynchronizedField Logger.Info("No printer exists"); return; } // Get default PrintTicket from printer var printTicket = printQueue.DefaultPrintTicket; printTicket.CopyCount = automaticPrint ? this.config.NumberOfPagesOnEmergency : this.config.NumberOfPagesPerClick; var printCapabilites = printQueue.GetPrintCapabilities(); // Modify PrintTicket if (printCapabilites.PageMediaSizeCapability.Any(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4))) { printTicket.PageMediaSize = printCapabilites.PageMediaSizeCapability.First(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4)); } if (printCapabilites.PageOrientationCapability.Contains(PageOrientation.Portrait)) { printTicket.PageOrientation = PageOrientation.Portrait; } if (printCapabilites.PageBorderlessCapability.Contains(PageBorderless.Borderless)) { printTicket.PageBorderless = PageBorderless.Borderless; } if (printCapabilites.CollationCapability.Contains(Collation.Collated)) { printTicket.Collation = Collation.Collated; } var doc = new FixedDocument(); foreach (var emergencyData in printTemplateViewModel.EinsatzData) { var item = emergencyData; lock (this.printedMissionsLockObject) { if (automaticPrint && this.printedMissions.Any(x => x.EinsatzID.Equals(item.EinsatzID))) { continue; } var tempItem = this.printedMissions.FirstOrDefault(x => x.EinsatzID.Equals(item.EinsatzID)); if (tempItem != null && tempItem.PublicInstancePropertiesEqual( item, "Dispositionen", "MapUrl", "MapImage", "Area")) { tempItem.Dispositionen = item.Dispositionen; // Always update dispositions because of missing deep value comparison item = tempItem; Logger.DebugFormat( "Using cached version of emergency ID '{0}'", item.EinsatzID); } else { if (tempItem != null) { Logger.DebugFormat( "Removing emergency ID '{0}' from cache", tempItem.EinsatzID); this.printedMissions.Remove(tempItem); } Logger.DebugFormat("Adding emergency ID '{0}' to cache", item.EinsatzID); this.printedMissions.Add(item); } } // ReSharper disable once InconsistentlySynchronizedField Logger.DebugFormat( "Printing '{0}', # of copies={1}", item.EinsatzID, printTicket.CopyCount); if (string.IsNullOrWhiteSpace(item.MapUrl)) { // Google Static Maps Developer Guide: https://developers.google.com/maps/documentation/static-maps/intro // #if DEBUG // var greyMap = new StaticMapRequest(new List<Marker>(), new ImageSize(640, 640)); // greyMap.Style = new List<MapStyle> // { // new MapStyle // { // MapFeature = MapFeature.Landscape, // Saturation = -100, // Lightness = 65 // }, // new MapStyle // { // MapFeature = MapFeature.Poi, // Saturation = -100, // Lightness = 51, // Visibility = MapVisibility.Simplified // }, // new MapStyle // { // MapFeature = MapFeature.RoadHighway, // Saturation = -100, // Visibility = MapVisibility.Simplified // }, // new MapStyle // { // MapFeature = MapFeature.RoadArterial, // Saturation = -100, // Lightness = 30 // }, // new MapStyle // { // MapFeature = MapFeature.RoadLocal, // Saturation = -100, // Lightness = 40 // }, // new MapStyle // { // MapFeature = MapFeature.Transit, // Saturation = -100, // Visibility = MapVisibility.Simplified // }, // new MapStyle // { // MapFeature = // MapFeature.AdministrativeProvince, // Visibility = MapVisibility.Off // }, // new MapStyle // { // MapFeature = MapFeature.Water, // MapElement = MapElement.Labels, // Saturation = -100, // Lightness = -25 // }, // new MapStyle // { // MapFeature = MapFeature.Water, // MapElement = MapElement.Geometry, // Saturation = -97, // Lightness = -25, // HUE = Color.FromArgb(255, 255, 0) // } // }; // var engine = new StaticMapsEngine(); // var url = engine.GenerateStaticMapUrl(greyMap); // #endif var mapData = this.GetData( $"https://secure.florian10.info/ows/infoscreen/geo/staticmap.ashx?address={item.Strasse}{(string.IsNullOrWhiteSpace(item.Nummer1) ? string.Empty : "%20" + item.Nummer1)},%20{item.Plz}%20{item.Ort}"); if (!string.IsNullOrWhiteSpace(mapData)) { var mapUrl = mapData.Remove(mapData.Length - 2, 2) .Remove(0, 8) .Replace("&size=800x400&", "&size=640x640&scale=2&") .Replace("2.png", ".png") .Replace("&markers=icon:http://", "&markers=scale:2|icon:http://"); item.MapUrl = $"{mapUrl}&maptype={this.config.MapType.ToString().ToLowerInvariant()}"; var latLng = mapData.Split('&') .First(x => x.StartsWith("center=")) .Split(',') .Select(x => x.Replace("center=", string.Empty)) .ToList(); if (latLng.Count >= 2) { var areaJson = this.GetData( $"https://secure.florian10.info/ows/infoscreen/geo/umkreis.ashx?lat={latLng[0]}&lng={latLng[1]}"); item.Area = JsonConvert.DeserializeObject<Area>(areaJson); item.Area.PointLimit = this.config.MaxHydrants; } } } var fixedPage = new FixedPage(); var template = new PrintTemplate { DataContext = item }; if (printCapabilites.PageImageableArea != null) { template.Width = printCapabilites.PageImageableArea.ExtentWidth; template.Height = printCapabilites.PageImageableArea.ExtentHeight; FixedPage.SetLeft(template, printCapabilites.PageImageableArea.OriginWidth); FixedPage.SetTop(template, printCapabilites.PageImageableArea.OriginHeight); } fixedPage.Children.Add(template); var pageContent = new PageContent(); ((IAddChild)pageContent).AddChild(fixedPage); doc.Pages.Add(pageContent); } if (doc.Pages.Any()) { // ReSharper disable once InconsistentlySynchronizedField Logger.Debug("Printing now"); PrintQueue.CreateXpsDocumentWriter(printQueue).Write(doc, printTicket); } } finally { printQueue?.Dispose(); } }