Home > Blockchain >  Convert image byte array to PDF
Convert image byte array to PDF

Time:05-13

I'm looking to convert an Image (PNG, JPEG, GIF), in the form of a byte[] to a PDF.

I'm currently using this function, which works, but cuts off the bottom of images that over a certain height or specific proportions; for example 500x2000.
Where am I going wrong here?

public byte[] ConvertImageToPDF(byte[] bytes)
{
    byte[] pdfArray;
    using (var memoryStream = new MemoryStream())
    {
        using (var pdfWriter = new PdfWriter(memoryStream))
        {
            var pdf = new PdfDocument(pdfWriter);
            var document = new Document(pdf);
            ImageData imageData = ImageDataFactory.Create(bytes);
            document.Add(new Image(imageData));
            document.Close();
        }
        pdfArray = memoryStream.ToArray();
    }
    return pdfArray;
}

CodePudding user response:

I suppose what you want is the PdfWriter to auto-scale the Image inside the Document.
Optionally, position the Image in the center of the Page.

You can change your code setting [Image].SetAutoScale(true) and [Image].SetHorizontalAlignment(HorizontalAlignment.CENTER):

Note: I've defined aliases for iText.Layout.Properties (alias: PdfProperties) and iText.Layout.Element.Image (alias: PdfImage), to avoid conflict with other .Net assemblies that have classes and enumerators with the same exact names. Just remove them in case you don't need them at all.

using iText.IO.Image;
using iText.Kernel.Pdf;
using iText.Layout;
using PdfProperties = iText.Layout.Properties;
using PdfImage = iText.Layout.Element.Image;

public byte[] ConvertImageToPDF(byte[] imageBytes)
{
    using (var ms = new MemoryStream()) {
        using (var pdfWriter = new PdfWriter(ms)) {
            var pdf = new PdfDocument(pdfWriter);
            var document = new Document(pdf);

            var img = new PdfImage(ImageDataFactory.Create(imageBytes))
                .SetAutoScale(true)
                .SetHorizontalAlignment(PdfProperties.HorizontalAlignment.CENTER);

            document.Add(img);
            document.Close();
            pdf.Close();
            return ms.ToArray();
        }
    }
}

You can also specify the size, in floating point units, of the Image and use the [Image].ScaleToFit() method, to scale the Image within those bounds.
Here, using a PageSize set to PageSize.A4. You can of course set different measures.

using iText.Kernel.Geom;

// [...]
var document = new Document(pdf);

var page = document.GetPageEffectiveArea(PageSize.A4);
var img = new PdfImage(ImageDataFactory.Create(imageBytes))
    .ScaleToFit(page.GetWidth(), page.GetHeight())
    .SetHorizontalAlignment(PdfProperties.HorizontalAlignment.CENTER);

// [...]
  • Related