delete
delete

Reputation:

Adding an image to a PDF using iTextSharp and scale it properly

here's my code. It correctly adds the pictures I want and everything works except that the images are using their native resolution, so if the image is big it's being cropped to fit the page.

Is there some way to have the picture use like a Zoom feature to stretch to fit, but also maintain the aspect ratio? There has to be something I'm missing there. :P

Here's a picture to illustrate the problem: alt text

using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.Drawing;
using System.Collections.Generic;

namespace WinformsPlayground
{
    public class PDFWrapper
    {
        public void CreatePDF(List<System.Drawing.Image> images)
        {
            if (images.Count >= 1)
            {
                Document document = new Document(PageSize.LETTER);
                try
                {

                    // step 2:
                    // we create a writer that listens to the document
                    // and directs a PDF-stream to a file

                    PdfWriter.GetInstance(document, new FileStream("Chap0101.pdf", FileMode.Create));

                    // step 3: we open the document
                    document.Open();

                    foreach (var image in images)
                    {
                        iTextSharp.text.Image pic = iTextSharp.text.Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Jpeg);
                        document.Add(pic);
                        document.NewPage();
                    }
                }
                catch (DocumentException de)
                {
                    Console.Error.WriteLine(de.Message);
                }
                catch (IOException ioe)
                {
                    Console.Error.WriteLine(ioe.Message);
                }

                // step 5: we close the document
                document.Close();
            }
        }
    }
}

Upvotes: 31

Views: 169386

Answers (6)

As iTextSharp is EOL, and has been replaced by iText 7. The answers above are correct, but a little bit out of date. There is some solution for iText 7:

// Adding usings for image creation
using iText.IO.Image;
using iText.Layout.Element;

// Adding usings for document creation
using iText.Layout;
using iText.Pdfa;
using iText.Kernel.Pdf;

// Creating a PDF
//fileName is the name of the future PDF file
//filePath is the path where PDF file will be saved
PdfADocument pdf = new PdfADocument(
    new PdfWriter(fileName),
    PdfAConformanceLevel.PDF_A_1B,
    new PdfOutputIntent("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1",
    new FileStream(filePath, FileMode.Open, FileAccess.Read)));

//Creating a PDF document
var doc = new Document(pdf);

// Creating an ImageData object
// imageFilePath is a path to yours image file         
ImageData imageData = ImageDataFactory.Create(imageFilePath);              
  
// Creating an Image object        
Image image = new Image(imageData);                        
  
// Adding image to the document       
doc.Add(image); 

Upvotes: 0

Mạc Văn Cương
Mạc Văn Cương

Reputation: 27

image.SetAbsolutePosition(1,1);

Upvotes: 1

Alex
Alex

Reputation: 141

Personally, I use something close from fubo's solution and it works well:

image.ScaleToFit(document.PageSize);
image.SetAbsolutePosition(0,0);

Upvotes: 13

fubo
fubo

Reputation: 45947

image.ScaleToFit(500f,30f);

this method keeps the aspect ratio of the image

Upvotes: 5

delete
delete

Reputation:

I solved it using the following:

foreach (var image in images)
{
    iTextSharp.text.Image pic = iTextSharp.text.Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Jpeg);

    if (pic.Height > pic.Width)
    {
        //Maximum height is 800 pixels.
        float percentage = 0.0f;
        percentage = 700 / pic.Height;
        pic.ScalePercent(percentage * 100);
    }
    else
    {
        //Maximum width is 600 pixels.
        float percentage = 0.0f;
        percentage = 540 / pic.Width;
        pic.ScalePercent(percentage * 100);
    }

    pic.Border = iTextSharp.text.Rectangle.BOX;
    pic.BorderColor = iTextSharp.text.BaseColor.BLACK;
    pic.BorderWidth = 3f;
    document.Add(pic);
    document.NewPage();
}

Upvotes: 43

Hps
Hps

Reputation: 1177

You can try something like this:

      Image logo = Image.GetInstance("pathToTheImage")
      logo.ScaleAbsolute(500, 300)

Upvotes: 7

Related Questions