async Task <byte[]> ITableauVisualServices.DownloadPdfAsync(DownloadPdfOptions options) { var handler = new HttpClientHandler { CookieContainer = options.Cookies, UseCookies = true }; using (var downloadPdfClient = new HttpClient(handler)) { downloadPdfClient.DefaultRequestHeaders.Referrer = options.ReferrerUri; downloadPdfClient.DefaultRequestHeaders.TryAddWithoutValidation( "Upgrade-Insecure-Requests", "1"); var response = await downloadPdfClient.GetAsync( new Uri( $"{TableauSignInOptions.Url}/vizql/w/{options.WorkbookName}/v/{options.ViewName}/tempfile/sessions/{options.SessionId}/?key={options.TempFileKey}&keepfile=yes&attachment=yes&download=true")); var pdfBytes = await response.Content.ReadAsByteArrayAsync(); return(pdfBytes); } }
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); }