无法为图像itextsharp设置固定大小

时间:2013-07-10 10:56:15

标签: c# asp.net pdf itextsharp

我一直在使用iTextSharp来创建报告。我的报告中有许多不同大小的图像。尽管我缩放它们,但每个图像都会呈现不同的大小。我找到了许多解决方案但没有帮助。

我的代码:

PdfPCell InnerCell;
iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(Server.MapPath(@"images\Logo.png"));
logo.ScaleToFit(80f, 80f);
InnerCell.FixedHeight = 80f;
InnerCell = new PdfPCell(logo); 

我尝试将图像添加到块中,但图像将自身置于顶部。由于是动态报告,我无法在块中指定x和y值

InnerCell = new PdfPCell(new Phrase(new Chunk(logo, 0, 0))); 

我甚至试过this,但我无法获得固定的尺寸。

1 个答案:

答案 0 :(得分:6)

ScaleToFit(w,h)将根据源图像的宽度/高度中的较大者按比例缩放图像。缩放多个图像时,除非尺寸的比例都相同,否则最终会有不同的尺寸。这是设计的。

使用ScaleToFit(80,80)

  • 如果您的来源是一个100x100的正方形,那么您将获得80x80
  • 的正方形
  • 如果你的来源是一个200x100的矩形,你会得到一个80x40
  • 的矩形
  • 如果你的来源是一个100x200的矩形,你会得到一个40x80
  • 的矩形

无论出现什么,测量宽度和高度,至少有一个是您指定的尺寸之一。

我创建了一个创建随机大小图像的示例程序,它给了我图像中显示的预期输出(w = 80,h = 80,h = 80,h = 80,w = 80)

enter image description here

private void test() {
    //Output the file to the desktop
    var testFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
    //Standard PDF creation here, nothing special
    using (var fs = new FileStream(testFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
        using (var doc = new Document()) {
            using (var writer = PdfWriter.GetInstance(doc, fs)) {
                doc.Open();

                //Create a random number generator to create some random dimensions and colors
                var r = new Random();

                //Placeholders for the loop
                int w, h;
                Color c;
                iTextSharp.text.Image img;

                //Create 5 images
                for (var i = 0; i < 5; i++) {
                    //Create some random dimensions
                    w = r.Next(25, 500);
                    h = r.Next(25, 500);
                    //Create a random color
                    c = Color.FromArgb(r.Next(256), r.Next(256), r.Next(256));
                    //Create a random image
                    img = iTextSharp.text.Image.GetInstance(createSampleImage(w, h, c));
                    //Scale the image
                    img.ScaleToFit(80f, 80f);
                    //Add it to our document
                    doc.Add(img);
                }

                doc.Close();
            }
        }
    }
}

/// <summary>
/// Create a single solid color image using the supplied dimensions and color
/// </summary>
private static Byte[] createSampleImage(int width, int height, System.Drawing.Color color) {
    using (var bmp = new System.Drawing.Bitmap(width, height)) {
        using (var g = Graphics.FromImage(bmp)) {
            g.Clear(color);
        }
        using (var ms = new MemoryStream()) {
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            return ms.ToArray();
        }
    }
}

我认为你所寻找的是能够按比例缩放图像,但也有“大小”的图像,这意味着用透明或可能是白色像素填充其余像素。有关此问题的解决方案,请参阅this post