Beispiel #1
0
        private PdfShot GetPdfDocument(Image fullPageImage, ShotOptions options, String title)
        {
            var magicImage = new MagickImage(fullPageImage.ToMemoryStream());

            magicImage.Strip();

            if (options.IsGrayscale)
            {
                magicImage.Grayscale(PixelIntensityMethod.Lightness);
                magicImage.Contrast();
            }

            var partsCount = Math.Ceiling((Decimal)magicImage.Height / options.StepHeight);

            partsCount = Math.Ceiling((magicImage.Height + options.OverlaySize * partsCount) / options.StepHeight);

            var pageImageParts = new List <Byte[]>();

            for (var i = 0; i < partsCount; i++)
            {
                var y      = i * options.StepHeight - i * options.OverlaySize;
                var images = magicImage.CropToTiles(new MagickGeometry(0,
                                                                       y,
                                                                       options.Width,
                                                                       options.StepHeight))
                             .ToList();
                pageImageParts.Add(images.First().ToByteArray());
            }

            var pdfBytes = _pdfCreator.CreateDocument(options.Width, options.StepHeight, pageImageParts);

            return(new PdfShot(pdfBytes, GetFileName(title)));
        }
Beispiel #2
0
        public async Task <ShotResult> ShotPdfAsync(ShotOptions options,
                                                    CancellationToken cancel = default)
        {
            var url = await TryGetMobileVersionAsync(options, cancel);

            var driver = new RemoteWebDriver(new Uri(_options.Host), new ChromeOptions());

            try
            {
                driver.Navigate().GoToUrl(url);
                var title = driver.Title;

                var fullPageImage = GetFullPageImage(driver, options);


                if (fullPageImage == null ||
                    cancel.IsCancellationRequested)
                {
                    return(null);
                }

                return(GetPdfDocument(fullPageImage, options, title));
            }
            finally
            {
                driver.Close();
                driver.Dispose();
            }
        }
Beispiel #3
0
        private async Task <String> TryGetMobileVersionAsync(ShotOptions options,
                                                             CancellationToken cancel = default)
        {
            if (!options.TryMobile)
            {
                return(options.Uri.OriginalString);
            }

            var uriBuilder = new UriBuilder(options.Uri);

            uriBuilder.Host = $"m.{options.Uri.Host}";
            var mobileUrl = uriBuilder.Uri.OriginalString;

            try
            {
                var client = _httpClientFactory.CreateClient();
                var result = await client.GetAsync(mobileUrl, cancel);

                return(result.IsSuccessStatusCode
                           ? mobileUrl
                           : options.Uri.OriginalString);
            }
            catch (Exception)
            {
                return(options.Uri.OriginalString);
            }
        }
Beispiel #4
0
        private Image GetFullPageImage(IWebDriver driver, ShotOptions options)
        {
            ResizeBrowser(driver,
                          options.Width + ScrollWidthOffset,
                          options.StepHeight + MenuHeightOffset);

            var jsExecutor = (IJavaScriptExecutor)driver;

            LoadAllPageHeight(jsExecutor);

            var pageSizes = GetWebPageSizes(jsExecutor);

            if (pageSizes.TotalWidth > pageSizes.ViewportWidth)
            {
                ResizeBrowser(driver,
                              options.Width + ScrollWidthOffset,
                              options.StepHeight + MenuHeightOffset + ScrollWidthOffset);
            }

            var rectangles = new List <Rectangle>();

            for (var yScroll = 0; yScroll < pageSizes.TotalHeight; yScroll += pageSizes.ViewportHeight)
            {
                var rectangleHeight = pageSizes.ViewportHeight;
                if (yScroll + pageSizes.ViewportHeight > pageSizes.TotalHeight)
                {
                    rectangleHeight = pageSizes.TotalHeight - yScroll;
                }

                var currRect = new Rectangle(0, yScroll, options.Width, rectangleHeight);
                rectangles.Add(currRect);
            }

            var takerScreenshot = (ITakesScreenshot)driver;
            var fullPageImage   = new Bitmap(options.Width, pageSizes.TotalHeight);
            var graphics        = Graphics.FromImage(fullPageImage);

            var yPosition = 0;

            for (var rectangleIndex = 0; rectangleIndex < rectangles.Count; rectangleIndex++)
            {
                jsExecutor.ExecuteScript($"window.scroll(0, {yPosition.ToString()})");

                if (rectangleIndex > 0 ||
                    options.HideOverlayElementsImmediate)
                {
                    HideFloatingElements(jsExecutor);
                }

                var rectangle       = rectangles[rectangleIndex];
                var screenshot      = takerScreenshot.GetScreenshot();
                var screenshotImage = ScreenshotToImage(screenshot);

                var sourceRectangle = new Rectangle(0,
                                                    pageSizes.ViewportHeight - rectangle.Height,
                                                    rectangle.Width,
                                                    rectangle.Height);

                graphics.DrawImage(screenshotImage, rectangle, sourceRectangle, GraphicsUnit.Pixel);

                yPosition = rectangle.Bottom;
            }

            return(fullPageImage);
        }
Beispiel #5
0
        static async Task CollectPdfs(String seleniumHost, String fileName, String exportDirectory)
        {
            if (!Directory.Exists(exportDirectory))
            {
                Directory.CreateDirectory(exportDirectory);
            }

            var service = new ServiceCollection().AddHttpClient().BuildServiceProvider();
            var gun     = new ShotGun(service.GetService <IHttpClientFactory>(),
                                      new PdfCreator(),
                                      new GunOptions($"{seleniumHost}/wd/hub"));


            var completeFileName = $"{DefaultFileCompletePrefix}-{fileName}";

            var completeLinks = new String[0];

            if (File.Exists(completeFileName))
            {
                completeLinks = await File.ReadAllLinesAsync(completeFileName);
            }
            else
            {
                File.Create(completeFileName);
            }

            var links = await File.ReadAllLinesAsync(fileName);

            links = links.Distinct()
                    .Except(completeLinks)
                    .ToArray();

            var options = new ShotOptions
            {
                Width       = 1024,
                StepHeight  = 754,
                ImageFormat = "png",
                IsGrayscale = true,
                OverlaySize = 23,
                TryMobile   = true,
                HideOverlayElementsImmediate = true
            };

            var index = 1;

            foreach (var link in links)
            {
                try
                {
                    options.Uri = new Uri(link);

                    var shot = await gun.ShotPdfAsync(options);

                    if (File.Exists($"{exportDirectory}/{shot.FileName}"))
                    {
                        Console.WriteLine($"Skip exist file : {shot.FileName}");
                        await File.AppendAllLinesAsync(completeFileName, new List <String> {
                            link
                        });

                        continue;
                    }

                    await File.WriteAllBytesAsync($"{exportDirectory}/{shot.FileName}", shot.Bytes);

                    await File.AppendAllLinesAsync(completeFileName, new List <String> {
                        link
                    });

                    Console.WriteLine($"{shot.FileName} is exported. {index++.ToString()}/{links.Length.ToString()}");
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception);
                }
            }
        }