public IActionResult CreateScheduledReport( [FromForm] CreateScheduledReportViewModel createScheduledReportViewModel) { try { var tableauReportViewModel = createScheduledReportViewModel.ReportViewModel; var createPdfOptions = new CreatePdfOptions(tableauReportViewModel.WorkbookName, tableauReportViewModel.ViewName, tableauReportViewModel.WorksheetName); var cronString = createScheduledReportViewModel.RecurrenceSettings.ConvertToCronString(); var recurringJobId = RecurringJobManager.Add(Hangfire.Common.Job.FromExpression <ITenantJobs>(x => x.ScheduleTableauPdfDownload(createPdfOptions)), cronString); var campaignName = "Scheduled Report: " + tableauReportViewModel.ViewName; var communication = new Communication { CampaignName = campaignName.ToTitleFriendlyString(), CommunicationTitle = tableauReportViewModel.ViewName.ToTitleFriendlyString(), CommunicationSettings = new CommunicationSettings { Recurrence = createScheduledReportViewModel.RecurrenceSettings, RecurringJobId = recurringJobId, ReportId = createScheduledReportViewModel.ReportViewModel.Id.ToString(), ReportName = tableauReportViewModel.ViewName } }; Rdb.Communications.Add(communication); Rdb.SaveChanges(); return(RedirectToAction(ActionNames.ScheduledReports)); } catch (Exception e) { Console.WriteLine(e); throw; } }
public async Task WhenGivenJsonObjectDownloadPdf() { var httpClientOptions = ConfigurationHelpers.CreateOptions(HttpClientOptions); var httpClientFactory = new HttpClientFactory(httpClientOptions); var trustedTicketGetter = new TrustedTicketGetter(Options, TableauAdminCredentials, TableauTenantFinder, httpClientFactory); var testService = new TableauVisualServices(trustedTicketGetter, Options, Logger, httpClientFactory) as ITableauVisualServices; var testGetPdfOptions = new CreatePdfOptions("AverageRiskMap", "AverageRiskDashboard", "Average Risk Dashboard"); var downloadPdfOptions = await testService.CreatePdfAsync(testGetPdfOptions); Assert.IsNotNull(downloadPdfOptions); var downloadPdfJsonObject = JsonConvert.SerializeObject(downloadPdfOptions); var deserializedPdfOptions = JsonConvert.DeserializeObject <DownloadPdfOptions>(downloadPdfJsonObject); var pdfBytes = await testService.DownloadPdfAsync(deserializedPdfOptions); Assert.IsNotNull(pdfBytes); var tempPath = Path.GetTempPath() + @"TableauPDFTestDownload"; Directory.CreateDirectory(tempPath); //Doesn't create if it already exists var dateTime = DateTime.UtcNow.ToString().RemoveSpecialCharacters(); var tempFilePath = tempPath + $@"\test-{dateTime}.pdf"; File.WriteAllBytes(tempFilePath, pdfBytes); }
public async Task <IActionResult> Post([FromBody] CreatePdfOptions options) { try { Log.Debug("{controller} post", GetType().Name); await Task.CompletedTask; if (options == null) { throw new ArgumentNullException("options"); } if (string.IsNullOrEmpty(options.Html)) { throw new ArgumentNullException("html"); } var pdfBytes = BuildPdf(options.Html); return(File(pdfBytes, "application/pdf")); } catch (Exception ex) { ex.Data.Add("html", options?.Html); Log.Error(ex, ex.Message); return(this.ServerError(ex)); } }
public async Task WhenSignedInCreatePdf() { var httpClientOptions = ConfigurationHelpers.CreateOptions(HttpClientOptions); var httpClientFactory = new HttpClientFactory(httpClientOptions); var trustedTicketGetter = new TrustedTicketGetter(Options, TableauAdminCredentials, TableauTenantFinder, httpClientFactory); var testService = new TableauVisualServices(trustedTicketGetter, Options, Logger, httpClientFactory) as ITableauVisualServices; var testGetPdfOptions = new CreatePdfOptions("AverageRiskMap", "AverageRiskDashboard", "Average Risk Dashboard"); var downloadPdfOptions = await testService.CreatePdfAsync(testGetPdfOptions); Assert.IsNotNull(downloadPdfOptions); }
public IActionResult DownloadReport(string id, string anchorName) { var tableauReportViewModel = GetReportViewModel(id); if (tableauReportViewModel == null) { return(RedirectToAction(ActionNames.Index)); } var createPdfOptions = new CreatePdfOptions(tableauReportViewModel.WorkbookName, tableauReportViewModel.ViewName, tableauReportViewModel.WorksheetName); QueueReportDownload(createPdfOptions); Logger.Information("{@EventType} {@ReportId}", EventType.LoggingEventTypes.DownloadedReport.ToString(), tableauReportViewModel.Id.ToString()); return(RedirectToAction(ActionNames.DownloadedReports)); }
void ITenantJobs.CreateTableauPdf(CreatePdfOptions options) { var downloadOptions = TableauVisualService.CreatePdfAsync(options).ExecuteSynchronously(); PostResult(downloadOptions); }
void ITenantJobs.ScheduleTableauPdfDownload(CreatePdfOptions options) { var jobId = InnerBackgroundJobClient.Enqueue <ITenantJobs>(z => z.CreateTableauPdf(options)); InnerBackgroundJobClient.ContinueWith <ITenantJobs>(jobId, y => y.DownloadTableauPdfContinuationJobAsync()); }
private void QueueReportDownload(CreatePdfOptions options) { var jobId = Backgrounder.Enqueue <ITenantJobs>(z => z.CreateTableauPdf(options)); Backgrounder.ContinueWith <ITenantJobs>(jobId, y => y.DownloadTableauPdfContinuationJobAsync()); }
async Task <DownloadPdfOptions> ITableauVisualServices.CreatePdfAsync(CreatePdfOptions options) { Requires.NonNull(options.WorkbookName, nameof(options.WorkbookName)); Requires.NonNull(options.WorksheetName, nameof(options.WorksheetName)); Requires.NonNull(options.ViewName, nameof(options.ViewName)); var token = (await TrustedTicketGetter.AuthorizeAsync()).Token; var handler = new HttpClientHandler { CookieContainer = new CookieContainer(), UseCookies = true }; using (var embedClient = new HttpClient(handler)) { var uri = new Uri( $"{TableauSignInOptions.Url}/trusted/{token}/views/{options.WorkbookName}/{options.ViewName}?:size=1610,31&:embed=y&:showVizHome=n&:jsdebug=y&:bootstrapWhenNotified=y&:tabs=n&:apiID=host0"); embedClient.DefaultRequestHeaders.TryAddWithoutValidation("User Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"); embedClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); embedClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate, sdch, br"); embedClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.8"); var response = await embedClient.GetAsync(uri); IEnumerable <string> values; if (response.Headers.TryGetValues("X-Session-Id", out values)) { var sessionId = values.First(); var clientEmbedResponseString = await response.Content.ReadAsStringAsync(); var currentWorkbookId = CurrentWorkbookIdExpr.GetGroupValue(clientEmbedResponseString); var currentViewId = CurrentViewIdExpr.GetGroupValue(clientEmbedResponseString); var sheetId = SheetIdExpr.GetGroupValue(clientEmbedResponseString) ?? options.WorksheetName; var lastUpdatedAt = LastUpdatedAtExpr.GetGroupValue(clientEmbedResponseString); using (var bootstrapClient = new HttpClient(handler)) { bootstrapClient.DefaultRequestHeaders.Referrer = uri; bootstrapClient.DefaultRequestHeaders.TryAddWithoutValidation("X-Tsi-Active-Tab", options.WorksheetName); var d = new Dictionary <string, string>(); var portSize = "{\"w\":{{pixelWidth}},\"h\":{{pixelHeight}}}"; portSize = portSize.Replace("{{pixelWidth}}", options.PixelWidth.ToString()); portSize = portSize.Replace("{{pixelHeight}}", options.PixelHeight.ToString()); d["worksheetPortSize"] = portSize; d["dashboardPortSize"] = portSize; d["clientDimension"] = portSize; d["isBrowserRendering"] = "true"; d["browserRenderingThreshold"] = "100"; d["formatDataValueLocally"] = "false"; d["clientNum"] = ""; d["devicePixelRatio"] = "2"; d["clientRenderPixelLimit"] = "25000000"; d["sheet_id"] = options.WorksheetName; d["showParams"] = "{\"revertType\":null,\"refresh\":false,\"checkpoint\":false,\"sheetName\":\"\",\"unknownParams\":\"\",\"layoutId\":\"\"}"; d["stickySessionKey"] = new StickySessionKey { lastUpdatedAt = lastUpdatedAt, viewId = currentViewId, workbookId = currentWorkbookId }.ToJson(); d["filterTileSize"] = "200"; d["workbookLocale"] = ""; d["locale"] = "en_US"; d["language"] = "en"; d["verboseMode"] = "true"; d[":session_feature_flags"] = "{}"; d["keychain_version"] = "1"; var content = new FormUrlEncodedContent(d); response = await bootstrapClient.PostAsync(new Uri($"{TableauSignInOptions.Url}/vizql/w/{options.WorkbookName}/v/{options.ViewName}/bootstrapSession/sessions/{sessionId}"), content); Stuff.Noop(response); using (var queuePdfClient = new HttpClient(handler)) { queuePdfClient.DefaultRequestHeaders.Referrer = uri; queuePdfClient.DefaultRequestHeaders.TryAddWithoutValidation("Origin", uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped)); queuePdfClient.DefaultRequestHeaders.Accept.Add( System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/javascript")); queuePdfClient.DefaultRequestHeaders.TryAddWithoutValidation( "X-Tsi-Supports-Accepted", "true"); queuePdfClient.DefaultRequestHeaders.TryAddWithoutValidation( "X-Tsi-Active-Tab", options.WorksheetName); queuePdfClient.DefaultRequestHeaders.TryAddWithoutValidation( "X-Requested-With", "XMLHttpRequest"); var pdfFormData = new MultipartContent("form-data"); var pdfParams = @"{""currentSheet"":""{{worksheetName}}"", ""exportLayoutOptions"":{""pageSizeOption"":""letter"",""pageOrientationOption"":""printer"",""pageScaleMode"":""auto"",""pageScalePercent"":100,""pageFitHorizontal"":1,""pageFitVertical"":1,""imageHeight"":0,""imageWidth"":0}, ""sheetOptions"":[{""sheet"":""{{worksheetName}}"",""isDashboard"":true,""isStory"":false,""namesOfSubsheets"":[],""isPublished"":true,""baseViewThumbLink"":""/thumb/views/{{workbookName}}/{{viewName}}"",""isSelected"":true, ""exportLayoutOptions"":{""pageSizeOption"":""letter"",""pageOrientationOption"":""printer"",""pageScaleMode"":""auto"",""pageScalePercent"":100,""pageFitHorizontal"":1,""pageFitVertical"":1,""imageHeight"":0,""imageWidth"":0}} ]}"; pdfParams = pdfParams.Replace(@"{{worksheetName}}", options.WorksheetName); pdfParams = pdfParams.Replace(@"{{workbookName}}", options.WorkbookName); pdfParams = pdfParams.Replace(@"{{viewName}}", options.ViewName); AddStringContent(pdfFormData, "pdfExport", pdfParams); response = await queuePdfClient.PostAsync(new Uri( $"{TableauSignInOptions.Url}/vizql/w/{options.WorkbookName}/v/{options.ViewName}/sessions/{sessionId}/commands/tabsrv/pdf-export-server"), pdfFormData); Stuff.Noop(response); var responseString = await response.Content.ReadAsStringAsync(); var tempFileKey = PdfTempFileKeyExpr.GetGroupValue(responseString); var downloadPdfOptions = new DownloadPdfOptions(options.WorkbookName, options.ViewName, sessionId, uri, tempFileKey, handler.CookieContainer.GetCookies(uri)); return(downloadPdfOptions); } } } } return(null); }