C# - Как конвертировать изображение в PDF (используя бесплатную библиотеку)

Я немного исследовал, но большинство ответов, которые я нашел, касаются использования iText, которое бесплатно только для авторов программного обеспечения с открытым исходным кодом.

Мой вопрос заключается в том, как использовать бесплатную (желательно ухоженную) библиотеку PDF для преобразования изображения в PDF. В частности, я использую Selenium для тестирования веб-страницы, и часть требований заключается в том, чтобы сохранить скриншот страницы результатов в формате PDF.

Что имею на данный момент:

        Screenshot screenshot = ((ITakesScreenshot)WebDriver).GetScreenshot();
        fileName =  filePath + fileName;

        screenshot.SaveAsFile($"{fileName}.png", ImageFormat.Png);

        // Convert to PDF and delete image
        // ?

2 ответа

Решение

Я придумал способ сделать это с помощью PDFSharp, надеюсь, будет полезен и для других.

        // Convert to PDF and delete image
        PdfHelper.Instance.SaveImageAsPdf($"{fileName}.png", $"{fileName}.pdf", 1000, true);

Новый класс:

using System.IO;
using PdfSharp.Drawing;
using PdfSharp.Pdf;  

public sealed class PdfHelper
{
    private PdfHelper()
    {
    }

    public static PdfHelper Instance { get; } = new PdfHelper();

    internal void SaveImageAsPdf(string imageFileName, string pdfFileName, int width = 600, bool deleteImage = false)
    {
        using (var document = new PdfDocument())
        {
            PdfPage page = document.AddPage();
            using (XImage img = XImage.FromFile(imageFileName))
            {
                // Calculate new height to keep image ratio
                var height = (int)(((double)width / (double)img.PixelWidth) * img.PixelHeight);

                // Change PDF Page size to match image
                page.Width = width;
                page.Height = height;

                XGraphics gfx = XGraphics.FromPdfPage(page);
                gfx.DrawImage(img, 0, 0, width, height);                
            }
            document.Save(pdfFileName);
        }

    if (deleteImage)            
        File.Delete(imageFileName);
    }
}

Быстрый и простой способ - создать HTML-файл и внедрить изображения в виде данных base64. Он будет более переносимым, чем PDF, и его можно будет легко распечатать в формате PDF.

Пример:

var driver = new FirefoxDriver();

// create new file
var file = File.CreateText(@"C:\temp\captures.html");
file.Write("<!DOCTYPE html><html><head></head><body width=\"600px\">");

// write image
file.Write("<img src=\"data:image/png;base64,");
file.Write(driver.GetScreenshot().AsBase64EncodedString);
file.Write("\">");

// close file
file.Write("</body></html>");
file.Close();

driver.Quit();
Другие вопросы по тегам