31

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();
            }
        }
    }
}

5 Answers5

43

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();
}
12

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

image.ScaleToFit(document.PageSize);
image.SetAbsolutePosition(0,0);
Alex
  • 131
  • 1
  • 2
  • 1
    wORKED FOR ME, except that I changed image.ScaleToFit(document.PageSize); to image.ScaleToFit(document.PageSize.Width,document.PageSize.Height); – Plexis Plexis Feb 26 '19 at 12:40
7

You can try something like this:

      Image logo = Image.GetInstance("pathToTheImage")
      logo.ScaleAbsolute(500, 300)
Hps
  • 1,177
  • 8
  • 9
  • So, in your case it will be: pic.ScaleAbsolute(width, height); – Hps Dec 01 '10 at 14:16
  • 2
    This method is no use because it's scales it absolute. It stretches the image and distorts it. I need a way to have it get bigger while maintaining aspect ratio and keeping within the document. –  Dec 01 '10 at 14:36
  • 4
    Here is an article about the image resolution in iTextSharp. I haven't used it. But you can try. http://www.mikesdotnetting.com/Article/87/iTextSharp-Working-with-images – Hps Dec 02 '10 at 04:01
  • article posted by @Hps helped me – Migs Aug 29 '16 at 19:10
4
image.ScaleToFit(500f,30f);

this method keeps the aspect ratio of the image

fubo
  • 44,811
  • 17
  • 103
  • 137
1
image.SetAbsolutePosition(1,1);
Dovydas Šopa
  • 2,282
  • 8
  • 26
  • 34